【正文】
iptables中的狀態(tài)檢測功能是由m state state選項來實現(xiàn)的,state這個模塊能夠跟蹤分組的連接狀態(tài)(即狀態(tài)檢測)。state state這里,state是一個用逗號分割的列表,表示要匹配的連接狀態(tài)。有效的狀態(tài)選項包括:INVAILD,表示分組對應(yīng)的連接是未知的;ESTABLISHED,表示分組對應(yīng)的連接已經(jīng)進行了雙向的分組傳輸,也就是說連接已經(jīng)建立;NEW,表示這個分組需要發(fā)起一個新的連接,或者說,分組對應(yīng)的連接在兩個方向上都沒有進行過分組傳輸;RELATED,表示分組要發(fā)起一個新的連接,但是這個連接和一個現(xiàn)有的連接有關(guān),例如:FTP的數(shù)據(jù)傳輸連接和控制連接之間就是RELATED關(guān)系。對于本地產(chǎn)生分組,在PREROUTING或者OUTPUT鏈中都可以對連接的狀態(tài)進行跟蹤。在進行狀態(tài)檢測之前,需要重組分組的分片。UDP和TCP連接的狀態(tài)表由/proc/net/ip_conntrack進行維護。狀態(tài)表能夠保存的最大連接數(shù)保存在/proc/sys/net/ipv4/ip_conntrack_max中。它取決于硬件的物理內(nèi)存。 iptables的狀態(tài)檢測是如何工作 iptables概述首先大體看一下整個netfilter框架。如果要在兩個網(wǎng)絡(luò)接口之間轉(zhuǎn)發(fā)一個分組,這個分組將以以下的順序接收規(guī)則鏈的檢查:首先,是PREROUTING鏈。如果必要對這個分組進行目的網(wǎng)絡(luò)地址轉(zhuǎn)換(DNAT)和mangle處理。同時,iptables的狀態(tài)檢測機制將重組分組,并且以以下某種方式跟蹤其狀態(tài):216。 分組是否匹配狀態(tài)表中的一個已經(jīng)實現(xiàn)(ESTABLISHED)的連接。216。 它是否是和狀態(tài)表中某個UDP/TCP連接相關(guān)(RELATED)的一個ICMP分組。216。 這個分組是否要發(fā)起一個新(NEW)的連接。216。 如果分組和任何連接無關(guān),就被認為是無效(INVALID)的。其次,是FORWARD鏈。把分組的狀態(tài)和過濾表中的規(guī)則進行匹配,如果分組與所有的規(guī)則都無法匹配,就使用默認的規(guī)則進行處理。最后,是POSTROUTING鏈。如果有必要,就對分組進行源網(wǎng)絡(luò)地址轉(zhuǎn)換(SNAT),注意:所有的分組都必須和過濾表的規(guī)則進行比較。如果你修改了規(guī)則,要拒絕所有的網(wǎng)絡(luò)流量,那么即使分組的狀態(tài)匹配狀態(tài)表中的一個ESTABLISHED條目,也將被拒絕。 UDP連接UDP(用戶數(shù)據(jù)包協(xié)議)是一種無狀態(tài)協(xié)議,以為這個協(xié)議沒有序列號。不過,這并不意味著我們不能跟蹤UDP連接。雖然沒有序列號,但是我們還可以使用其它的一些信息跟蹤UDP連接的狀態(tài)。下面是狀態(tài)表中關(guān)于UDP連接的條目:udp 17 19 src= dst= sport=1032 dport=53 [UNREPLIED] src= dst= sport=53 dport=1032 use=1這個狀態(tài)表項只有在iptables過濾規(guī)則允許建立新的連接時,才能建立。以下的規(guī)則可以產(chǎn)生這類狀態(tài)表項,這兩條規(guī)則只允許向外的UDP連接:iptables A INPUT p udp m state state ESTABLISHED j ACCEPTiptables A OUTPUT p udp m state state NEW,ESTABLISHED j ACCEPT一個TCP連接是通過三次握手的方式完成的。首先,客戶程序發(fā)出一個同步請求(發(fā)出一個SYN分組);接著,服務(wù)器端回應(yīng)一個SYN|ACK分組;最后返回一個ACK分組,連接完成。整個過程如下所示:Client ServerSYN SYN+ACKACK ACKACK ..................SYN和ACK是由TCP分組頭的標志決定的。在每個TCP分組頭還有32位的序列號和應(yīng)答號用于跟蹤會話。為了跟蹤一個TCP連接的狀態(tài),需要使用下面這樣的規(guī)則:iptables A INPUT p tcp m state state ESTABLISHED j ACCEPTiptables A OUTPUT p tcp m state state NEW,ESTABLISHED j ACCEPT用以下的規(guī)則明確新的TCP連接應(yīng)該是SYN分組建立的:iptables A INPUT p tcp ! –syn m state state NEW j DROP這樣可以阻止空會話的繼續(xù)進行。在iptables看來,只有四種ICMP分組,這些分組類型可以被歸為NEW、ESTABLISHED兩類:(1) ECHO請求(ping,8)和ECHO應(yīng)答(ping,0)。(2) 時間戳請求(13)和應(yīng)答(14)。(3) 信息請求(15)和應(yīng)答(16)。(4) 地址掩碼請求(17)和應(yīng)答(18)。這些ICMP分組類型中,請求分組屬于NEW,應(yīng)答分組屬于ESTABLISHED。而其它類型的ICMP分組不基于請求/應(yīng)答方式,一律被歸入RELATED。舉例如下:iptables A OUTPUT p icmp m state state NEW,ESTABLISHED,RELATED j ACCEPTiptables A INPUT p icmp m state state ESTABLISHED,RELATED j ACCEPT規(guī)則進行如下的過濾:一個ICMP echo請求是一個NEW連接。因此,允許ICMP echo請求通過OUTPUT鏈。當對應(yīng)的應(yīng)答返回,此時連接的狀態(tài)是ESTABLISED,因此允許通過INPUT鏈。而INPUT鏈沒有NEW狀態(tài),因此不允許echo請求通過INPUT鏈。也就是說,這兩條規(guī)則允許內(nèi)部主機ping外部主機,而不允許外部主機ping內(nèi)部主機。一個重定向ICMP(5)分組不是基于請求/應(yīng)答方式的,因此屬于RELATED。INPUT和OUTPUT鏈都允許RELATED狀態(tài)的連接,因此重定向(5)分組可以通過INPUT和OUTPUT鏈。 FTP協(xié)議的狀態(tài)檢測上面,我們比較詳細地介紹了iptables的態(tài)檢測機制?,F(xiàn)在,我們以FTP狀態(tài)檢測為例介紹如何使用iptables進行連接狀態(tài)檢測。首先,我們需要加載ip_conntrack_ftp模塊。使用如下規(guī)則就可以允許建立FTP控制連接(這里沒有考慮IMCP問題):iptables A INPUT p tcp –sport 21 m state state ESTABLISHED j ACCEPTiptables A OUTPUT p tcp –dport 21 m state state NEW,ESTABLISHED j ACCEPT除了控制連接之外,F(xiàn)TP協(xié)議還需要一個數(shù)據(jù)通道,不過,數(shù)據(jù)連接可以通過主動和被動兩種模式建立。(1) 主動模式在主動模式下,客戶程序在控制通道上,使用PORT命令告訴FTP服務(wù)器自己這邊的數(shù)據(jù)傳輸端口,然后FTP從20端口向這個端口發(fā)起一個連接。連接建立后,服務(wù)器端和客戶端就可以使用這個連接傳輸數(shù)據(jù)了,例如:傳送的文件、ls等命令的結(jié)果等。因此,在主動模式下FTP數(shù)據(jù)傳輸通道是反向建立的,它從FTP服務(wù)器端向客戶端發(fā)起。在主動模式下,客戶端使用的數(shù)據(jù)傳輸端口是不固定的,因此我們需要在規(guī)則中使用端口范圍。由于客戶端使用的端口都是大于1024的,這并不會降低系統(tǒng)的安全性。在iptables中,有一個專門跟蹤FTP狀態(tài)的模塊ip_conntrack_ftp。這個模塊能夠識別出PORT命令,并從中提取端口號。這樣,F(xiàn)TP數(shù)據(jù)傳輸連接就被歸入RELATED狀態(tài),它和向外的FTP控制連接相關(guān),因此我們不需要在INPUT鏈中使用NEW狀態(tài)。下面的規(guī)則可以實現(xiàn)我們的意圖:iptables A INPUTp tcp –sport 20 m state state ESTABLISHED,RELATED j ACCEPTiptables A OUTPUT p tcp –dport 20 m state state ESTABLISHED j ACCEPT(2) 被動模式和主動模式相反,在被動模式下,指定連接端口的PORT命令是服務(wù)器端發(fā)出的。FTP服務(wù)器通過PORT命令告訴客戶端自己使用的FTP數(shù)據(jù)傳輸端口,然后等待客戶端建立數(shù)據(jù)傳輸連接。在被動模式下,建立數(shù)據(jù)傳輸連接的方向和建立控制連接的方向是相同的。因此,被動模式具有比主動模式更好的安全性。由于ip_conntrack_ftp模塊能夠從PORT命令提取端口,因此我們在OUTPUT鏈中也不必使用NEW狀態(tài),下面的規(guī)則可以實現(xiàn)對被動模式下的FTP狀態(tài)檢測:iptables A INPUT p tcp –sport 1024: dport 1024: m state state ESTABLISHED j ACCEPTiptables A OUTPUT p tcp –sport 1024: dport 1024 m state state ESTABLISHED,RELATED j ACCEPT綜合以上的分析,我們可以得到FTP連接的狀態(tài)檢測規(guī)則,對于主動模式的FTP,需要下面的iptables規(guī)則:iptables A INPUT p tcp sport 21 m state state ESTABLESED j ACCEPTiptables A OUTPUT p tcp dport 21 m state state NEW,ESTABLISED j ACCEPTiptables A INPUT p tcp sport 20 m state state ESTABLISED,RELATED j ACCEPTiptables A OUTPUT p tcp dport 20 m state state ESTABLISED j ACCEPT對于被動模式的FTP連接,需要使用如下iptables規(guī)則iptables A INPUT p tcp sport 21 m state state ESTABLESED j ACCEPTiptables A OUTPUT p tcp dport 21 m state state NEW,ESTABLISED j ACCEPTiptables A INPUT p tcp sport 1024: dport 1024: m state state ESTABLISHED j ACCEPTiptables A OUTPUT p tcp sport 1024: dport 1024: m state state ESTABLISHED,RELATED j ACCEPT21 /