iptables的基礎知識-iptables包的轉發過程
iptables包的轉發過程:包在IPTABLES中如何走?
當一個包進入或者送出或者被轉發的時候,是依據什么呢?都會經過哪些表和哪些鏈呢?
iptabeles中內建有三個表,分別為MANGLE,NAT,FILTER,當為未指定規則表時,則默認為filter表,若要將rule加到其他表中,則要用-t來指明。
其中有個表叫mangle,這個詞難以表達,我只能把我理解的寫出來。意思就是,會對數據包的一些傳輸特性進行修改,在mangle表中允許的操作是TOS、TTL、MARK。也就是說,今后只要我們見到這個詞能理解它的作用就行了。
強烈建議你不要在這個表里做任何過濾,不管是DANT,SNAT或者Masquerade。
Nat表就是地址轉換了,可以做DNAT,SNAT,可做一對一,一對多,多對對轉換,該表有Prerouting 和 postrouting兩條規則鏈。DNAT操作主要用在這樣一種情況,你有一個合法的IP地址,要把對防火墻的訪問重定向到其他的機子上(比如DMZ)。也就是說,我們改變的是目的地址,以使包能重路由到某臺主機。SNAT改變包的源地址,這在極大程度上可以隱藏你的本地網絡或者DMZ等。一個很好的例子是我們知道防火墻的外部地址,但必須用這個地址替換本地網絡地址。有了這個操作,防火墻就能自動地對包做SNAT和De-SNAT(就是反向的SNAT),以使LAN能連接到Internet。如果使用類似192.168.0.0/24這樣的地址,是不會從Internet得到任何回應的。因為IANA定義這些網絡(還有其他的)為私有的,只能用于LAN內部。MASQUERADE的作用和SNAT完全一樣,只是計算機的負荷稍微多一點。因為對每個匹配的包,MASQUERADE都要查找可用的IP地址,而不象SNAT用的IP地址是配置好的。當然,這也有好處,就是我們可以使用通過PPP、PPPOE、SLIP等撥號得到的地址,這些地址可是由ISP的DHCP隨機分配的
Filter表就是我們最常用的了,iptables包過濾就靠這個了,系統默認建有三個鏈,INPUT,OUTPUT還有FORWARD,這個表用來進行封包過濾的處理(如:DROP,ACCEPT,LOG,REJECT,ULOG等),基本規則都建在這個表中。
注:所謂的鏈就是規則的集合,也可以自定義鏈
當數據包到達防火墻時,如果MAC地址符合,就會由內核里相應的驅動程序接收,然后會經過一系列操作,從而決定是發送給本地的程序,還是轉發給其他機子,還是其他的什么。
以本地為目標的iptables包(就是我們自己的機子了)
Step(步驟) Table(表) Chain(鏈) Comment(注釋)
1 在線路上傳輸(比如,Internet)
2 進入接口 (比如,eth0)
3 Mangle PREROUTING 這個鏈用來mangle數據包,比如改變TOS等
4 Nat PREROUTING 這個鏈主要用來做DNAT。不要在這個鏈做過慮操作,因為某些情況下包會溜過去。
5 路由判斷,比如,iptables包是發往本地的,還是要轉發的。
6 Mangle INPUT 在路由之后,被送往本地程序之前,mangle數據包。
7 Filter INPUT 所有以本地為目的的iptables包都要經過這個鏈,不管它們從哪兒來,對這些iptables包的過濾條件就設在這里。
8 到達本地程序了(比如,服務程序或客戶程序)
現在我們來看看源地址是本地器的包要經過哪些步驟:
以本地為源的iptables包
Step Table Chain Comment
1 本地程序(比如,服務程序或客戶程序)
2 路由判斷,要使用源地址,外出接口,還有其他一些信息。
3 mangle OUTPUT 在這兒可以mangle包。建議不要在這兒做過濾,可能有副作用哦。
4 nat OUTPUT 這個鏈對從防火墻本身發出的包進行DNAT操作。
5 filter OUTPUT 對本地發出的iptables包過濾。
6 mangle POSTROUTING 這條鏈主要在包DNAT之后(譯者注:作者把這一次DNAT稱作實際的路由,雖然在前面有一次路由。對于本地的包,一旦它被生成,就必須經過路由代碼的處理,但這個包具體到哪兒去,要由NAT代碼處理之后才能確定。所以把這稱作實際的路由。),離開本地之前,對iptables包 mangle。有兩種包會經過這里,防火墻所在機子本身產生的包,還有被轉發的包。
7 nat POSTROUTING 在這里做SNAT。但不要在這里做過濾,因為有副作用,而且有些iptables包是會溜過去的,即使你用了DROP策略。
8 離開接口(比如: eth0)
9 在線路上傳輸(比如,Internet)
在這個表中有個要注意的地方,從本機發出的包,要經過NAT 中的OUTPUT。
在這個例子中,我們假設一個iptables包的目的是另一個網絡中的一臺機子。讓我們來看看這個iptables包的旅程:
轉發iptables包
Step Table Chain Comment
1 在線路上傳輸(比如,Internet)
2 進入接口(比如, eth0)
3 mangle PREROUTING mangle數據包,,比如改變TOS等。
4 nat PREROUTING 這個鏈主要用來做DNAT。不要在這個鏈做過慮操作,因為某些情況下包會溜過去。稍后會做SNAT。
5 路由判斷,比如,包是發往本地的,還是要轉發的。
6 mangle FORWARD 包繼續被發送至mangle表的FORWARD鏈,這是非常特殊的情況才會用到的。在這里,包被mangle(還記得mangle的意思嗎)。這次mangle發生在最初的路由判斷之后,在***一次更改包的目的之前(譯者注:就是下面的FORWARD鏈所做的,因其過濾功能,可能會改變一些包的目的地,如丟棄包)。
7 filter FORWARD 包繼續被發送至這條FORWARD鏈。只有需要轉發的包才會走到這里,并且針對這些包的所有過濾也在這里進行。注意,所有要轉發的包都要經過這里,不管是外網到內網的還是內網到外網的。在你自己書寫規則時,要考慮到這一點。
8 mangle POSTROUTING 這個鏈也是針對一些特殊類型的包(譯者注:參考第6步,我們可以發現,在轉發包時,mangle表的兩個鏈都用在特殊的應用上)。這一步mangle是在所有更改包的目的地址的操作完成之后做的,但這時包還在本地上。
9 nat POSTROUTING 這個鏈就是用來做SNAT的,當然也包括Masquerade(偽裝)。但不要在這兒做過濾,因為某些包即使不滿足條件也會通過。
10 離開接口(比如: eth0)
11 又在線路上傳輸了(比如,LAN)
就如你所見的,包要經歷很多步驟,而且它們可以被阻攔在任何一條鏈上,或者是任何有問題的地方。所有要經防火墻轉發的包都要經過FORWARD鏈。
由上邊的表格和圖可以看出,iptables 處理包的流動,分述如下:
INPUT:只有要到本機的封包才會由 INPUT 處理,所以會讓來自內部網絡的封包無條件放行,而來自外部的封包則過濾,是否為回應包,若是則放行。
PREROUTING:需要轉送處理的封包由此處理,用來做目的地 IP 的翻譯(DNAT)。
FORWARD:源IP和目的IP都不是本機的,就要被轉發,所有要轉發的封包都在這里處理,這部分的過濾規則最為復雜。
POSTROUTING:轉發封包送出之前,先同過這個來進行源IP的翻譯(SNAT)。
OUTPUT:從本機發送出去的包都有此處理,通常放行所有封包。
從上邊看得出,對于iptables來說,是依據IP地址進行決策,也就是說包中的IP地址決定一個包的流向。
進入FORWRAD的一定不會進入到INPUT和OUTPUT。
在處理過程中如果符合某條規則將會進行處理,處理動作除有ACCEPT、REJECT、DROP、REDIRECT 和 MASQUERADE 外還有LOG、ULOG、DNAT、SNAT、MIRROR、QUEUE、RETURN、TOS、TTL、MARK 等。
我們可以使用< iptables save file > 將結果保存到指定文件中,然后用< iptables restore file > 將指定文件的內容加載,或者寫成腳本,然后執行腳本就可以了。我推薦使用腳本,因為可以使用shell編程,從而寫出強大,靈活的腳本來。iptables包的轉發過程就講到這里啦。
上一節:iptables中的ICMP 下一節:iptables規則
【編輯推薦】