iptables的基礎(chǔ)知識-iptables中的狀態(tài)檢測
iptables的狀態(tài)
問題:什么是iptable狀態(tài)?
首先讓我們看一下服務(wù)器/客戶機(jī)的交互原理。服務(wù)器提供某特定功能的服務(wù)總是由特定的后臺程序提供的。在TCP/IP網(wǎng)絡(luò)中,常常把這個特定的服務(wù)綁定到特定的TCP或UDP端口。之后,該后臺程序就不斷地監(jiān)聽(listen)該端口,一旦接收到符合條件的客戶端請求,該服務(wù)進(jìn)行TCP握手后就同客戶端建立一個連接,響應(yīng)客戶請求。與此同時,再產(chǎn)生一個該綁定的拷貝,繼續(xù)監(jiān)聽客戶端的請求。
舉一個例子:假設(shè)網(wǎng)絡(luò)中有一臺服務(wù)器A(IP地址為1.1.1.1)提供WWW服務(wù),另有客戶機(jī)B(2.2.2.2)、C(3.3.3.3)。首先,服務(wù)器A運(yùn)行提供WWW服務(wù)的后臺程序(比如Apache)并且把該服務(wù)綁定到端口80,也就是說,在端口80進(jìn)行監(jiān)聽。當(dāng)B發(fā)起一個連接請求時,B將打開一個大于1024的連接端口(1024內(nèi)為已定義端口),假設(shè)為1037。A在接收到請求后,用80端口與B建立連接以響應(yīng)B的請求,同時產(chǎn)生一個80端口綁定的拷貝,繼續(xù)監(jiān)聽客戶端的請求。假如A又接收到C的連接請求(設(shè)連接請求端口為1071),則A在與C建立連接的同時又產(chǎn)生一個80端口綁定的拷貝繼續(xù)監(jiān)聽客戶端的請求。如下所示,因?yàn)橄到y(tǒng)是以源地址、源端口、目的地址、目的端口來標(biāo)識一個連接的,所以在這里每個連接都是唯一的。
服務(wù)器 客戶端
連接1:1.1.1.1:80 <=> 2.2.2.2:1037
連接2:1.1.1.1:80 <=> 3.3.3.3:1071
從上邊我們可以看出,每個網(wǎng)絡(luò)連接包括以下信息:源地址、目的地址、源端口和目的端口,叫作套接字對(socket pairs);協(xié)議類型、連接狀態(tài)(TCP協(xié)議)和超時時間等。iptable防火墻把這些信息叫作狀態(tài)(stateful),能夠檢測每個連接狀態(tài)的防火墻叫作狀態(tài)包過濾防火墻。它除了能夠完成簡單包過濾防火墻的包過濾工作外,還在自己的內(nèi)存中維護(hù)一個跟蹤連接狀態(tài)的表,比簡單包過濾防火墻具有更大的安全性。這連接跟蹤的表是/proc/net/ip_conntrack(conntrack就是connection tracking 的首字母縮寫),能容納多少記錄是被一個變量控制的。默認(rèn)值取決于你的內(nèi)存大小,128MB可以包含8192條目錄,256MB是16376條。你也可以在/proc/sys/net/ipv4/ip_conntrack_max里查看、設(shè)置。
注意:必須要加載ip_conntrack模塊后才可以看到/proc/net/ip_conntrack表??梢杂胢odprobe ip_conntrack來加載。
每一種特定的服務(wù)都有自己特定的端口,一般說來小于1024的端口多為服務(wù)器保留端口,這些端口分配給眾所周知的服務(wù)(如WWW、FTP等等),從512到1024的端口通常保留給特殊的UNIX TCP/IP應(yīng)用程序,具體情況請參考/etc/services文件或RFC1700。
iptables中的狀態(tài)檢測功能是由state選項(xiàng)來實(shí)現(xiàn)iptable的。對這個選項(xiàng),在iptables的手冊頁中有以下描述:
state
這個模塊能夠跟蹤分組的連接狀態(tài)(即狀態(tài)檢測)。
格式:--state XXXXX
這里,state是一個用逗號分割的列表,表示要匹配的連接狀態(tài)。
在iptables中有四種狀態(tài):NEW,ESTABLISHED,RELATED,INVALID。
NEW,表示這個分組需要發(fā)起一個連接,或者說,分組對應(yīng)的連接在兩個方向上都沒有進(jìn)行過分組傳輸。NEW說明這個包是我們看到的第一個包。意思就是,這是conntrack模塊看到的某個連接第一個包,它即將被匹配了。比如,我們看到一個SYN包,是我們所留意的連接的第一個包,就要匹配它。第一個包也可能不是SYN包,但它仍會被認(rèn)為是NEW狀態(tài)。比如一個特意發(fā)出的探測包,可能只有RST位,但仍然是NEW。
ESTABLISHED,表示分組對應(yīng)的連接已經(jīng)進(jìn)行了雙向的分組傳輸,也就是說連接已經(jīng)建立,而且會繼續(xù)匹配這個連接的包。處于ESTABLISHED狀態(tài)的連接是非常容易理解的。只要發(fā)送并接到應(yīng)答,連接就是ESTABLISHED的了。一個連接要從NEW變?yōu)镋STABLISHED,只需要接到應(yīng)答包即可,不管這個包是發(fā)往防火墻的,還是要由防火墻轉(zhuǎn)發(fā)的。ICMP的錯誤和重定向等信息包也被看作是ESTABLISHED,只要它們是我們所發(fā)出的信息的應(yīng)答。
RELATED,表示分組要發(fā)起一個新的連接,但是這個連接和一個現(xiàn)有的連接有關(guān),例如:FTP的數(shù)據(jù)傳輸連接和控制連接之間就是RELATED關(guān)系。RELATED是個比較麻煩的狀態(tài)。當(dāng)一個連接和某個已處于ESTABLISHED狀態(tài)的連接有關(guān)系時,就被認(rèn)為是RELATED的了。換句話說,一個連接要想是RELATED的,首先要有一個ESTABLISHED的連接。這個ESTABLISHED連接再產(chǎn)生一個主連接之外的連接,這個新的連接就是RELATED的了,當(dāng)然前提是conntrack模塊要能理解RELATED。ftp是個很好的例子,F(xiàn)TP-data連接就是和FTP-control有RELATED的。還有其他的例子,
INVAILD,表示分組對應(yīng)的連接是未知的,說明數(shù)據(jù)包不能被識別屬于哪個連接或沒有任何狀態(tài)。有幾個原因可以產(chǎn)生這種情況,比如,內(nèi)存溢出,收到不知屬于哪個連接的ICMP錯誤信息。一般地,我們DROP這個狀態(tài)的任何東西。
這些狀態(tài)可以一起使用,以便匹配數(shù)據(jù)包。這可以使我們的防火墻非常強(qiáng)壯和有效。以前,我們經(jīng)常打開1024以上的所有端口來放行應(yīng)答的數(shù)據(jù)。現(xiàn)在,有了狀態(tài)機(jī)制,就不需再這樣了。因?yàn)槲覀兛梢灾婚_放那些有應(yīng)答數(shù)據(jù)的端口,其他的都可以關(guān)閉。這樣就安全多了。
上一節(jié):iptables的基礎(chǔ)知識-防火墻的介紹。下一節(jié):iptables中TCP的三次握手。
【編輯推薦】