攻击流量高峰期连接跟踪表容量与内核参数调优,第一步不是直接把上限调大,而是确认 conntrack 是否已接近耗尽。Linux 防火墙、NAT 网关等会跟踪连接状态;表项满时,新连接可能无法建立,但 CPU、带宽或应用本身也可能是瓶颈。
先看表项是否接近上限
在宿主机执行 cat /proc/sys/net/netfilter/nf_conntrack_count 查看当前表项数,执行 cat /proc/sys/net/netfilter/nf_conntrack_max 查看上限。持续观察高峰期间的变化,并结合内核日志是否出现“nf_conntrack: table full”判断。一次瞬时读数不足以说明问题;容器环境还要确认命令所在的网络命名空间与实际承担防火墙或 NAT 的位置一致。
可用 conntrack -S 查看统计;若未安装 conntrack-tools,也可读取 /proc/net/stat/nf_conntrack。检查时同时观察内存与丢包情况,不能仅凭连接数判断需要扩容。
5项参数与状态逐一核实
| 项目 | 核查重点 | 调整思路 |
|---|---|---|
| nf_conntrack_max | 表项上限,常见路径为 /proc/sys/net/netfilter/nf_conntrack_max。 | 确认高峰占用是否持续逼近上限;扩容前估算额外内存,避免挤压业务进程。 |
| nf_conntrack_buckets | 哈希桶数量;常见系统可从 /sys/module/nf_conntrack/parameters/hashsize 查看。 | 桶过少可能增加查找冲突。它通常是模块参数,能否运行时修改取决于内核和模块状态;不要把它当成普通 sysctl。 |
| nf_conntrack_tcp_timeout_established | 已建立 TCP 连接的跟踪保留时间。 | 只有确认业务允许空闲连接更早过期时才缩短;过短可能中断长时间空闲但仍有效的连接。 |
| nf_conntrack_tcp_timeout_close_wait | TCP 处于 CLOSE_WAIT 状态时的跟踪时间。 | 结合应用关闭连接的行为判断。大量 CLOSE_WAIT 也可能是应用未及时关闭套接字,调短超时不能替代排查。 |
| nf_conntrack_udp_timeout | 普通 UDP 跟踪项的超时;相关 sysctl 名称通常带 net.netfilter 前缀。 | 根据无连接协议的报文间隔设置,缩短可较快释放闲置表项,但可能影响间歇通信。 |
超时项在不同内核版本中名称、默认值和可用性可能不同,以本机 sysctl -a 输出及内核文档为准。nf_conntrack_count 是当前使用量,不是上述可调参数,但应与上限一起监控。
按风险从低到高调整
- 记录基线:保存当前值,连续采集 count、max、conntrack 统计、内存和丢包;确认是否有流量突增或异常连接来源。
- 评估容量:依据实际表项增长和可用内存决定是否提高 nf_conntrack_max。单个表项的内存开销会随内核、架构及功能配置变化,不宜套用固定的“每项字节数”;可结合 slab 使用情况估算。
- 检查桶配置:查看 hashsize 与 max 的关系及系统启动配置。若需改模块参数,先核对发行版启动方式和变更是否需要重载或重启;生产环境不要贸然卸载正在承载连接的模块。
- 审慎改超时:先从确实闲置且业务可容忍的协议状态入手,小幅调整并观察连接失败、重连和表项回落情况。不要为追求低占用而统一缩短所有超时。
- 验证并留回滚:高峰后复查表项峰值、内存和应用错误;不符合预期时恢复记录值。配置持久化前,先确认临时 sysctl 调整有效且重启后加载顺序正确。
扩容不是所有攻击的解法
提高上限只增加可跟踪状态的容量,不能消除攻击流量,也可能让恶意连接占用更多内存。若表项未接近上限,应转查 CPU、软中断、网卡队列、应用连接池或上游链路;若确认是连接跟踪耗尽,则结合边界过滤、限速和上游清洗等措施处理。攻击流量高峰期连接跟踪表容量与内核参数调优应以监测结果为依据,而不是只追求更大的数字。
常见问题
改大 nf_conntrack_max 会立即生效吗?
通过 sysctl 修改通常可运行时生效;持久化方式取决于发行版配置。先用 sysctl 查询确认结果,并验证重启后的配置。
nf_conntrack_max 和 hashsize 必须按固定比例设置吗?
没有适用于所有内核与工作负载的固定比例。检查本机默认关系、内核版本和实际冲突或查找压力,再决定是否需要调整桶数。
表项数没到上限,仍然出现连接失败怎么办?
检查防火墙规则、路由、监听队列、内存、CPU 与链路丢包;同时确认报错是否来自 conntrack。容量参数无法修复其他层的问题。