防火牆技巧——忽略RESET報文

  我們知道,IDS(入侵檢測系統)的主動響應系統“阻止會話”的機制是:IDS將會向通信的兩端(服務器端和客戶端)各發送三個TCP RESET包,此時通信雙方的堆棧將會把這個RESET包解釋為另一端的回應,然後停止整個通信過程,釋放緩衝區並撤銷所有TCP狀態信息,從而實現主動切斷連接的目的。

  這時,客戶端瀏覽器看到的現象通常是,打開某一個網頁,瀏覽器提示“連接被重置”而無法查看頁面。

  IDS在邏輯上是與路由器分離的,很難從路由傳輸隊列中去除或者延遲“有害”報文,通過RESET關閉連接相對較為簡單而易於實現,那麼,如何繞過IDS“會話阻止”機制呢?

  標準的TCP協議,客戶端收到RESET包後會中斷連接,但是,如果終端兩邊的節點同時忽略TCP RESET,那樣,即使觸發了IDS,防火牆也對HTTP傳輸沒有任何影響,這就通過忽略RESET包實現了突破IDS的“會話阻止”功能。

  在Linux可以用iptables的此命令實現:

  iptables -A INPUT -p tcp –tcp-flags RST RST -j DROP

  來丟棄傳入的RST置位報文。如果是FreeBSD的ipfw那麼命令是這樣的:

  ipfw add 1000 drop tcp from any to me tcpflags rst in

  因此,在網頁傳輸過程中,可以將中間夾雜的一些防火牆的TCP復位報文完全忽略,因為它們對客戶端的TCP/IP棧沒有任何影響,客戶端仍然繼續接收網頁。

  以上思路翻譯自Ignoring the Great Firewall of China,點這裡可以下載其PDF文件,原文很長,內容較多。我自己在Ubuntu系統上,在終端中使用iptables測試,的確可以實現忽略客戶端RESET報文的功能,Firefox瀏覽器再也沒有出現“連接被重置”的信息,可惜由於服務器端RESET信號沒有被忽略,導致客戶端不能與服務端同步握手,瀏覽還是有問題,不過,如果服務器段都可以識別並忽略這些偽造的RESET報文,那麼兩邊的通訊就會正常了。

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,文章转自月光博客

Comments are closed.