Networking

使用 iptables 限制 TCP 連接的持續時間?

  • January 25, 2022

是否可以限制TCP 連接的最大持續時間iptables

使用iptables可以限制每個 IP 地址的並發TCP 連接數-m connlimit,也可以使用 限制每個 IP 地址每個時間間隔的連接數-m hashlimit。我目前正在使用這些規則來獲得預期的效果:

iptables -A INPUT -m tcp -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j DROP
iptables -A INPUT -m tcp -p tcp --dport 80 -m state --state NEW -m hashlimit --hashlimit-above 15/min --hashlimit-burst 10 --hashlimit-mode srcip --hashlimit-name rtlimit -j DROP

但是,有沒有辦法確保“已建立”的 TCP 連接最多在幾秒鐘後關閉,以防止“長期”連接?(無論是否仍然“活躍”) n

我看到人們建議:

iptables -A INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -m limit --limit 1/minute -j DROP

但是,我不認為這真的能達到我想要的效果。據我了解,上述規則將丟棄屬於“已建立”連接並且以“快於”每分鐘一個數據包的速率進入的所有數據包。1分鐘後它不會關閉連接,還是這樣?

有什麼辦法可以真正做到這一點iptables嗎?

我現在想出了一個不同的“解決方案”:

我編寫了一個小腳本,它作為 cronjob(每分鐘一次)執行,並通過使用ss命令和一點grep魔法將所有“已建立的”連接轉儲到文件中。我還保留了上次執行的“舊”文件。這樣,我可以通過連接兩個文件然後使用sortplus來辨識自上次執行以來“持續”的連接uniq -d。然後將使用該ss --kill命令顯式關閉這些連接。似乎對我有用。

(是的,這不是一個確切的超時,但對於我的目的來說可能“足夠好”)


列出目前“已建立”的連接:

ss -o state established

僅獲取“重複”行:

cat file1.txt file2.txt | sort | uniq -d

關閉連接,例如:

s --kill -o state established "( dst ${ip} and dport = ${port} )"

引用自:https://unix.stackexchange.com/questions/685823