nf_conntrack: table full, dropping packet

发布时间 2023-07-11 16:43:47作者: 武平宁

参考:linux 路由跟踪表满错误 nf_conntrack: table full, dropping packet 原理解决方法

说明

ping,dmesg 或者 /var/log/messages日志中这个报错,说明服务器网络方面遇到了瓶颈。
此时查看 cat /proc/sys/net/netfilter/nf_conntrack_maxcat /proc/sys/net/netfilter/nf_conntrack_count的值相等或者非常接近。
但是cpu、mem、DiskIO各方面都还有余力。(一开始我怀疑是宿主机的问题,实际并不是。)

技术深入

  • 连接跟踪的能力由nf_conntrack模块提供,该模块一般不会被开机加载,通过lsmod命令查看,该模块被iptable_nat模块调用,用来实现网络地址转发(NAT)、包过滤和负载均衡(支持随机和轮询)等功能。

  • nf_conntrack 跟踪所有网络连接,记录存储在 1 个哈希表里。
    通过cat /proc/net/nf_conntrack | head -1可以查看记录的详情。

ipv4 2 tcp 6 429397 ESTABLISHED src=192.168.122.1 dst=192.168.122.195 sport=35866 dport=22 src=192.168.122.195 dst=192.168.122.1 sport=22 dport=35866 [ASSURED] mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2

  • nf_conntrack跟踪所有网络连接,所以 ping 本机也会留下一条记录:

ipv4 2 icmp 1 25 src=127.0.0.1 dst=127.0.0.1 type=8 code=0 id=20087 src=127.0.0.1 dst=127.0.0.1 type=0 code=0 id=20087 mark=0 secctx=system_u:object_r:unlabeled_t:s0 zone=0 use=2

问题处理

  • 关闭使用连接跟踪的程序,比如docker、libvirt、防火墙(类似于禁用模块)
  • 调整内核参数
  • 设置不跟踪的连接

在云上环境一般会配置安全组策略,虚机无需另外配置防火墙,所以关闭即可,不能关闭的可以调整 nf_conntrack 相关内核参数。

附录

linux /etc 目录下面 modprobe.d/ modules-load.d/ motd 的作用

  modprobe.d/目录:该目录包含了一些用于配置内核模块加载的文件。在这个目录中,可以创建一些以.conf为后缀的文件,用于指定内核模块的加载选项。这些文件中的配置可以影响到系统启动时内核模块的加载行为。
  modules-load.d/目录:该目录包含了一些用于配置系统启动时自动加载内核模块的文件。在这个目录中,可以创建一些以.conf为后缀的文件,用于指定需要在系统启动时自动加载的内核模块。这些文件中的配置会在系统启动时被读取,并相应地加载指定的内核模块。
  motd文件:motd是"Message of the Day"的缩写,意为每日消息。在Linux系统中,motd文件用于在用户登录时显示一些系统相关的信息,如系统版本、登录提示、重要通知等。motd文件可以用于向用户提供一些重要的系统信息或者警告。

总结起来,modprobe.d/目录用于配置内核模块加载选项,modules-load.d/目录用于配置系统启动时自动加载的内核模块,而motd文件则用于在用户登录时显示系统相关的信息。

使用iptables规则实现负载均衡

随机:(Random balancing)

  iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 -m statistic --mode random --probability 0.33  -j DNAT --to-destination 10.0.0.2:1234
  iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 -m statistic --mode random --probability 0.33 -j DNAT --to-destination 10.0.0.3:1234
  iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017  -j DNAT --to-destination 10.0.0.4:1234

轮询:(Round Robin)
有3个server,3个server轮询处理流量包,则规则配置如下:

  iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 10.0.0.2:1234
  iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 -m statistic --mode nth --every 2 --packet 0  -j DNAT --to-destination 10.0.0.3:1234
  iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 -j DNAT --to-destination 10.0.0.4:1234