iptables防火牆的連接狀態

前言

  在前面的文中講過了iptables防火牆連接狀態中的ESTABLISHED狀態(http://waringid.blog.51cto.com/65148/512140)。除了這個狀態之外,iptables還有以下狀態,且聽我慢慢道來。實驗的網絡結構以下圖爲準。

iptables

 NEW

  以下圖爲例爲說明什麼是NEW的狀態,首先需要知道的是NEW與協議無關,其所指的是每一條連接中的第一個數據包,如下圖所示,客戶端主機使用TCP 50000連接服務端的TCP 22,這個連接中的第一個數據包的狀態就是NEW;其它的例如客戶端使用TCP 50001連接至服務端的TCP 22;客戶端的UDP 50000連接至服務端的UDP 53;還有客戶端對服務器端發出的ICMP數據包,以上這些例子中的第一個數據包的狀態都是NEW。

iptables1

RELATED

  在Windows系統上有一個tracert的命令,它可以幫助我們檢測兩臺主機之間總共經過了多少路由。它的工作原理其實很簡單,主要利用了TTL值的存活時間。這個TTL值是指數據包在網絡上能存活的時間,早期以秒爲單位,現在改爲“所能跨越的路由器的跳數”。

截圖15

截圖11

  以下圖爲例說明tracert工具是如何查詢最左邊Host1和最右邊主機Host2隔了多少路由器。首先tracert工具會送出第一個數據包,這個數據包的目的地址是最右邊的主機的IP,並且刻意將這個數據包的TTL值設定爲1,接着,這個數據包被送到第一臺的路由器H1,而第一臺路由器H1在收到這個數據包後,會將數據包內的TTL值減1,因此,這個數據包的TTL值變爲0,而這個值代表這個數據包的生命週期已盡,所以第一臺路由器H1會丟棄這個數據包,並且返回一個ICMP(type 11 Time to live exceeded)數據包給Host1主機,以告訴Host1“你送出的數據包因生命週期已盡,故已遭丟棄”。這樣,tracert就可以從這個數據包得知第一臺路由器H1的IP地址。

  接着tracert會送出第二個數據包,不過,這個數據包的TTL值會刻意指定爲2,接着,第二個數據包送到第一臺路由器H1,第一臺路由器收到這個數據包後,會將其TTL減1,這時數據包內的TTL值變爲1,因爲TTL值不爲0,所以生命週期未盡,因此,第一臺路由器H1會將這個數據包傳給第二臺路由器H2。不過,當第二臺路由器H2把數據包內的TTL值減1後,這個數據包內的TTL值變爲0,代表這個數據包的生命週期已盡,因此,第二臺路由器H2會丟掉這個數據包,並且回送一個ICMP type 11(Time to live exceeded)傳給發送主機Host1,以告訴Host1“你送出的數據包因生命週期已盡,故已遭丟棄”。這樣,tracert就可以從這個數據包得知第二臺路由器H2的IP地址。

  緊接着,tracert會再送出第三個數據包,不過,這個數據包的TTL值會刻意指定爲3,接着,第三個數據包送到第一臺路由器H1,第一臺路由器h1收到這個數據包後,會將其TTL減1,這時數據包內的TTL值變爲2,因爲TTL值不爲0,所以生命週期未盡,因此,第一臺路由器H1會將這個數據包傳給第二臺路由器H2。不過,當第二臺路由器h2把數據包內的TTL值減1後,這個數據包內的TTL值變爲1,因爲TTL值不爲0,所以生命週期未盡,因此,第二臺路由器h2會將這個數據包傳給第三臺路由器H3。當第三臺路由器H3把數據包內的TTL值減1後,這個數據包內的TTL值變爲0,代表這個數據包的生命週期已盡,因此,第三臺路由器H3會丟掉這個數據包,並且回送一個ICMP type 11(Time to live exceeded)傳給發送主機Host1,以告訴Host1“你送出的數據包因生命週期已盡,故已遭丟棄”。這樣,tracert就可以從這個數據包得知第三臺路由器H3的IP地址。最後tracert工具就可以收集到整條路徑上的路由器的數量以及IP各爲多少。

fig14-1_0

  看完tracert的工作原理後,我們可以看看什麼數據包的狀態會是RELATED。以上圖爲例,最後狀態返回的“Destination reached!”這個數據包的狀態就是RELATED狀態,RELATED狀態的數據包的意思是指“被動產生的響應數據包,而且這個數據包不屬於現在任何連接的數據包”。例如,上圖中Host1主機發出的是TCP協議的包(狀態一),只因生命週期已盡被路由器H1丟棄,TCP協議的數據包是面向連接的,而路由器H1返回給Host1主機的是ICMP數據包,很明顯這是另外一個數據連接,而這個數據包之所以會產生,完全是因爲第一條連接的關係,而且這個數據包不屬於現有任何一條連接的數據包。

  需要說明的是,上例以ICMP包爲例說明,實際上RELATED狀態的數據包與“協議”無關,“只要迴應回來的是因爲本機先送出的一個數據包導致另一個連接的產生,而這一條新連接上的所有數據包都是屬於RELATED狀態的數據包”。

INVALID 

  INVALID狀態包指不屬於ESTABLISHED、NEW、RELATED這三種,通常將其視爲惡意的數據包而丟棄。

  關於INVALID狀態的測試可以藉助於NMAP這個強大的掃描器來實現。對於NMAP的一切可能訪問它的主頁瞭解,該工具屬於開源軟件,支持Windows平臺(http://nmap.org/)。

  可以通過設置以下命令來實現。

截圖05

nmapterm   

  有關TCP/IP協議的連接狀態可參考RFC 793(http://www.ietf.org/rfc/rfc793.txt),需注意的是該協議的連接狀態和iptables的四種連接狀態切不可混爲一談,那不是同一概念。

  TCP SYN掃描相對來說不張揚,不易被注意到,因爲它從來不完成TCP 連接。它也不像Fin/Null/Xmas,Maimon 和Idle 掃描依賴於特定平臺,而可以應對任何兼容的TCP 協議棧。它還可以明確可靠地區分 open(開放的), closed(關閉的),和filtered(被過濾的) 狀態它常常被稱爲半開放掃描,因爲它不打開一個完全的TCP 連接。它發送一個SYN 報文,就像您真的要打開一個連接,然後等待響應。SYN/ACK 表示端口在監聽(開放),而RST (復位)表示沒有監聽者。如果數次重發後仍沒響應,該端口就被標記爲被過濾。如果收到ICMP 不可到達錯誤(類型3,代碼1,2,3,9,10,或者13),該端口也被標記爲被過濾。

screenshot

NEW狀態測試

  測試環境如前面交代,更詳細的說明可參考“iptables中state模塊的連接狀態”(http://waringid.blog.51cto.com/65148/512140)。

  其中test1主機的IP地址爲11.0.0.200,開放ssh服務,防火牆設定如下所示開放所有服務:

截圖11

截圖01

  test2主機ip地址爲173.16.0.200,iptables設定將output鏈設爲阻止,同時在這種情況下ping網關和使用ssh連接test1主機。如下所示:

截圖16

截圖12

截圖06

  可以看到上述的指令執行後無法ping通test1主機,而當開放NEW狀態後再看看結果,如下所示:

截圖17

截圖09

截圖10

截圖13

截圖14

  可以看到上述指令執行後可以正常獲取系統相關的服務請求。證明iptables執行了正確的攔截操作。

RELATED測試

  結構如上述測試一樣,其中test1主機開放所有服務,而test2主機(173.16.0.200)上做以下設定,當執行traceroute指令時無法返回正確的數據包:

截圖18

截圖02

截圖03

  現在開放RELATED狀態後看結果,如下圖所示:

截圖19

截圖04

  可以看到設定後traceroute可以正確返回,但是ping和ssh操作是不成功的,這也就是RELATED的特色。

  關於iptables的四種狀態其實有着各種各樣的應用,這裏只是簡單地說明各狀態所適用的環境,具體的應用有機會再放上來。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章