iptables是一個Linux下優(yōu)秀的nat+防火墻工具,我使用該工具以較低配置的傳統(tǒng)pc配置了一個靈活強勁的防火墻+nat系統(tǒng),小有心得,看了網(wǎng)上也有很多這方面的文章,但是似乎要么說的比較少,要么就是比較偏,內(nèi)容不全,容易誤導(dǎo),我研究了一段時間的iptables同時也用了很久,有點滴經(jīng)驗,寫來供大家參考,同時也備日后自己翻閱。
首先要說明的是,iptables操作的是2.4以上內(nèi)核的netfilter.所以需要linux的內(nèi)核在2.4以上。其功能與安全性遠(yuǎn)遠(yuǎn)比其前輩ipfwadm,ipchains強大,iptables大致是工作在OSI七層的二、三、四層,其前輩ipchains不能單獨實現(xiàn)對tcp/udp port以及對mac地址的的定義與操作,所以我想ipchains應(yīng)該是僅僅工作在三層上的。
我們先簡單介紹一下netfilter的大致工作流程,也就是一個數(shù)據(jù)包(或者叫分組、packet,我個人習(xí)慣叫包)在到達(dá)linux的網(wǎng)絡(luò)接口的時候(網(wǎng)卡)如何處理這個包,然后再介紹一下如何用iptables改變或者說控制對這個數(shù)據(jù)包進(jìn)行操作。
netfilter內(nèi)部分為三個表,分別是filter,nat,mangle,每個表又有不同的操作鏈(Chains)。在filter(過濾)表中,也就是他的防火墻功能的這個表,定義了三個Chain,分別是INPUT,FORWARD,OUTPUT。也就是對包的入、轉(zhuǎn)發(fā)、出進(jìn)行定義的三個過濾鏈。對于這個filter表的操作和控制也是我們實現(xiàn)防火墻功能的一個重要手段;在nat(Network Address Translation、網(wǎng)絡(luò)地址翻譯)表中,也就是我們用以實現(xiàn)地址轉(zhuǎn)換和端口轉(zhuǎn)發(fā)功能的這個表,定義了PREROUTING,POSTROUTING,OUTPUT三個鏈,下面我們會對這三個鏈作詳細(xì)的說明;而netfilter的mangle表則是一個自定義表,里面包括上面的filter以及nat表中的各種chains,它可以讓我們進(jìn)行一些自定義的操作,同時這個mangle表中的chains在netfilter對包的處理流程中處在一個比較優(yōu)先的位置,下面有一張圖清晰的描繪了netfilter對包的處理流程(該圖摘自網(wǎng)上,不知作者是誰,在此深表敬意?。话闱闆r下,我們用不到這個mangle表,在這里我們就不做介紹了。
大家可以看到,PREROUTING這個chain在最前面,當(dāng)一個包來到linux的網(wǎng)絡(luò)接口的時候先過mangle的PREROUTING,然后是nat的PREROUTING,從這個chain的名字我們可以看出,這個chain是在路由之前(pre-routing)要過的。為什么要在路由之前過呢?大家可以看到這個圖上,上面有一個菱形的部分叫ROUTING,這個ROUTING部分就是Linux的route box,也就是路由系統(tǒng),它同樣有很高深的功能,可以實現(xiàn)策略路由等等一些高級特性,此處我們不做詳細(xì)解釋。單說這個PREROUTING鏈,因為在這個鏈里面我們對包的操作是DNAT,也就是改變目的地址和(或端口),通常用在端口轉(zhuǎn)發(fā),或者nat到內(nèi)網(wǎng)的DMZ區(qū),也就是說當(dāng)一個包過來的時候我們要改變它的目的地址,大家可以想想,如果一個包在改變目的地址之前就被扔進(jìn)了route box,讓系統(tǒng)選好路之后再改變目的地址,那么選路就可能是錯的,或者說毫無意義了,所以,PREROUTING這個Chain一定要在進(jìn)Routing之前做。比如說,我們的公網(wǎng)ip是60.1.1.1/24,位于linux中的eth0,內(nèi)網(wǎng)ip是10.1.1.1/24位于linux中的eth1,我們的內(nèi)網(wǎng)有一臺web服務(wù)器,地址是10.1.1.2/24,我們怎么樣能讓internet用戶通過這個公網(wǎng)ip訪問我們內(nèi)部的這個web服務(wù)器呢?我們就可以在這個PREROUTING鏈上面定義一個規(guī)則,把訪問60.1.1.1:80的用戶的目的地址改變一下,改變?yōu)?0.1.1.2:80,這樣就實現(xiàn)了internet用戶對內(nèi)網(wǎng)服務(wù)器的訪問了,當(dāng)然了,這個端口是比較靈活的,我們可以定義任何一個端口的轉(zhuǎn)發(fā),不一定是80-->80,具體的命令我們在下面的例子中介紹,這里我們只談流程與概念上的實現(xiàn)方法。
好了,我們接著往下走,這個包已經(jīng)過了兩個PREROUTING鏈了,這個時候,出現(xiàn)了一個分支轉(zhuǎn)折的地方,也就是圖中下方的那個菱形(FORWARD),轉(zhuǎn)發(fā)!這里有一個對目的地址的判斷(這里同樣說明了PREROUTING一定要在最先,不僅要在routebox之前,甚至是這個對目的地址的判斷之前,因為我們可能做一個去某某某ip的地方轉(zhuǎn)到自己的ip的規(guī)則,所以PREROUTING是最先處理這個包的Chain)!如果包的目的地是本機ip,那么包向上走,走入INPUT鏈處理,然后進(jìn)入LOCAL PROCESS,如果非本地,那么就進(jìn)入FORWARD鏈進(jìn)行過濾,我們在這里就不介紹INPUT,OUTPUT的處理了,因為那主要是對于本機安全的一種處理,我們這里主要說對轉(zhuǎn)發(fā)的過濾和nat的實現(xiàn)。
這里的FORWARD我簡單說一下,當(dāng)linux收到了一個目的ip地址不是本地的包,Linux會把這個包丟棄,因為默認(rèn)情況下,Linux的三層包轉(zhuǎn)發(fā)功能是關(guān)閉的,如果要讓我們的linux實現(xiàn)轉(zhuǎn)發(fā),則需要打開這個轉(zhuǎn)發(fā)功能,可以改變它的一個系統(tǒng)參數(shù),使用sysctl net.ipv4.ip_forward=1或者echo "1" > /proc/sys/net/ipv4/ip_forward命令打開轉(zhuǎn)發(fā)功能。好了,在這里我們讓linux允許轉(zhuǎn)發(fā),這個包的目的地址也不是本機,那么它將接著走入FORWARD鏈,在FORWARD鏈里面,我們就可以定義詳細(xì)的規(guī)則,也就是是否允許他通過,或者對這個包的方向流程進(jìn)行一些改變,這也是我們實現(xiàn)訪問控制的地方,這里同樣也是Mangle_FORWARD然后filter_FORWARD,我們操作任何一個鏈都會影響到這個包的命運,在下面的介紹中,我們就忽略掉mangle表,我們基本用不到操作它,所以我們假設(shè)它是透明的。假設(shè)這個包被我們的規(guī)則放過去了,也就是ACCEPT了,它將進(jìn)入POSTROUTING部分,注意!這里我注意到一個細(xì)節(jié)問題,也就是上面的圖中數(shù)據(jù)包過了FORWARD鏈之后直接進(jìn)入了POSTROUITNG鏈,我覺得這中間缺少一個環(huán)節(jié),也就是route box,對于轉(zhuǎn)發(fā)的包來說,linux同樣需要在選路(路由)之后才能將它送出,這個圖卻沒有標(biāo)明這一點,我認(rèn)為它是在過了route box之后才進(jìn)入的POSTROUITNG,當(dāng)然了,這對于我們討論iptables的過濾轉(zhuǎn)發(fā)來說不是很重要,只是我覺得流程上有這個問題,還是要說明一下。同樣的,我們在這里從名字就可以看出,這個POSTROUTING鏈應(yīng)該是路由之后的一個鏈,也就是這個包要送出這臺Linux的最后一個環(huán)節(jié)了,這也是極其重要的一個環(huán)節(jié)??!這個時候linux已經(jīng)完成(has done..^_^)了對這個包的路由(選路工作),已經(jīng)找到了合適的接口送出這個包了,在這個鏈里面我們要進(jìn)行重要的操作,就是被Linux稱為SNAT的一個動作,修改源ip地址!為什么修改源ip地址?很多情況需要修改源地址阿,最常見的就是我們內(nèi)網(wǎng)多臺機器需要共享一個或幾個公網(wǎng)ip訪問internet,因為我們的內(nèi)網(wǎng)地址是私有的,假如就讓linux給路由出去,源地址也不變,這個包應(yīng)該能訪問到目的地,但是卻回不來,因為internet上的N多個路由節(jié)點不會轉(zhuǎn)發(fā)私有地址的數(shù)據(jù)包,也就是說,不用合法ip,我們的數(shù)據(jù)包有去無回。有人會說:“既然是這樣,我就不用私有ip了,我自己分配自己合法的地址不行嗎?那樣包就會回來了吧?”答案是否定的,ip地址是ICANN來分配的,你的數(shù)據(jù)包或許能發(fā)到目的地,但是回來的時候人家可不會轉(zhuǎn)到你那里,internet上的路由器中的路由信息會把這個返回包送到那個合法的獲得ip的地方去,你同樣收不到,而你這種行為有可能被定義為一種ip欺騙,很多設(shè)備會把這樣的包在接入端就給濾掉了,可能都到不了你要訪問的那個服務(wù)器,呵呵。
那么Linux如何做SNAT呢?比如一個內(nèi)網(wǎng)的10.1.1.11的pc訪問202.2.2.2的一個web服務(wù)器,linux的內(nèi)網(wǎng)接口10.1.1.1在收到這個包之后把原來的PC的ip10.1.1.11改變?yōu)?0.1.1.1的合法地址然后送出,同時在自己的ip_conntrack表里面做一個記錄,記住是內(nèi)網(wǎng)的哪一個ip的哪個端口訪問的這個web服務(wù)器,自己把它的源地址改成多少了,端口改成多少了,以便這個web服務(wù)器返回數(shù)據(jù)包的時候linux將它準(zhǔn)確的送回給發(fā)送請求的這個pc.
大體的數(shù)據(jù)轉(zhuǎn)發(fā)流程我們說完了,我們看看iptables使用什么樣的參數(shù)來完成這些操作。在描述這些具體的操作之前,我還要說幾個我對iptables的概念的理解(未必完全正確),這將有助于大家理解這些規(guī)則,以實現(xiàn)更精確的控制。上文中我們提到過,對包的控制是由我們在不同的Chain(鏈)上面添加不同的規(guī)則來實現(xiàn)的,比如我們對過濾表(filter table)添加規(guī)則來執(zhí)行對包的操控。那么既然叫鏈,一定就是一條或者多條規(guī)則組成的了,這時就有一個問題了,如果多個規(guī)則對同一種包進(jìn)行了定義,會發(fā)生什么事情呢?在Chain中,所有的規(guī)則都是從上向下來執(zhí)行的,也就是說,如果匹配了第一行,那么就按照第一行的規(guī)則執(zhí)行,一行一行的往下找,直到找到符合這個類型的包的規(guī)則為止。如果找了一遍沒有找到符合這個包的規(guī)則怎么辦呢?itpables里面有一個概念,就是Policy,也就是策略。一說這個東西大家可能就會覺得比較麻煩,什么策略阿,我對于它的理解就是所謂這個策略就是chain中的最后一條規(guī)則,也就是說如果找了一遍找不到符合處理這個包的規(guī)則,就按照policy來辦。這樣理解起來就容易多了。iptables 使用-P來設(shè)置Chain的策略。
好了,我們言歸正傳,來說說iptables到底怎樣實現(xiàn)對包的控制。
先介紹一下iptables如何操作鏈:
對鏈的操作就那么幾種,-I(插入) -A(追加) -R(替換) -D(刪除) -L(列表顯示)這里要說明的就是-I將會把規(guī)則放在第一行,-A將會放在最后一行。比如我們要添加一個規(guī)則到filter表的FORWARD鏈
iptables -t filter -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT
上面的命令意思為:追加一個規(guī)則至filter表中的FORWARD鏈尾,允許(-j ACCEPT)源地址為10.1.1.11目的地址為202.1.1.1的數(shù)據(jù)包通過。其中-t后面跟的是表名,在-A后面跟Chain名,后面的小寫的-s為源地址,-d為目的地址,-j為處理方向。
在iptables中,默認(rèn)的表名就是filter,所以這里可以省略-t filter直接寫成:iptables -A FORWARD -s 10.1.1.11 -d 202.1.1.1 -j ACCEPT
iptables中的匹配參數(shù):
我們在這里就介紹幾種常用的參數(shù),詳細(xì)地用法可以man iptables看它的聯(lián)機文檔,你會有意外的收獲。
-s匹配源地址
-d匹配目的地址
-p協(xié)議匹配
-i入接口匹配
-o出接口匹配
--sport,--dport源和目的端口匹配
-j跳轉(zhuǎn),也就是包的方向
其中還有一個!參數(shù),使用!就是取反的意思。下面我們簡單舉幾個例子介紹一下。
-s這個參數(shù)呢就是指定源地址的,如果使用這個參數(shù)也就是告訴netfilter,對于符合這樣一個源地址的包怎么去處理,可以指定某一個單播ip地址,
也可以指定一個網(wǎng)絡(luò),如果單個的ip地址其實隱含了一個32位的子網(wǎng)掩碼,比如-s 10.1.1.11 其實就是-s 10.1.1.11/32
同樣我們可以指定不同的掩碼用以實現(xiàn)源網(wǎng)絡(luò)地址的規(guī)則,比如一個C類地址我們可以用-s 10.1.1.0/24來指定。
-d參數(shù)與-s格式一樣。
-i參數(shù)是指定入接口的網(wǎng)絡(luò)接口,比如我僅僅允許從eth3接口過來的包通過FORWARD鏈,就可以這樣指定iptables -A FORWARD -i eth3 -j ACCEPT
-o是出接口,與上同.
我們下面用一些簡單的實例來step by step看看iptables的具體配置方法。
實例一:簡單的nat路由器
環(huán)境介紹:
linux 2.4 +
2個網(wǎng)絡(luò)接口
Lan口:10.1.1.254/24 eth0
Wan口:60.1.1.1/24 eth1
目的:實現(xiàn)內(nèi)網(wǎng)中的節(jié)點(10.1.1.0/24)可控的訪問internet。
首先將Lan的節(jié)點pc的網(wǎng)關(guān)指向10.1.1.254
確定你的linux的ip配置無誤,可以正確的ping通內(nèi)外的地址。同時用route命令查看linux的本地路由表,確認(rèn)指定了可用的ISP提供的默認(rèn)網(wǎng)關(guān)。
使用sysctl net.ipv4.ip_forward=1打開linux的轉(zhuǎn)發(fā)功能。
iptables -P FORWARD DROP
將FORWARD鏈的策略設(shè)置為DROP,這樣做的目的是做到對內(nèi)網(wǎng)ip的控制,你允許哪一個訪問internet就可以增加一個規(guī)則,不在規(guī)則中的ip將無法訪問internet.
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
這條規(guī)則規(guī)定允許任何地址到任何地址的確認(rèn)包和關(guān)聯(lián)包通過。一定要加這一條,否則你只允許lan IP訪問沒有用,至于為什么,下面我們再詳細(xì)說。
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT --to 60.1.1.1
這條規(guī)則做了一個SNAT,也就是源地址轉(zhuǎn)換,將來自10.1.1.0/24的地址轉(zhuǎn)換為60.1.1.1
有這幾條規(guī)則,一個簡單的nat路由器就實現(xiàn)了。這時你可以將允許訪問的ip添加至FORWARD鏈,他們就能訪問internet了。
比如我想讓10.1.1.9這個地址訪問internet,那么你就加如下的命令就可以了。
iptables -A FORWARD -s 10.1.1.9 -j ACCEPT
也可以精確控制他的訪問地址,比如我就允許10.1.1.99訪問3.3.3.3這個ip
iptables -A FORWARD -s 10.1.1.99 -d 3.3.3.3 -j ACCEPT
或者只允許他們訪問80端口。
iptables -A FORWARD -s 10.1.1.0/24 -p tcp --dport http -j ACCEPT
更多的控制可以自己靈活去做,或者查閱iptables的聯(lián)機文檔。
實例二:端口轉(zhuǎn)發(fā)
環(huán)境介紹:
linux 2.4 +
2個網(wǎng)絡(luò)接口
Lan口:10.1.1.254/24 eth0
Lan內(nèi)web server: 10.1.1.1:80
Lan內(nèi)ftp server: 10.1.1.2:21
Wan口:60.1.1.1/24 eth1
目的:對內(nèi)部server進(jìn)行端口轉(zhuǎn)發(fā)實現(xiàn)internet用戶訪問內(nèi)網(wǎng)服務(wù)器
同樣確認(rèn)你的linux的各項配置正常,能夠訪問內(nèi)外網(wǎng)。
iptables -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
也需要加入確認(rèn)包和關(guān)聯(lián)包的允許通過
如果你要把訪問60.1.1.1:80的數(shù)據(jù)包轉(zhuǎn)發(fā)到Lan內(nèi)web server,用下面的命令
iptables -t nat -A PREROUTING -d 60.1.1.1 -p tcp --dport 80 -j DNAT --to 10.1.1.1:80
ftp服務(wù)也同樣,命令如下:
iptables -t nat -A PREROUTING -d 60.1.1.1 -p tcp --dport 21 -j DNAT --to 10.1.1.2:21
好了,命令完成了,端口轉(zhuǎn)發(fā)也做完了,本例能不能轉(zhuǎn)發(fā)呢?不能,為什么呢?我下面詳細(xì)分析一下。對于iptables好像往外訪問的配置比較容易,而對內(nèi)
的轉(zhuǎn)發(fā)似乎就有一些問題了,在一開始的時候我就先說了一些關(guān)于netfilter的流程問題,那么我就簡單說說做了這些配置之后為什么有可能還不行呢?
能引起這個配置失敗的原因有很多,我們一個個的來說:
第一,本例中,我們的FORWARD策略是DROP,那么也就是說,沒有符合規(guī)則的包將被丟棄,不管內(nèi)到外還是外到內(nèi),我們在這里依然不討論那個確認(rèn)包和關(guān)聯(lián)包的問題,我們不用考慮他的問題,下面我會詳細(xì)說一下這個東西,那么如何讓本例可以成功呢?加入下面的規(guī)則。
iptables -A FORWARD -d 10.1.1.1 -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 21 -j ACCEPT
有沒有覺得有一些暈?為什么目的地址是10.xxx而不是60.xxx人家internet用戶不是訪問的60.xxx嗎?呵呵,回到上面看看那個圖吧,F(xiàn)ORWARD鏈在什么位置上,它是在PREROUTING之后,也就是說當(dāng)這個包到達(dá)FORWARD鏈的時候,目的地址已經(jīng)變成10.xxx了,假如internet用戶的請求是這樣202.1.1.1:1333-->60.1.1.1:80,在經(jīng)過了我們的PREROUTING鏈之后將變成202.1.1.1:1333-->10.1.1.1:80,這個時候如果你設(shè)置一個目的地址為60.xxx的規(guī)則有用嗎?呵呵,這是問題一。這個時候應(yīng)該可以完成端口轉(zhuǎn)發(fā)的訪問了,但是有一些時候還是不行?為什么?看問題二。
第二,內(nèi)網(wǎng)server的ip配置問題,這里我們以web server為例說明一下(ftp情況有一些特殊,下面我們再詳細(xì)討論,說確認(rèn)包和關(guān)聯(lián)包的時候討論這個問題),上面說到,有的時候可以訪問了,有的時候卻不行,就是這個web server的ip設(shè)置問題了,如果web server沒有指定默認(rèn)的網(wǎng)關(guān),那么在作了上面的配置之后,web server會收到internet的請求,但是,他不知道往哪里回啊,人家的本地路由表不知道你那個internet的ip,202.1.1.1該怎么走。如果你使用截包工具在web server上面察看,你會發(fā)現(xiàn)server收到了來自202.1.1.1:1333-->10.1.1.1:80的請求,由于你沒有給web server配置默認(rèn)網(wǎng)關(guān),它不知道怎么回去,所以就出現(xiàn)了不通的情況。怎么辦呢?
兩個解決方法:
一就是給這個server配置一個默認(rèn)網(wǎng)關(guān),當(dāng)然要指向這個配置端口轉(zhuǎn)發(fā)的linux,本例是10.1.1.254,配置好了,就一定能訪問了。有一個疑問?難道不需要在FORWARD鏈上面設(shè)置一個允許web server的ip地址訪問外網(wǎng)的規(guī)則嗎?它的包能出去?答案是肯定的,能出去。因為我們那一條允許確認(rèn)包與關(guān)聯(lián)包的規(guī)則,否則它是出不去的。
第二種方法,比較麻煩一些,但是對服務(wù)器來說這樣似乎更安全一些。方法就是對這個包再作一次SNAT,也就是在POSTROUTING鏈上添加規(guī)則。命令如下:
iptables -t nat -A POSTROUTING -d 10.1.1.1 -p tcp --dport 80 -j SNAT --to 10.1.1.254
ftp的方法相同。這條命令不太好懂??其實很簡單,如果使用這條命令,那么你的web server不需要再設(shè)置默認(rèn)網(wǎng)關(guān),就能收到這個請求,只要他和linux的lan ip地址是能互訪的(也就是說web server和Linux的Lan ip在一個廣播域),我們在根據(jù)上面的netfilter流程圖來分析這個包到底被我們怎么樣了,首先一個請求202.1.1.1:1333-->60.1.1.1:80被linux收到了,進(jìn)入PREROUTING,發(fā)現(xiàn)一個規(guī)則(iptables -t nat -A PREROUTING -d 60.1.1.1 -p tcp --dport 80 -j DNAT --to 10.1.1.1:80)符合,好了,改你的目的地址,于是這個包變成了202.1.1.1:1333-->10.1.1.1:80,繼續(xù)往前走,進(jìn)入FORWARD鏈,okay,也有一條規(guī)則允許通過(iptables -A FORWARD -d 10.1.1.1 -p tcp --dport 80 -j ACCEPT),進(jìn)入route box選路,找到合適的路徑了,繼續(xù)進(jìn)入POSTROUTING鏈,耶?又發(fā)現(xiàn)一個符合的規(guī)則(iptables -t nat -A POSTROUTING -d 10.1.1.1 -p tcp --dport 80 -j SNAT --to 10.1.1.254),原來是一個SNAT,改你的源地址,于是這個包變成了10.1.1.254:xxxx-->10.1.1.1:80。為什么用xxxx了,這里的端口是隨機的,我也不知道會是什么。而整個的兩次變化的過程都會記錄在linux的ip_conntrack中,當(dāng)web server收到這個包的時候,發(fā)現(xiàn),原來是一個內(nèi)網(wǎng)自己兄弟來的請求阿,又在一個廣播域,不用找網(wǎng)關(guān),把返回包直接扔給交換機了,linux在收到返回包之后,會根據(jù)他的ip_conntrack中的條目進(jìn)行兩次變換,返回真正的internet用戶,于是完成這一次的訪問。
看了上面的兩個例子,不知道大家是否清楚了iptables的轉(zhuǎn)發(fā)流程,希望對大家有所幫助,下面我們就說說我一直在上面提到的關(guān)于那個ESTABLISHED,RELATED的規(guī)則是怎么回事,到底有什么用處。說這個東西就要簡單說一下網(wǎng)絡(luò)的數(shù)據(jù)通訊的方式,我們知道,網(wǎng)絡(luò)的訪問是雙向的,也就是說一個Client與Server之間完成數(shù)據(jù)交換需要雙方的發(fā)包與收包。在netfilter中,有幾種狀態(tài),也就是new,established,related,invalid。當(dāng)一個客戶端,在本文例一中,內(nèi)網(wǎng)的一臺機器訪問外網(wǎng),我們設(shè)置了規(guī)則允許他出去,但是沒有設(shè)置允許回來的規(guī)則阿,怎么完成訪問呢?這就是netfilter的狀態(tài)機制,當(dāng)一個lan用戶通過這個linux訪問外網(wǎng)的時候,它發(fā)送了一個請求包,這個包的狀態(tài)是new,當(dāng)外網(wǎng)回包的時候他的狀態(tài)就是established,所以,linux知道,哦,這個包是我的內(nèi)網(wǎng)的一臺機器發(fā)出去的應(yīng)答包,他就放行了。而外網(wǎng)試圖對內(nèi)發(fā)起一個新的連接的時候,他的狀態(tài)是new,所以linux壓根不去理會它。這就是我們?yōu)槭裁匆舆@一句的原因。還有那個related,他是一個關(guān)聯(lián)狀態(tài),什么會用到呢?tftp,ftp都會用到,因為他們的傳輸機制決定了,它不像http訪問那樣,Client_IP:port-->server:80 然后server:80-->Client_IP:port,ftp使用tcp21建立連接,使用20端口發(fā)送數(shù)據(jù),其中又有兩種方式,一種主動active mode,一種被動passive mode,主動模式下,client使用port命令告訴server我用哪一個端口接受數(shù)據(jù),然后server主動發(fā)起對這個端口的請求。被動模式下,server使用port命令告訴客戶端,它用那個端口監(jiān)聽,然后客戶端發(fā)起對他的數(shù)據(jù)傳輸,所以這對于一個防火墻來說就是比較麻煩的事情,因為有可能會有new狀態(tài)的數(shù)據(jù)包,但是它又是合理的請求,這個時候就用到這個related狀態(tài)了,他就是一種關(guān)聯(lián),在linux中,有個叫ftp_conntrack的模塊,它能識別port命令,然后對相應(yīng)的端口進(jìn)行放行。
一口氣寫了這么多東西,不知道質(zhì)量如何,大家湊和著看吧,希望多多交流共同進(jìn)步,我還是一個linux的初學(xué)者,難免很多謬誤,希望高手賜教指正,以期不斷進(jìn)步。
對了,還有幾個在實際中比較實用(也比較受用:-))的命令參數(shù),寫出來供大家參考
iptables -L -n
這樣的列表會跳過linux的domain lookup,有的時候使用iptables
-L會比較慢,因為linux會嘗試解析ip的域名,真是羅嗦,如果你的dns server比較不爽的話,iptables -L就會讓你很不爽,加一個-n參數(shù)就好了。列表刷的就出來。當(dāng)然了,如果你的linux就是做防火墻,建議把nameserver去掉,在/etc/resolve.conf里面,因為有時候使用route命令也會比較慢列出來,很是不爽。
iptables -L -v
這個命令會顯示鏈中規(guī)則的包和流量計數(shù),嘿嘿,看看哪些小子用的流量那么多,用tc限了他。
cat /proc/net/ip_conntrack
查看目前的conntrack,可能會比較多哦,最好加一個|grep "關(guān)鍵字",看看你感興趣的鏈接跟蹤
wc -l /proc/net/ip_conntrack
看看總鏈接有多少條。
iptables-save >/etc/iptables
把當(dāng)前的所有鏈備份一下,之所以放到/etc下面叫iptables,因為這樣重起機器的時候會自動加載所有的鏈,經(jīng)常地備份一下吧,否則如果鏈多,萬一掉電重啟,你還是會比較痛苦。
更多詳細(xì)的內(nèi)容,大家可以去www.看看它的官方文檔,或許會對你有很大的幫助。
轉(zhuǎn)自zhangtiancheng@gmail.com