iptables 不直接限制连接状态数,真正起作用的是内核 nf_conntrack 子系统;需通过 sysctl 调整 nf_conntrack_max 等参数控制连接跟踪表容量,并注意表满导致的静默丢包问题。

iptables 本身不直接通过“conntrack 模块”限制最大连接状态数,真正起作用的是内核的 nf_conntrack 子系统。所谓“Conntrack 模块限制”,实际是指调整内核参数控制连接跟踪表(connection tracking table)容量,而非用 iptables 规则去匹配或丢弃包。这是两个层面:iptables 是策略执行者,nf_conntrack 是状态存储基础设施。
查看当前连接跟踪状态上限与使用量
运行以下命令,快速掌握系统现状:
- cat /proc/sys/net/netfilter/nf_conntrack_max —— 查看当前允许的最大连接跟踪条目数(默认通常为 65536)
- cat /proc/sys/net/netfilter/nf_conntrack_count —— 查看当前已跟踪的连接数
- ls /proc/net/nf_conntrack | wc -l 或 conntrack -C —— 验证实时计数(需安装 conntrack-tools)
永久调大或调小最大连接跟踪数
修改 /etc/sysctl.conf,添加或修改这一行:
net.netfilter.nf_conntrack_max = 131072
数值可根据内存估算:一般每条连接跟踪记录占用约 304 字节,建议设为物理内存(字节)÷ 16384 的整数倍。例如 4GB 内存可设为 ≈ 262144。改完后执行:
sudo sysctl -p
注意 conntrack 表满导致的丢包现象
当 nf_conntrack_count 接近 nf_conntrack_max 时,新连接会因无法创建 conntrack 条目而被静默丢弃(表现为 SYN 包无响应、SSH 连不上、HTTP 请求超时),日志中常见:
kernel: nf_conntrack: table full, dropping packet
这不是 iptables 规则生效,而是底层资源耗尽。此时不能靠加 iptables 规则解决,必须:
- 扩容 nf_conntrack_max
- 缩短连接超时时间(如减少 net.netfilter.nf_conntrack_tcp_timeout_established)
- 排查异常长连接或连接泄漏(如未正确 close 的 TCP 连接)
不要混淆 connlimit 和 nf_conntrack
很多人误把 iptables -m connlimit 当作 conntrack 限流手段——其实它只是统计每个 IP 的当前 ESTABLISHED 连接数,不依赖 nf_conntrack 表,也不受 nf_conntrack_max 影响。它适合防单 IP 并发刷连;而 nf_conntrack_max 是全局状态池水位线,影响所有带状态的协议(TCP/UDP/ICMP 等)。两者目标不同,不可替代。

















