是否可以限制最大期间iptables
与?的 TCP 连接
我iptables
可以限制数量同时每个 IP 地址的 TCP 连接数,通过使用-m connlimit
,我还可以限制每个 IP 地址的 TCP 连接数新的每个时间间隔每个 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
?
答案1
更新:我的回答有两个问题。 1)我没有回答问题中“无论是否仍然“活跃””的部分; 2) 问题是关于关闭连接端点处的套接字,而不是从 iptables (netfilter) 的跟踪中删除连接。结束更新。
我在这里看到两个选择:
选项 1 - 全局
通过修改适当的全局 netfilter 变量,限制所有连接已建立连接的空闲超时值。
使用以下命令验证当前默认值:
cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
使用以下命令修改默认值(例如,修改为 600 秒):
echo 600 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
选项 2 - 颗粒状
通过设置超时策略并将该策略与 iptables 命令结合使用,可以限制特定连接的已建立连接的空闲超时值。
设置超时策略:
nfct add timeout nam1 inet tcp established 600
将该策略应用于 iptables 规则:
iptables -I PREROUTING -t raw -p tcp -j CT --timeout nam1
iptables -I OUTPUT -t raw -p tcp -j CT --timeout nam1
您可能需要安装 nfct 工具,该工具在 debian / ubuntu 上来自同名软件包 (nfct)。
附加信息
man iptables-extensions
显示有关 CT 目标的一些信息。
man nfct
显示了一个与您请求的信息接近的示例。 (如果名称长度超过四个字符,则使用超时策略时可能会遇到问题。)
conntrack 工具对于跟踪连接的不同事件中发生的情况非常有用(例如conntrack -E -p tcp
)。
答案2
我现在想出了一个不同的“解决方案”:
ss
我编写了一个小脚本,它作为 cronjob 运行(每分钟一次),并通过使用命令和一些魔法将所有“已建立”的连接转储到文件中grep
。我还保留了上次运行的“旧”文件。这样,我可以通过连接两个文件然后使用sort
plus来识别自上次运行以来“持续存在”的连接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} )"