iptables本身不直接限制最大连接状态数,真正控制上限的是内核参数net.netfilter.nf_conntrack_max;conntrack模块负责状态跟踪,而iptables的connlimit模块才用于限制单ip或网段的并发连接数。

iptables 本身不直接通过 conntrack 模块“限制最大网络连接状态数”,真正控制全局连接跟踪条目上限的是内核参数 net.netfilter.nf_conntrack_max。conntrack 模块负责跟踪连接状态,而 iptables 的 connlimit 模块(注意不是 conntrack 模块)才用于限制每个 IP 或网段的并发连接数。两者常被混淆,但职责不同。
设置系统级最大连接跟踪数(nf_conntrack_max)
这是限制整个系统能同时维护多少 ESTABLISHED/RELATED 连接的核心参数,直接影响 NAT、防火墙、负载均衡等场景的容量:
- 查看当前值:
cat /proc/sys/net/netfilter/nf_conntrack_max - 临时修改(重启失效):
sysctl -w net.netfilter.nf_conntrack_max=131072 - 永久生效:在
/etc/sysctl.conf中添加net.netfilter.nf_conntrack_max = 131072
然后运行sysctl -p - 推荐值参考:4核4G 服务器建议设为 65536~131072;每增加 1 个连接约占用 320 字节不可交换内存,需结合物理内存估算
调整连接跟踪哈希表大小(nf_conntrack_buckets)
nf_conntrack_max 不是孤立参数,它和哈希桶数量 nf_conntrack_buckets 共同决定性能。桶太少会导致链表过长,查找变慢:
- 默认关系:nf_conntrack_max ≈ nf_conntrack_buckets × 4(官方推荐每个桶最多存 4 条)
- 查看当前桶数:
cat /proc/sys/net/netfilter/nf_conntrack_buckets - 设置桶数(需与 max 匹配):
sysctl -w net.netfilter.nf_conntrack_buckets=32768 - 修改后建议同步调整 max 值,例如 buckets=32768 → max 可设为 131072(32768×4)
用 iptables connlimit 限制单 IP 并发连接数
这才是 iptables 层面真正“按 IP 控制连接数”的方法,适用于防暴力扫描、防客户端滥用:
- 限制每个源 IP 最多 3 个 SSH 并发连接:
iptables -A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j REJECT --reject-with tcp-reset - 限制 C 类网段(如 192.168.1.0/24)总共不超过 10 个连接:
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j DROP - 务必搭配
--syn或明确指定-m state --state NEW,避免误匹配已建立连接 -
--connlimit-mask值很重要:设为 0 表示精确到单 IP,但高并发时 CPU 占用飙升;生产环境建议设为 24(C 段)或 16(B 段)以平衡精度与性能
验证与注意事项
规则上线前必须验证,避免锁死自己:
- 实时查看连接跟踪统计:
conntrack -S(显示 bucket 使用、搜索失败次数等) - 查看当前活跃连接数:
conntrack -C或cat /proc/sys/net/netfilter/nf_conntrack_count - 若出现大量 “ignore=1” 或 “search_restart=1”,说明哈希桶不足或 max 设置过低,需调大 buckets 和 max
- connlimit 规则对 FORWARD 链也有效,但需确保 net.ipv4.ip_forward=1 已开启
- 所有 iptables 规则需保存(如
iptables-save > /etc/sysconfig/iptables),否则重启丢失










