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