![如何缓解错误“内核:nf_conntrack:表已满,丢弃数据包”](https://linux22.com/image/56683/%E5%A6%82%E4%BD%95%E7%BC%93%E8%A7%A3%E9%94%99%E8%AF%AF%E2%80%9C%E5%86%85%E6%A0%B8%EF%BC%9Anf_conntrack%EF%BC%9A%E8%A1%A8%E5%B7%B2%E6%BB%A1%EF%BC%8C%E4%B8%A2%E5%BC%83%E6%95%B0%E6%8D%AE%E5%8C%85%E2%80%9D.png)
最近,我们的一台服务器(Debian Squeeze)在高负载期间变得无响应,出现了问题。查看内核日志,我认为原因是这样的:
kernel: nf_conntrack: table full, dropping packet
据我了解,这是 conntrack 模块,它对连接进行一些状态跟踪,报告用于存储连接详细信息的表已满。
根据我所做的研究,似乎有两种方法可以缓解这种情况:
增加表的大小。
从系统中完全删除该模块。
但是,本机上既不存在/proc/sys/net/ipv4/ip_conntrack_max
也不/proc/sys/net/ipv4/netfilter/ip_conntrack_max
存在( 下没有ipv4
目录net
)。
如果我这样做,lsmod
我不会得到任何结果。
所以,我有点困惑 - 也许有人可以帮我澄清一下情况?
- 是否安装了conntrack?如果有的话,设置在哪里?为什么它没有出现在 lsmod 中?
- 如果未安装 conntrack,什么会发出表已满消息?
谢谢
答案1
我在运行 Ubuntu 18.04 的服务器上遇到了同样的问题。即使该nf_conntrack
模块在启动时未加载,但随后在流量高峰期间,消息也会被丢弃 ( nf_conntrack: table full, dropping packet
)。
我不知道禁用该功能的方法,但我最终显式加载了该模块,因此我可以覆盖表大小。
首先,确保nf_conntrack
立即加载它,将其包含在/etc/modules
:
nf_conntrack
然后通过覆盖以下中的默认值来增加其表大小,否则这将取决于服务器的内存大小/etc/sysctl.conf
:
net.netfilter.nf_conntrack_max=262144
net.nf_conntrack_max=262144
核实:
$ cat /proc/sys/net/netfilter/nf_conntrack_max
262144
如前所述,它在 Ubuntu 18.04 上进行了测试,但我希望它也能在 Debian 上运行。
对于一些进一步的背景,为什么nf_conntrack
可能会稍后加载,即使启动后不存在,这个相关答案iptables
有一个示例,其中模块在调用时自动加载。显式添加它可以/etc/modules
消除这种复杂性。