iptables 限制单一端口最大连接数需使用 connlimit 模块而非 conntrack;connlimit 基于 nf_conntrack 状态统计每源 ip 并发连接并按阈值拦截,如 -a input -p tcp --dport 80 -m connlimit --connlimit-above 30 -j reject。

iptables 本身不能用 conntrack 模块限制单一服务端口的最大连接数。conntrack 模块只负责跟踪连接状态,不提供连接数量控制能力。真正能按端口限制并发连接的,是 iptables 的 connlimit 模块,它基于内核连接跟踪(nf_conntrack)提供的状态信息进行统计和拦截。
明确区分:conntrack ≠ connlimit
-
nf_conntrack是内核子系统,维护所有 TCP/UDP/ICMP 连接的状态条目,受net.netfilter.nf_conntrack_max全局参数约束。 -
connlimit是 iptables 扩展模块,它读取 nf_conntrack 表中每个源 IP 的 ESTABLISHED/RELATED 连接数,并按规则做阈值判断。 - 二者职责不同:一个管“存储池大小”,一个管“谁占了多少”。
用 connlimit 限制单一端口的并发连接数
以限制 HTTP(80 端口)为例,每 IP 最多允许 30 个并发连接:
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT --reject-with tcp-reset
关键点说明:
-
--dport 80:仅作用于目标为 80 端口的入向 TCP 流量 -
--connlimit-above 30:当前该源 IP 已建立 >30 个 ESTABLISHED 连接时触发 -
-j REJECT --reject-with tcp-reset:主动发 RST 包中断连接,比 DROP 更友好
⚠️ 规则位置很重要:应放在
-m state --state ESTABLISHED,RELATED -j ACCEPT之后、其他放行规则之前,避免误拦回包或白名单流量。
按网段或服务类型灵活设限
| 场景 | 命令示例 | 说明 |
|---|---|---|
| 限制 SSH(22 端口)每 IP 最多 3 连接 | iptables -I INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT |
加 --syn 只匹配新建握手,更精准防爆破 |
| 限制整个 C 类网段(如 192.168.1.0/24)对 443 端口共用不超过 50 连接 | iptables -A INPUT -p tcp --dport 443 -m connlimit --connlimit-above 50 --connlimit-mask 24 -j DROP |
--connlimit-mask 24 表示按 /24 子网聚合统计 |
| 仅针对某异常 IP(如 203.0.113.45)限连 | iptables -A INPUT -s 203.0.113.45 -p tcp --dport 80 -m connlimit --connlimit-above 5 -j REJECT |
可用于临时封控 |
注意事项与常见问题
模块是否就绪?
运行lsmod | grep connlimit,有输出表示已加载;若无,需执行modprobe xt_connlimit(现代内核通常默认启用)。IPv6 需单独配置
IPv6 规则中--connlimit-mask应设为128(而非32),例如:ip6tables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 --connlimit-mask 128 -j REJECT别混淆“连接数”和“连接跟踪条目数”
connlimit统计的是每个 IP 的活跃连接数,而nf_conntrack_max控制整个系统能存多少连接状态。前者可细粒度防护,后者是全局水位线——超了会导致新连接静默丢包(日志提示nf_conntrack: table full, dropping packet)。-
阈值设置要合理
- 普通 Web 页面:20–40(兼顾多标签页、资源并行加载)
- API 接口或长连接服务:50–100
- SSH/数据库管理端口:≤3–5
不复杂但容易忽略。











