Linux

如何使用 linux netfilter/iptables 在特定條件下立即在兩端重置 tcp 連接?

  • May 10, 2016

親愛的 Serverfault 社區,

我有以下問題:如果在數據包數據中遇到某個字元串,我需要立即重置(斷開)兩個網路端的 tcp 連接。我無法控制雙方的應用程序,只能使用 linux iptables(或類似工具)進行連接中止。

我的第一個想法是使用以下 iptables 規則來實現我想要的:

/usr/sbin/iptables -A INPUT -p tcp --dport 1234 -m string --algo bm --string 'BAD STRING' -j REJECT --reject-with tcp-reset

這通過向客戶端發送 TCP RST 數據包而在遠端端完美執行,因此將立即斷開連接。不幸的是,在強制斷開連接時不會通知本地端,並且伺服器程序(連接)永遠掛起。

我認為在某種條件下立即斷開雙方已經建立的連接的要求(在這種情況下是 IP 數據包中的字元串匹配)並不是很不尋常。所以我做了一個Google搜尋,但令我驚訝的是在合理的時間內找不到任何可用的東西。

有沒有辦法使用 iptables 在網路兩端實現 tcp 斷開連接?如果沒有,我可以使用哪些其他工具(請記住我無法控制客戶端/伺服器應用程序)?

非常感謝您的寶貴回答!

最好的祝福,

延斯

您可以使用xt_RESET,例如,-j RESET

您可以將應用程序配置為超時。

另一種解決方案是配置 TCP KeepAlive 並進行更頻繁的檢查,例如每 10 分鐘一次。

一些應用程序在應用程序級別實現 KeepAlive。例如 SSH、阿帕奇。

當發送保持活動狀態並在遠端端關閉連接時,您將收到來自遠端端的 RST。

狀態防火牆會在一段時間不活動後忘記連接。這意味著當您有一段時間(30 分鐘或 1 小時)沒有流量時,您可以獲得丟棄的數據包和半打開的連接。

我認為最好詢問您要解決的特定問題,而不是詢問您要實施的特定解決方案。

引用自:https://serverfault.com/questions/538692