大流量下重启 CentOS6 上的 iptables 应注意 nf_conntrack table full

最近公司搞了一次活动,流量和并发暴增,导致外网不能到达内网的前端服务器nginx,刚开始认为是nginx本身处理并发的能力,

索性把nginx的参数都优化了一边并重启nginx,发现外网还是不能访问,使用tcpdump等调试工具都无法找出原因,连总出口的

防火墙都看了一边,session 数正常,后来想起内网的iptables 是不是被启动了,看了一下/var/log/messages 出现

kernel: nf_conntrack: table full, dropping packet.

报错,索性使用 sudo /etc/init.d/iptables stop 停止 iptables, 但发现还是不行,最后在/var/log/messages 发现

nf_conntrack version 0.5.0 (16384 buckets, 65536 max)

这才意识到是nf_conntrack模块的原因

在root用户下,/etc/init.d/iptables stop 可以解决

因为 iptables 启动脚本 里有 nf_conntrack 模块卸载功能

for mod in ${NF_MODULES_COMMON[*]}; do
 rmmod_r $mod >/dev/null
done

而且在启动 iptables 的时候 默认是加载 nf_conntrack 模块的

所以在大流量下重启 CentOS6 上的 iptables 时应使用以下命令来调整nf_conntrack的最大值

/etc/init.d/iptables restart
sysctl -w "net.netfilter.nf_conntrack_max=655350"
sysctl -w "net.netfilter.nf_conntrack_tcp_timeout_established=600"