iptables 可通过 connlimit 模块限制单 ip 并发 tcp 连接数,常用命令为 iptables -a input -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j reject,仅匹配新建连接,支持按端口、子网掩码精细化控制,并推荐使用 --reject-with tcp-reset 提升友好性。

可以使用 iptables 的 connlimit 模块来限制单个 IP 地址(即单用户)的并发 TCP 连接数,适用于防止滥用、扫描或简单 DoS。
确认内核支持 connlimit 模块
大多数主流 Linux 发行版默认已启用该模块。可通过以下命令验证:
iptables -m connlimit --help
若提示“Unknown argument”或模块未找到,需检查内核是否编译了 CONFIG_IP_NF_MATCH_CONNLIMIT(通常位于 netfilter 相关选项中),并确保对应内核模块已加载:
modprobe xt_connlimit
基本语法与常用限制方式
connlimit 主要通过 --connlimit-above N 匹配连接数超过 N 的源 IP,并配合 --connlimit-mask 指定子网掩码长度(用于聚合匹配,如 /32 表示单 IP)。
典型用法(以限制单 IP 最多 50 个并发 TCP 连接为例):
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 50 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
-
--syn:只匹配新建连接(SYN 包),避免影响已有连接的后续包 -
--connlimit-mask 32:精确到单个 IPv4 地址(/32),IPv6 用--connlimit-mask 128 -
-j REJECT --reject-with tcp-reset:比 DROP 更友好,主动发送 RST 终止新连接请求
按端口或服务精细化控制
可结合 --dport 限制特定服务,例如仅对 SSH 或 Web 服务设限:
# 限制每个 IP 对 22 端口最多 3 个并发 SSH 连接 iptables -A INPUT -p tcp --dport 22 --syn -m connlimit --connlimit-above 3 --connlimit-mask 32 -j REJECT --reject-with tcp-reset <h1>限制每个 IP 对 80/443 端口合计不超过 20 个连接(需用 multiport)</h1><p>iptables -A INPUT -p tcp -m multiport --dports 80,443 --syn -m connlimit --connlimit-above 20 --connlimit-mask 32 -j REJECT --reject-with tcp-reset</p>
注意事项与调试建议
- 规则顺序很重要:应放在允许 established/related 连接之后、具体服务规则之前,避免误拦
- 不要对
ESTABLISHED,RELATED流量应用 connlimit,它只对新建连接有效 - 查看当前匹配统计:
iptables -L INPUT -n -v | grep connlimit - 临时测试建议加
-I INPUT 1插入最前,并搭配iptables -D快速移除,避免锁死 SSH - connlimit 统计基于 netfilter 连接跟踪表(conntrack),若 conntrack 表满或老化过快,可能影响准确性











