您好,登錄后才能下訂單哦!
這篇文章給大家介紹iptables的狀態(tài)機(jī)制如何分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
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é)議均有效。下面,我們來(lái)分別闡述四種狀態(tài)的特性。
NEW:NEW說(shuō)明這個(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的了。換句話說(shuō),一個(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)的,如果沒(méi)有在iptables的策略中配置RELATED狀態(tài),F(xiàn)TP-data的連接是無(wú)法正確建立的,還有其他的例子,比如,通過(guò)IRC的DCC連接。有了這個(gè)狀態(tài),ICMP應(yīng)答、FTP傳輸、DCC等才能穿過(guò)防火墻正常工作。注意,大部分還有一些UDP協(xié)議都依賴這個(gè)機(jī)制。這些協(xié)議是很復(fù)雜的,它們把連接信息放在數(shù)據(jù)包里,并且要求這些信息能被正確理解。
INVALID:INVALID說(shuō)明數(shù)據(jù)包不能被識(shí)別屬于哪個(gè)連接或沒(méi)有任何狀態(tài)。有幾個(gè)原因可以產(chǎn)生這種情況,比如,內(nèi)存溢出,收到不知屬于哪個(gè)連接的ICMP錯(cuò)誤信息。一般地,我們DROP這個(gè)狀態(tài)的任何東西,因?yàn)榉阑饓φJ(rèn)為這是不安全的東西。
每個(gè)狀態(tài)相對(duì)于不同的第四層協(xié)議來(lái)講,稍微有些區(qū)別,對(duì)于TCP協(xié)議來(lái)說(shuō),當(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è)置了,這說(shuō)明連接已經(jīng)發(fā)出一個(gè)SYN包,但應(yīng)答還沒(méi)發(fā)送過(guò)來(lái),這可從[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,這說(shuō)明最初發(fā)出的SYN包已正確傳輸,并且SYN/ACK包也到達(dá)了防火墻。 這就意味著在連接的兩方都有數(shù)據(jù)傳輸,因此可以認(rèn)為兩個(gè)方向都有相應(yīng)的回應(yīng)。
接下來(lái),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)在,我們來(lái)看看UDP協(xié)議的狀態(tài)描述方法,從協(xié)議本身的特性來(lái)看,UDP連接是無(wú)狀態(tài)的,因?yàn)樗鼪](méi)有任何的連接建立和關(guān)閉過(guò)程。以某個(gè)順序收到的兩個(gè)數(shù)據(jù)包是無(wú)法確定它們的發(fā)出順序的。但內(nèi)核仍然可以對(duì)UDP連接設(shè)置狀態(tài)。我們來(lá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ì)話,但這里并沒(méi)有象TCP協(xié)議那樣顯示 ESTABLISHED標(biāo)記,這是TCP的狀態(tài)記錄和UDP的狀態(tài)記錄稍微不同的一個(gè)地方,當(dāng)然,還有一個(gè)地方需要注意,在測(cè)試中,還需要有一些數(shù)據(jù)包經(jīng)過(guò),防火墻才會(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)過(guò),那么計(jì)時(shí)器會(huì)被重新設(shè)置成缺省的180秒,如果在180秒內(nèi)都沒(méi)有流量,那么這條狀態(tài)記錄就會(huì)從狀態(tài)表中被刪除。
***,我們?cè)趤?lái)看看Linux kernel是如何標(biāo)示ICMP協(xié)議的狀態(tài)的,ICMP也是一種無(wú)狀態(tài)協(xié)議,它只是用來(lái)控制而不是建立連接。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í)間和源、目地址都一樣,不同之處在于沒(méi)有了端口,而新增了三個(gè)新的字段:type,code和id。字段type說(shuō)明ICMP的類型。code說(shuō)明ICMP的代碼,這些代碼在附錄ICMP類型里有說(shuō)明。id是 ICMP包的ID。每個(gè)ICMP包被發(fā)送時(shí)都被分配一個(gè)ID,接受方把同樣的ID 分配給應(yīng)答包,這樣發(fā)送方能認(rèn)出是哪個(gè)請(qǐng)求的應(yīng)答。
[UNREPLIED] 的含義和前面一樣,說(shuō)明數(shù)的傳輸只發(fā)生在一個(gè)方向上,也就是說(shuō)未收到應(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)答包穿過(guò)防火墻,ICMP的連接跟蹤記錄就被銷毀了。因此,要想在/proc/ip_conntrack文件中抓到 ICMP協(xié)議的狀態(tài)記錄實(shí)在不是一件容易的事。您可以用如下的命令來(lái)嘗試獲取這些記錄:
#cat /proc/net/ip_conntrack | grep icmp
如果沒(méi)有輸出,那么就不停的重復(fù)這個(gè)命令,直到發(fā)現(xiàn)icmp的記錄為止。
以上各種情況,請(qǐng)求被認(rèn)為NEW,應(yīng)答是ESTABLISHED。換句話說(shuō),就是當(dāng)防火墻看到一個(gè)請(qǐng)求包時(shí),就認(rèn)為連接處于NEW狀態(tài),當(dāng)有應(yīng)答時(shí),就是ESTABLISHED狀態(tài)。
---------------------------
state匹配:state匹配在防火墻配置過(guò)程中非常重要的,如果沒(méi)有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包允許通過(guò)防火墻。在一般情況下,基于狀態(tài)的策略都是配置在每一條 chain的最前面,因?yàn)楫?dāng)包被匹配到以后,就能夠直接被處理了,這是一種比較高效的配置方法。關(guān)鍵字ESTABLISHED比較容易理解,即匹配狀態(tài)為 “已經(jīng)建立連接”的數(shù)據(jù)包,那么怎么理解“RELATED”呢,RELATED表示不屬于已經(jīng)建立的那條連接,但和那條連接有關(guān),比如ftp,ftp在建立連接的過(guò)程中會(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)頁(yè)、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)頁(yè)、使用msn聊天等需求,怎么樣,就這么簡(jiǎn)單~
關(guān)于iptables的狀態(tài)機(jī)制如何分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。