您現在的位置是:首頁 > 籃球

NETFILTERIPTABLES詳解

  • 由 冬日陽光Lee 發表于 籃球
  • 2021-08-30
簡介iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0REDIRECT:重定向資料報為目的為本地,和DNAT將目的地址修改為接到資料報的介面地址情況完全一樣

鏈名稱是什麼

自己的一些總結

NETFILTER/IPTABLES詳解伴隨著linux作業系統的發展,網路防火牆軟體已由2。0x支援的ipfwadm,到2。2x支援的 ipchains,發展為當今流行的iptables。作為公司網路構架的一個重要部分,iptables軟體的應用價值得到了充分的體現,對資料包過 濾、NAT轉發的功能非常強大。相對ipchains而言,更利於建立合理的規則鏈,概念的把握也更清晰。

要講iptables,必須先說一下netfilter構架。Netfilter是內置於linux2。4x及linux2。5x的一套構架,它是透過在 kernel中內嵌5個(僅ipv4)鉤子函式(hook)發揮作用。這些鉤子函式在資料報流過協議棧的幾個關鍵點被呼叫。透過設定,Kernel會註冊 一些使用到這些hook函式的模組,並在必要時呼叫模組的回撥函式,由這些回撥函式來處理相應資料,丟棄無用的、保留有用的或者也可更改源資料包的ip包 頭。而iptables只是建立在Netfilter下的一套資料匹配、過濾規則集合,一旦符合某一規則,立即執行相應的行動(action)。

以下是netfilter在ipv4中的構架:(極為重要)

(不好意思,以後再加。。。)

資料進入系統後,首先使用PREROUTING鉤子函式,然後核心自動檢視路由,選擇forward(轉發目的ip非本機)或input(目的ip為本 機)。如路由forward,則呼叫FORWARD鉤子函式;input,則呼叫INPUT鉤子函式。注意,一旦使用FORWARD,則資料不再進入 INPUTt函式中,反之亦然。若資料由伺服器發出,則進入OUTPUT函式中處理,最後與FORWARD函式處理後的資料一同進入 POSTROUTING鉤子函式。從整體上看,凡是進入伺服器網絡卡的資料包必定先要透過PREROUTING,凡從伺服器網絡卡出去的資料包必定最後透過 POSTROUTING。

使用iptables前,先要在核心中修改配置:

以下以linux-2。4。21核心為例:

1。cd /usr/src/linux

2。make menuconfig

3。選networking options->ip: Netfilter Configuration ->自選所需模組。

4。退出儲存。

Iptables使用語法:(見man iptables)

iptables [-t table] -[ADC] chain rule-specification [options]

iptables [-t table] -I chain [rulenum] rule-specification [options]

iptables [-t table] -R chain rulenum rule-specification [options]

iptables [-t table] -D chain rulenum [options]

iptables [-t table] -[LFZ] [chain] [options]

iptables [-t table] -N chain

iptables [-t table] -X [chain]

iptables [-t table] -P chain target [options]

iptables [-t table] -E old-chain-name new-chain-name

iptables使用3個預設表:filter,nat,mangle。其中filter為系統預設操作表。

Filter表用於防火牆設定,對匹配條件的資料包可以選擇access,drop,reject等的處理方式。Nat表用於網路地址轉發,可以將源、目 的ip地址轉變為指定的ip地址。Mangle表可以實現對資料報頭的修改或給資料報附上一些帶外資料,當前mangle表支援修改TOS位及設定skb 的nfmard欄位。但由於某些中間層裝置會忽略tos位的值,因此實際應用較少。

Iptables中的每個預設表都有相應的系統預設規則鏈,分別對應於以上所說的hook函式。Filter表中有 input,forward,output鏈;nat表中有prerouting,forward,postrouting鏈;mangle表中有 prerouting,output鏈。

Iptables可以建立自定義鏈,實際上他必須建立在系統預設的鏈的基礎上才能發揮作用,主要將相關聯的規則集集中描述到同一個自定義鏈中,使管理者日常維護的條理更清晰。

常用語法解釋:

iptables –t 表名 –A/I/D/R/ 鏈名 【匹配條件】 -j 行為

表名、鏈名不再重複,介紹一下“匹配條件”:

-p 指定協議(tcp/icmp/udp/。。。) etc。 –p icmp (可以視為載入了相應的處理模組)

-s 源地址(ip address/masklen) etc。 –s 10。1。2。0/24

-d 目的地址(ip address/masklen) etc。 –d 10。1。2。3/32

-i 資料報輸入介面 etc。 –I eth0

-o 資料報輸出介面 etc。 –o eth1

一些模組載入後,還可以進一步指定模組所支援的子選項,如:

iptables …… -p tcp –sport 80 …… -j ……

iptables …… -m mac –mac-source 00:11:22:33:44:55 …… -j ……

鑑於filter表的表述比較簡單,故不再敷述。以下介紹nat表。

Nat:Network Address Translation 網路地址轉換

linux以前的核心僅僅支援有限的NAT功能,被稱為偽裝(masquerade)。Netfilter則支援任何一種NAT。一般來講NAT可以分為源NAT和目的NAT。

源NAT在資料報經過postrouting時修改資料報的源地址。偽裝是一個特殊的SNAT。

目的NAT在資料報經過output或prerouting 時修改資料報目的地址。埠轉發和透明代理都是DNAT。

可以舉例說明:

iptables -t nat -A POSTROUTING –s 10。0。0。1/32 -j SNAT ——to-source 1。2。3。4

iptables –t nat –A PREROUTING –d 1。2。3。4 –j DNAT –to-destination 10。0。0。1

公司對iptables使用還包括:masquerade及redirect。

MASQUERADE:

用於具有動態IP地址的撥號連線的SNAT,類似於SNAT,但是如果連線斷開,所有的連線跟蹤資訊將被丟棄,而去使用重新連線以後的IP地址進行IP偽裝。我認為與常用路由器的PAT 功能相類似。

Etc。 iptables -t nat -A POSTROUTING -j MASQUERADE -o ppp0

REDIRECT:

重定向資料報為目的為本地,和DNAT將目的地址修改為接到資料報的介面地址情況完全一樣。

Etc。 iptables –t nat –A PREROUTING –s 10。0。0。0/24 –d ! localhost –dport 80 –j REDIRECT –to-port 3128

以上指定了到達非本機ip的其他http包,在剛進入伺服器時,更改資料包的目的ip為伺服器的ip,目的埠改為3128。我們配合squid的使用,可以實現使用者上網的透明代理。

Mangle表到目前的應用不很普遍,暫不介紹。

任何時候在任何nefilter規則鏈中,資料報都可以被排隊轉發到使用者空間去。實際的排隊是由核心模組來完成的(ip_queue。o)。

資料報被髮送給使用者空間程序。該程序能對資料報進行任何處理。處理結束以後,使用者程序可以將該資料報重新注入核心或者設定一個對資料報的目標動作(如丟棄等)。

這是netfilter的一個關鍵技術,使使用者程序可以進行復雜的資料報操作。從而減輕了核心空間的複雜度。使用者空間的資料報操作程序能很容易的適用ntfilter提供的稱為libipq的庫來進行開發。

最後,提醒諸位,最好將每一條iptables規則統一寫到/etc/sysconfig/iptables檔案中,iptables每次啟動時將讀取其中的指令碼,並一次性同時生效。單一的加入iptables規則將逐一生效,並重新整理整個規則鏈,處理多條規則時極不合理。

可以有命令:iptables-save 將當前啟用的所有規則寫入/etc/sysconfig/iptables檔案中。

Top