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