iptables的connlimit模块可实时、低开销限制单ip并发连接数,核心是匹配established+syn_recv状态,需正确指定input链、加--syn、明确端口和--connlimit-mask 32,并依赖nf_conntrack正常工作。

用 iptables 的 connlimit 模块防止单 IP 占用过多连接,核心是控制每个源 IP 当前被内核记录的并发连接数,不依赖日志、不经过用户态,拦截实时且开销极低。关键在选对链、加 --syn、匹配目标端口,并理解它统计的是 ESTABLISHED + SYN_RECV 连接条目。
确认 connlimit 模块已就绪
运行以下命令检查模块是否加载:
lsmod | grep xt_connlimit
若无输出,需手动加载:
modprobe xt_connlimit
多数现代 Linux 内核(3.0+)默认支持,但某些精简系统或容器环境可能未启用,此时需确认内核配置含 CONFIG_IP_NF_CONNTRACK=y 和 CONFIG_NETFILTER_XT_MATCH_CONNLIMIT=y。
限制单 IP 并发连接数(推荐写法)
以 SSH 为例,限制每个 IPv4 地址最多 3 个并发连接:
- 必须使用
-p tcp --dport 22明确协议和端口 - 加上
--syn只匹配新建连接握手包,避免误判 ACK 或数据包 - 指定
--connlimit-mask 32精确到单 IP(IPv4 默认值,显式写出更清晰) - 用
REJECT --reject-with tcp-reset主动断连,比 DROP 更友好
完整命令:
iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
适配不同场景的常见变体
按网段限流(如 C 类子网):
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 50 --connlimit-mask 24 -j DROP
限制所有 TCP 端口(慎用,可能影响管理通道):
iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 10 -j DROP
仅针对某特定 IP(例如封禁已知异常源):
iptables -A INPUT -s 192.168.10.55 -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 -j REJECT
注意 conntrack 依赖与潜在瓶颈
connlimit 本质依赖内核连接跟踪子系统(nf_conntrack),以下情况会导致规则失效或异常:
- 若系统关闭了连接跟踪(如
net.netfilter.nf_conntrack_enable = 0),规则完全不生效 -
nf_conntrack_max设置过小(默认常为 65536),高并发下哈希表溢出,新连接建连失败,限制逻辑也会失准 - IPv4 和 IPv6 计数独立,需分别配置规则;IPv6 掩码应为
--connlimit-mask 128 - 规则若误配到
FORWARD链而非INPUT,对本机服务无效
查看当前连接数上限与使用量:
sysctl net.netfilter.nf_conntrack_maxcat /proc/sys/net/netfilter/nf_conntrack_count










