iptables的狀態(tài)機(jī)制
本文節(jié)選自:
Linux安全應(yīng)用—構(gòu)建以防火墻為核心的安全管理系統(tǒng)
——NETFILTER/IPTABLES手冊(cè)
[文檔編號(hào) SS-ver001]
上海
電話:13817668606
聯(lián)系方式:little_eyes@citiz.net
互聯(lián)網(wǎng)址:暫無
1.6 狀態(tài)機(jī)制
狀態(tài)機(jī)制是iptables中較為特殊的一部分,這也是iptables和比較老的ipchains的一個(gè)比較大的區(qū)別之一,運(yùn)行狀態(tài)機(jī)制(連接跟蹤)的防火墻稱作帶有狀態(tài)機(jī)制的防火墻,以下簡(jiǎn)稱為狀態(tài)防火墻。狀態(tài)防火墻比非狀態(tài)防火墻要安全,因?yàn)樗试S我們編寫更嚴(yán)密的規(guī)則。
在iptables上一共有四種狀態(tài),分別被稱為NEW、ESTABLISHED、INVALID、RELATED,這四種狀態(tài)對(duì)于TCP、UDP、ICMP三種協(xié)議均有效。下面,我們來分別闡述四種狀態(tài)的特性。
- NEW:NEW說明這個(gè)包是我們看到的***個(gè)包。意思就是,這是conntrack模塊看到的某個(gè)連接的***個(gè)包,它即將被匹配了。比如,我們看到一個(gè)SYN 包,是我們所留意的連接的***個(gè)包,就要匹配它。
- ESTABLISHED: ESTABLISHED已經(jīng)注意到兩個(gè)方向上的數(shù)據(jù)傳輸,而且會(huì)繼續(xù)匹配這個(gè)連接的包。處于ESTABLISHED狀態(tài)的連接是非常容易理解的。只要發(fā)送并接到應(yīng)答,連接就是ESTABLISHED的了。一個(gè)連接要從NEW變?yōu)镋STABLISHED,只需要接到應(yīng)答包即可,不管這個(gè)包是發(fā)往防火墻的,還是要由防火墻轉(zhuǎn)發(fā)的。ICMP的錯(cuò)誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我們所發(fā)出的信息的應(yīng)答。
- RELATED: RELATED是個(gè)比較麻煩的狀態(tài)。當(dāng)一個(gè)連接和某個(gè)已處于ESTABLISHED狀態(tài)的連接有關(guān)系時(shí),就被認(rèn)為是RELATED的了。換句話說,一個(gè)連接要想是RELATED的,首先要有一個(gè)ESTABLISHED的連接。這個(gè)ESTABLISHED連接再產(chǎn)生一個(gè)主連接之外的連接,這個(gè)新的連接就是 RELATED的了,當(dāng)然前提是conntrack模塊要能理解RELATED。ftp是個(gè)很好的例子,F(xiàn)TP-data 連接就是和FTP-control有關(guān)聯(lián)的,如果沒有在iptables的策略中配置RELATED狀態(tài),F(xiàn)TP-data的連接是無法正確建立的,還有其他的例子,比如,通過IRC的DCC連接。有了這個(gè)狀態(tài),ICMP應(yīng)答、FTP傳輸、DCC等才能穿過防火墻正常工作。注意,大部分還有一些UDP協(xié)議都依賴這個(gè)機(jī)制。這些協(xié)議是很復(fù)雜的,它們把連接信息放在數(shù)據(jù)包里,并且要求這些信息能被正確理解。
- INVALID:INVALID說明數(shù)據(jù)包不能被識(shí)別屬于哪個(gè)連接或沒有任何狀態(tài)。有幾個(gè)原因可以產(chǎn)生這種情況,比如,內(nèi)存溢出,收到不知屬于哪個(gè)連接的ICMP錯(cuò)誤信息。一般地,我們DROP這個(gè)狀態(tài)的任何東西,因?yàn)榉阑饓φJ(rèn)為這是不安全的東西。
每個(gè)狀態(tài)相對(duì)于不同的第四層協(xié)議來講,稍微有些區(qū)別,對(duì)于TCP協(xié)議來說,當(dāng)防火墻收到***個(gè)數(shù)據(jù)包,也就是SYN報(bào)文時(shí),將該會(huì)話標(biāo)記為NEW狀態(tài),在系統(tǒng)的/proc/net/目錄下,可以查閱文件ip_conntrack,這是在內(nèi)存空間里存放防火墻當(dāng)前狀態(tài)表的臨時(shí)文件,對(duì)于NEW狀態(tài)的記錄如下:
tcp 6 117 SYN_SENT src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 [UNREPLIED] src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
從上面的記錄可以看出,SYN_SENT狀態(tài)被設(shè)置了,這說明連接已經(jīng)發(fā)出一個(gè)SYN包,但應(yīng)答還沒發(fā)送過來,這可從[UNREPLIED]標(biāo)志看出,當(dāng)服務(wù)器端回應(yīng)了SYN/ACK包后,狀態(tài)表改寫為:
tcp 6 57 SYN_RECV src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
現(xiàn)在我們已經(jīng)收到了相應(yīng)的SYN/ACK包,狀態(tài)也變?yōu)镾YN_RECV,這說明最初發(fā)出的SYN包已正確傳輸,并且SYN/ACK包也到達(dá)了防火墻。 這就意味著在連接的兩方都有數(shù)據(jù)傳輸,因此可以認(rèn)為兩個(gè)方向都有相應(yīng)的回應(yīng)。
接下來,TCP三次握手的隨后一個(gè)報(bào)文ACK包也到達(dá)了防火墻,防火墻上的狀態(tài)表變成了:
tcp 6 431999 ESTABLISHED src=192.168.1.5 dst=192.168.1.35 sport=1031 dport=23 src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 use=1
現(xiàn)在,我們來看看UDP協(xié)議的狀態(tài)描述方法,從協(xié)議本身的特性來看,UDP連接是無狀態(tài)的,因?yàn)樗鼪]有任何的連接建立和關(guān)閉過程。以某個(gè)順序收到的兩個(gè)數(shù)據(jù)包是無法確定它們的發(fā)出順序的。但內(nèi)核仍然可以對(duì)UDP連接設(shè)置狀態(tài)。我們來看看是如何跟蹤UDP連接的,以及在核心目錄 /proc/net/ip_conntrack的相關(guān)記錄。
當(dāng)***個(gè)UDP的數(shù)據(jù)包到達(dá)防火墻后,防火墻在他的狀態(tài)表中留下了這樣的記錄:
udp 17 20 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 [UNREPLIED] src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1
UNREPLIED代表這是一個(gè)狀態(tài)為NEW的數(shù)據(jù)包,當(dāng)這條連接的回應(yīng)數(shù)據(jù)包到達(dá)防火墻后,防火墻立即將修改這條狀態(tài)記錄:
udp 17 160 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 use=1
在這條新的狀態(tài)記錄中,UNREPLIED被刪除了,這代表現(xiàn)在防火墻已經(jīng)建立了一條UDP協(xié)議的會(huì)話,但這里并沒有象TCP協(xié)議那樣顯示 ESTABLISHED標(biāo)記,這是TCP的狀態(tài)記錄和UDP的狀態(tài)記錄稍微不同的一個(gè)地方,當(dāng)然,還有一個(gè)地方需要注意,在測(cè)試中,還需要有一些數(shù)據(jù)包經(jīng)過,防火墻才會(huì)將狀態(tài)記錄改寫成:
udp 17 179 src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 src=192.168.1.5 dst=192.168.1.2 sport=1025 dport=137 [ASSURED] use=1
ASSURED狀態(tài)表示當(dāng)前有數(shù)據(jù)在進(jìn)行傳輸,表面當(dāng)前連接的狀態(tài)是ACTIVE的。如果,在這個(gè)狀態(tài)下數(shù)據(jù)停止了傳輸,則這條記錄會(huì)有一個(gè)計(jì)時(shí)器,也就是記錄中的第三個(gè)字段,上面這條記錄的第三個(gè)字段是179,代表當(dāng)前的ASSURED狀態(tài)還能夠保持179秒,如果還有新的數(shù)據(jù)包經(jīng)過,那么計(jì)時(shí)器會(huì)被重新設(shè)置成缺省的180秒,如果在180秒內(nèi)都沒有流量,那么這條狀態(tài)記錄就會(huì)從狀態(tài)表中被刪除。
***,我們?cè)趤砜纯碙inux kernel是如何標(biāo)示ICMP協(xié)議的狀態(tài)的,ICMP也是一種無狀態(tài)協(xié)議,它只是用來控制而不是建立連接。ICMP包有很多類型,但只有四種類型有應(yīng)答包,它們是回顯請(qǐng)求和應(yīng)答(Echo request and reply),時(shí)間戳請(qǐng)求和應(yīng)答(Timestamp request and reply),信息請(qǐng)求和應(yīng)答(Information request and reply),還有地址掩碼請(qǐng)求和應(yīng)答(Address mask request and reply),這些包有兩種狀態(tài),NEW和ESTABLISHED 。時(shí)間戳請(qǐng)求和信息請(qǐng)求已經(jīng)廢除不用了,回顯請(qǐng)求還是常用的,比如ping命令就用的到,地址掩碼請(qǐng)求不太常用,但是可能有時(shí)很有用并且值得使用??纯聪旅娴膱D,就可以大致了解ICMP連接的NEW和ESTABLISHED狀態(tài)了。
如圖所示,主機(jī)向目標(biāo)發(fā)送一個(gè)回顯請(qǐng)求,防火墻就認(rèn)為這個(gè)包處于NEW狀態(tài)。目標(biāo)回應(yīng)一個(gè)回顯應(yīng)答,防火墻就認(rèn)為包處于ESTABLISHED了。當(dāng)回顯請(qǐng)求被發(fā)送時(shí),ip_conntrack里就有這樣的記錄了:
icmp 1 25 src=192.168.1.6 dst=192.168.1.10 type=8 code=0 id=33029 [UNREPLIED] src=192.168.1.10 dst=192.168.1.6 type=0 code=0 id=33029 use=1
可以看到,ICMP的記錄和TCP、UDP的有點(diǎn)區(qū)別,協(xié)議名稱、超時(shí)時(shí)間和源、目地址都一樣,不同之處在于沒有了端口,而新增了三個(gè)新的字段:type,code和id。字段type說明ICMP的類型。code說明ICMP的代碼,這些代碼在附錄ICMP類型里有說明。id是 ICMP包的ID。每個(gè)ICMP包被發(fā)送時(shí)都被分配一個(gè)ID,接受方把同樣的ID 分配給應(yīng)答包,這樣發(fā)送方能認(rèn)出是哪個(gè)請(qǐng)求的應(yīng)答。
[UNREPLIED] 的含義和前面一樣,說明數(shù)的傳輸只發(fā)生在一個(gè)方向上,也就是說未收到應(yīng)答。再往后,是應(yīng)答包的源、目地址,還有相應(yīng)的三個(gè)新字段,要注意的是type和 code是隨著應(yīng)答包的不同而變化的,id和請(qǐng)求包的一樣。和前面一樣,應(yīng)答包被認(rèn)為是ESTABLISHED的。然而,在應(yīng)答包之后,這個(gè)ICMP 連接就不再有數(shù)據(jù)傳輸了。所以,一旦應(yīng)答包穿過防火墻,ICMP的連接跟蹤記錄就被銷毀了。因此,要想在/proc/ip_conntrack文件中抓到 ICMP協(xié)議的狀態(tài)記錄實(shí)在不是一件容易的事。您可以用如下的命令來嘗試獲取這些記錄:
#cat /proc/net/ip_conntrack | grep icmp
如果沒有輸出,那么就不停的重復(fù)這個(gè)命令,直到發(fā)現(xiàn)icmp的記錄為止。
以上各種情況,請(qǐng)求被認(rèn)為NEW,應(yīng)答是ESTABLISHED。換句話說,就是當(dāng)防火墻看到一個(gè)請(qǐng)求包時(shí),就認(rèn)為連接處于NEW狀態(tài),當(dāng)有應(yīng)答時(shí),就是ESTABLISHED狀態(tài)。
---------------------------
state匹配:state匹配在防火墻配置過程中非常重要的,如果沒有state的配置,那么需要配置雙向的規(guī)則才能滿足通訊的需要,但防火墻既然有狀態(tài)檢測(cè)功能,我們?yōu)槭裁床缓煤檬褂盟兀?/p>
--state:state的狀態(tài)有四種,指定要匹配包的的狀態(tài),當(dāng)前有4種狀態(tài)可用:INVALID,ESTABLISHED,NEW和RELATED。四種數(shù)據(jù)包的狀態(tài)我們?cè)谇懊嬉呀?jīng)做了詳細(xì)的描述本節(jié)我們只進(jìn)行state的用法描述,如下例所示:
#iptables –A FORWARD –p tcp –m state --state RELATED,ESTABLISHED –j ACCEPT
本例表明凡是數(shù)據(jù)包狀態(tài)為“RELATED”、“ESTABLISHED”的tcp包允許通過防火墻。在一般情況下,基于狀態(tài)的策略都是配置在每一條 chain的最前面,因?yàn)楫?dāng)包被匹配到以后,就能夠直接被處理了,這是一種比較高效的配置方法。關(guān)鍵字ESTABLISHED比較容易理解,即匹配狀態(tài)為 “已經(jīng)建立連接”的數(shù)據(jù)包,那么怎么理解“RELATED”呢,RELATED表示不屬于已經(jīng)建立的那條連接,但和那條連接有關(guān),比如ftp,ftp在建立連接的過程中會(huì)首先建立一條ftp-control連接用以傳輸指令等,真正傳輸數(shù)據(jù)的是一條叫做ftp-data的連接,而傳輸數(shù)據(jù)的連接是和傳輸控制信號(hào)的連接相關(guān)的,因此“RELATED”是用于類似這些特殊服務(wù)的。在正常情況下,對(duì)于每一種協(xié)議:TCP、UDP、ICMP都可以單獨(dú)的配置狀態(tài)策略,但一種比較簡(jiǎn)單高效的做法是:
#iptables –A INPUT –p all –m state --state RELATED,ESTABLISHED –j ACCEPT
multiport:這個(gè)匹配選項(xiàng)為我們解決了如何在一條策略種匹配那些端口不連續(xù)的服務(wù),在一般情況下,一個(gè)公司或企業(yè)的安全策略是允許內(nèi)部網(wǎng)絡(luò)使用有限的Internet服務(wù),如收發(fā)電子郵件、上網(wǎng)瀏覽網(wǎng)頁、msn聊天等,看看下面的例子:
#iptables –A FORWARD –i eth0 –p tcp –m multiport --dports 25,80,110,443,1863 –j ACCEPT #iptables –A FORWARD –i eth0 –p udp --dport 53 –j ACCEPT
僅僅兩條命令就解決了內(nèi)部用戶上網(wǎng)收發(fā)E_mail、瀏覽網(wǎng)頁、使用msn聊天等需求,怎么樣,就這么簡(jiǎn)單~
【編輯推薦】
- 深入淺出Netfilter/iptables防火墻框架(基礎(chǔ)篇)
- 深入淺出Netfilter/iptables防火墻框架(入門篇)
- iptables實(shí)戰(zhàn)系列:公共網(wǎng)絡(luò)服務(wù)防火墻