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

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

親愛的伺服器故障社區,

我有以下問題:如果資料包資料中遇到某個字串,我需要立即重置(斷開)網路兩側的 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 封包中的字串匹配)立即斷開雙方已建立的連接的要求並不罕見。所以我進行了谷歌搜索,但令我驚訝的是在合理的時間內找不到任何可用的東西。

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

預先非常感謝您的寶貴回答!

此致,

延斯

答案1

您可以使用xt_重置,例如,-j RESET

答案2

您可以將應用程式配置為逾時。

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

一些應用程式在應用程式層級實現 KeepAlive。例如 SSH、阿帕契。

當傳送保持活動狀態並且連線在遠端關閉時,您將從遠端收到 RST。

有狀態防火牆在一段時間不活動後會忘記連線。這表示當您一段時間(30 分鐘或 1 小時)沒有流量時,您可能會收到丟棄的資料包和半開啟的連線。

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

答案3

不幸的是,強制斷開時不會通知本地端

應該是,tcp-reset 意味著應該告訴客戶端連線正在關閉。如果發送重設時您的用戶端掛起,這表示它沒有正確處理從執行 IPTables 的主機傳回的重設。除非你有辦法解決這個問題,否則我想不出任何方法可以實現這一目標。

相關內容