如何缓解错误“内核:nf_conntrack:表已满,丢弃数据包”

如何缓解错误“内核:nf_conntrack:表已满,丢弃数据包”

最近,我们的一台服务器(Debian Squeeze)在高负载期间变得无响应,出现了问题。查看内核日志,我认为原因是这样的:

kernel: nf_conntrack: table full, dropping packet

据我了解,这是 conntrack 模块,它对连接进行一些状态跟踪,报告用于存储连接详细信息的表已满。

根据我所做的研究,似乎有两种方法可以缓解这种情况:

  1. 增加表的大小。

  2. 从系统中完全删除该模块。

但是,本机上既不存在/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消除这种复杂性。

相关内容