使用 iptables 限制 TCP 连接的持续时间?

Pyg*_*lis 5 networking iptables tcp

是否可以限制TCP 连接的最大持续时间iptables

我可以使用限制每个 IP 地址的并发TCP 连接iptables数,还可以使用 限制每个 IP 地址每个时间间隔的连接数。我目前正在使用这些规则来获得所需的效果:-m connlimit-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
Run Code Online (Sandbox Code Playgroud)

但是,有没有办法确保“已建立”的 TCP 连接最多在几秒后关闭,以防止“长期”连接?(无论是否仍然“活跃”) n

我看到人们建议:

iptables -A INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -m limit --limit 1/minute -j DROP
Run Code Online (Sandbox Code Playgroud)

但是,我认为这并没有真正达到我想要的效果。据我了解,上述规则将丢弃属于“已建立”连接的所有数据包,并且这些数据包的传入速度“快于”每分钟一个数据包。1 分钟后它不会关闭连接,是吗?

有什么办法可以真正实现这一点吗iptables

Pyg*_*lis 2

我现在想出了一个不同的“解决方案”:

我编写了一个小脚本,它作为 cronjob 运行(每分钟一次),并通过使用命令ss和一些grep魔法将所有“已建立”的连接转储到文件中。我还保留了上次运行的“旧”文件。sort这样,我可以通过连接两个文件然后使用plus来识别自上次运行以来“持续存在”的连接uniq -d。然后,将使用该命令显式关闭这些连接ss --kill。似乎对我有用。

(是的,这不是一个确切的超时,但对于我的目的来说可能“足够好”)


列出当前“已建立”的连接:

ss -o state established
Run Code Online (Sandbox Code Playgroud)

只获取“重复”行:

cat file1.txt file2.txt | sort | uniq -d
Run Code Online (Sandbox Code Playgroud)

关闭连接,例如:

s --kill -o state established "( dst ${ip} and dport = ${port} )"
Run Code Online (Sandbox Code Playgroud)