天天看點

主機安全(5)iptables狀态檢測

  什麼是狀态檢測

每個網絡連接配接包括以下資訊:源位址、目的位址、源端口和目的端口,叫作套接字對(socket pairs);協定類型、連接配接狀态(TCP協定)和逾時時間等。防火牆把這些資訊叫作狀态(stateful),能夠檢測每個連接配接狀态的防火牆叫作狀态包過濾防火牆。它除了能夠完成簡單包過濾防火牆的包過濾工作外,還在自己的記憶體中維護一個跟蹤連接配接狀态的表,比簡單包過濾防火牆具有更大的安全性。

  --state state

   這裡,state是一個用逗号分割的清單,表示要比對的連接配接狀态。有效的狀态選項包括:INVAILD,表示分組對應的連接配接是未知的;ESTABLISHED,表示分組對應的連接配接已經進行了雙向的分組傳輸,也就是說連接配接已經建立;NEW,表示這個分組需要發起一個連接配接,或者說,分組對應的連接配接在兩個方向上都沒有進行過分組傳輸;RELATED,表示分組要發起一個新的連接配接,但是這個連接配接和一個現有的連接配接有關,例如:FTP的資料傳輸連接配接和控制連接配接之間就是RELATED關系。

ICMP

在iptables看來,隻有四種ICMP分組,這些分組類型可以被歸為NEW、ESTABLISHED兩類:

ECHO請求(ping,8)和ECHO應答(pong,0)。

時間戳請求(13)和應答(14)。

資訊請求(15)和應答(16)。

位址掩碼請求(17)和應答(18)。

這些ICMP分組類型中,請求分組屬于NEW,應答分組屬于ESTABLISHED。而其它類型的ICMP分組不基于請求/應答方式,一律被歸入RELATED。

我們先看一個簡單的例子:

iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED, RELATED -j ACCEPT

iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

這鍊條規則進行如下的過濾:

一個ICMP echo請求是一個NEW連接配接。是以,允許ICMP echo請求通過OUTPUT鍊。

當對應的應答傳回,此時連接配接的狀态是ESTABLISED,是以允許通過INPUT鍊。而INPUT鍊沒有NEW狀态,是以不允許echo請求通過INPUT鍊。也就是說,這兩條規則允許内部主機ping外部主機,而不允許外部主機ping内部主機。

一個重定向ICMP(5)分組不是基于請求/應答方式的,是以屬于RELATED。INPUT和OUTPUT鍊都允許RELATED狀态的連接配接,是以重定向(5)分組可以通過INPUT和OUTPUT鍊。

3.FTP協定的狀态檢測

上面,我們比較詳細地介紹了iptables的态檢測機制。現在,我們以FTP狀态檢測為例介紹如何使用iptables進行連接配接狀态檢測。

首先,你需要加載ip_conntrack_ftp子產品。使用如下規則就可以允許建立FTP控制連接配接(這裡沒有考慮IMCP問題):

iptables -A INPUT -p tcp --sport 21 -m state --state ESTABLESED -j ACCEPT

iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISED -j ACCEPT

除了控制連接配接之外,FTP協定還需要一個資料通道,不過,資料連接配接可以通過主動和被動兩種模式建立,我們需要分别讨論。

3.1.主動模式

在主動模式下,客戶程式在控制通道上,使用PORT指令告訴FTP伺服器自己這邊的資料傳輸端口,然後FTP從20端口向這個端口發起一個連接配接。連接配接建立後,伺服器端和用戶端就可以使用這個連接配接傳輸資料了,例如:傳誦的檔案、ls等指令的結果等。是以,在主動模式下FTP資料傳輸通道是反向建立的,它從FTP伺服器端向用戶端發起。

在主動模式下,用戶端使用的資料傳輸端口是不固定的,是以我們需要在規則中使用端口範圍。由于用戶端使用的端口都是大于1024的,這并不會降低系統的安全性。

在iptables中,有一個專門跟蹤FTP狀态的子產品--ip_conntrack_ftp。這個子產品能夠識别出PORT指令,并從中提取端口号。這樣,FTP資料傳輸連接配接就被歸入RELATED狀态,它和向外的FTP控制連接配接相關,是以我們不需要在INPUT鍊中使用NEW狀态。下面的規則可以實作我們的意圖:

iptables -A INPUT -p tcp --sport 20 -m state --state ESTABLISED,RELATED -j ACCEPT

iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISED -j ACCEPT

3.2.被動模式

和主動模式相反,在被動模式下,指定連接配接端口的PORT指令是伺服器端發出的。FTP伺服器通過PORT指令告訴用戶端自己使用的FTP資料傳輸端口,然後等待用戶端建立資料傳輸連接配接。在被動模式下,建立資料傳輸連接配接的方向和建立控制連接配接的方向是相同的。是以,被動模式具有比主動模式更好的安全性。

由于ip_conntrack_ftp子產品能夠從PORT指令提取端口,是以我們在OUTPUT鍊中也不必使用NEW狀态,下面的規則可以實作對被動模式下的FTP狀态檢測:

iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state ESTABLISHED,RELATED -j ACCEPT

綜合以上的分析,我們可以得到FTP連接配接的狀态檢測規則,對于主動模式的FTP,需要下面的iptables規則:

對于被動模式的FTP連接配接,需要使用如下iptables規則

本文轉自陳仲陽0 51CTO部落格,原文連結:http://blog.51cto.com/wolfword/1212347

繼續閱讀