Web访问超时系统日志打印:nf_conntrack:table full, dropping packet
问题现象
客户端访问web时出现time out。 服务端系统日志/var/log/messages打印kernel: nf_conntrack:table full, dropping packet。
适用场景
本节操作适用于CentOS系统,且系统开启了主机防火墙,其他Linux系统可能存在差异。
约束与限制
本节操作涉及修改系统内核参数,在线修改内核参数会出现内核不稳定,建议修改后在合理的时间重启系统,请评估风险后操作。
根因分析
iptables的connection-tracking模块使用系统内存的一部分来跟踪表中的连接。“table full, dropping packet”表明连接跟踪表已满,不能为新连接创建新的条目,因为没有更多的空间。因此出现“dropping packet”问题。
解决方案是增加连接跟踪条目的数量。
CentOS 6系列操作系统处理方法
- 检查当前正在跟踪的连接数。
cat /proc/sys/net/netfilter/nf_conntrack_count
如果该值达到nf_conntrack_max值则会出现包被丢弃的现象。
- 提高net.netfilter.nf_conntrack_max值(以内存为64G,net.netfilter.nf_conntrack_max值2097152为例)。
sysctl -w net.netfilter.nf_conntrack_max=2097152
执行以下命令确保重启后配置仍然生效。
echo "net.netfilter.nf_conntrack_max = 2097152" >> /etc/sysctl.conf
- 如果conntrack表中的条目数量显著增加(例如以4倍的速度增加),则还应增加存储conntrack条目的哈希表的大小以提高效率。
- 执行以下命令,设置新的哈希大小。
echo "options nf_conntrack expect_hashsize=524288 hashsize=524288" >/etc/modprobe.conf
- 重启iptables。
CentOS 7系列操作系统处理方法
- 执行以下命令,在/etc/modprobe.d/firewalld-sysctls.conf中设置conntrack条目的哈希值。
在CentOS 6及以上版本,计算公式是hashsize = conntrack_max/4
echo "options nf_conntrack expect_hashsize=131072 hashsize=131072" >> /etc/modprobe.d/firewalld-sysctls.conf
了解更多请参考Red Hat Customer Portal。