关于使用iptables封禁全端口连接及UDP全端口连接限制规则异常的技术咨询
使用iptables封禁全端口连接及UDP全端口连接限制规则异常的技术咨询
嘿,我来帮你排查下这个iptables规则的问题!
你遇到的核心问题是:当针对所有UDP端口设置connlimit限制时,规则会统计所有状态的UDP会话(包括已经建立的ESTABLISHED会话),而不仅仅是用户新发起的连接。
大多数用户的IP其实可能已经和你的服务器存在一些隐性UDP会话——比如DNS查询交互、其他服务的心跳包,甚至是之前连接残留的会话记录(UDP的连接跟踪默认会保留一段时间)。这些会话都会被connlimit计入总连接数,导致哪怕用户刚发起第一个新连接,统计总数就已经超过了5,直接触发REJECT动作。而单端口规则能正常工作,是因为针对单个端口的话,这类隐性会话数量极少,不会达到5的阈值。
给你两个关键的修改建议:
- 只针对新连接做限制:加上
-m state --state NEW参数,让connlimit只统计用户新发起的UDP连接,忽略已建立的会话。 - 简化规则:
--dport 0:65535是多余的,-p udp已经会匹配所有UDP端口,不需要额外指定端口范围。
修改后的规则如下:
iptables -A INPUT -p udp -m state --state NEW -m connlimit --connlimit-above 5 -j REJECT
另外还要注意规则的顺序:建议把这条限制规则放在允许已建立连接的规则之后,比如先放行所有已建立/相关的流量,再处理新连接的限制,这样更符合iptables的常规逻辑:
# 先允许已建立的连接(包括UDP的回复流量) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 再限制新发起的UDP连接数 iptables -A INPUT -p udp -m state --state NEW -m connlimit --connlimit-above 5 -j REJECT
这样调整后,就不会出现误封正常用户单个连接的情况了,同时能有效限制超过5个并发新UDP连接的用户。
备注:内容来源于stack exchange,提问作者MaxIT
相关产品推荐
相关产品推荐

