选项 1 - 全局

选项 1 - 全局

是否可以限制最大期间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。我还保留了上次运行的“旧”文件。这样,我可以通过连接两个文件然后使用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} )"

相关内容