2016-08-16 58 views
1

作爲學習原始套接字如何工作的一種方式,我編寫了一個虛擬防火牆,根據目標端口TCP丟棄數據包。它正在工作,但問題在於客戶重試了相當長的一段時間,直到最終超時。TCP RST包是否可以減少連接超時?

我想知道客戶是否可能重試這麼久,因爲它沒有收到任何答案。在這種情況下,如果防火牆回覆TCP RST到來自客戶端的TCP SYNC消息會有幫助嗎?如果沒有,有什麼方法可以強制客戶端停止重試(不是減少Linux中的超時時間,而是更多地獲取對其數據包的特定答案,這將使客戶端停止)?

+1

請記住,對數據包的任何響應都會向客戶端顯示防火牆的存在。這就是爲什麼防火牆經常配置爲不響應的原因。 –

+0

好吧,我明白了,但我只想嘗試瞭解有關TCP的更多信息。問題是我正在發送RST消息但沒有任何事情發生,所以我不確定它們是否被錯誤地構建,或者這是TCP的正常行爲 –

+0

我期望客戶端只用一個'RST' 。 「RST」表示對話中意外的消息。由於客戶正在嘗試開始新的對話,我預計很多客戶將會再次嘗試。很可能你想發送的是一個[ICMP目的不可達數據包](https:// en。wikipedia.org/wiki/ICMP_Destination_Unreachable)。 –

回答

1

您可以將防火牆視爲與主機操作系統上的端口已關閉相同的情況。主機操作系統的TCP/IP堆棧會做什麼?

RFC 793(原始TCP RFC)具有以下說關於這種情況下:

如果連接不存在(CLOSED)然後復位是響應發送 到任何輸入段除外另一復位。特別是,通過這種方式拒絕發送給不存在連接的SYN 。

您應該閱讀TCP RFC並確保您的TCP RST數據包符合此案例的要求。一個格式錯誤的RST將被客戶忽略。

RFC 1122還指示包含代碼2-4的ICMP目的地不可達應該導致連接中止。需要注意的代碼,因爲0,1和5列是很重要的一定不要中止連接

目的地不可達 - 碼2-4

這些都是硬錯誤條件,所以TCP SHOULD中止 的連接。

+0

問題在於TCP RST沒有正確創建,因爲我在校驗和中有一個錯誤 –

0

您的防火牆行爲正常。信息安全的基本原則是不要向攻擊者透露任何信息。發送RST會公佈該主機存在。

在15 - 20年前就有防火牆,但有人皺起了眉頭。現在他們的行爲和你的一樣:他們只是丟棄數據包而不回覆。

如果沒有迴應,客戶在放棄之前重試幾次是正常的,但與您在評論中告訴您的情況相反,如果客戶收到一封信,客戶會立即放棄「連接被拒絕」 RST。如果沒有響應,它只會重試。