跳转至

nf_conntrack模块


2013-11-30 by dongnan

开始之前

iptables 不同的表中,都会用到 nf_conntrack 模块来进行连接跟踪, 而对应nf_conntrack的数据库为/proc/net/nf_conntrack (RHEL6/CentOS6)。

计算方式

  • conntrack_max=ramsize(bytes)/16384/(x/32)
  • 其中的x为系统地址位数,若操作系统为32位则x32 其默认值为32768
  • 如果操作系统为64位、8G内存,则nf_conntrack_max的为8192×1024×1024/16384/(64/32)=262144

若使用中的连接跟踪数量超过了最大连接数量,超出的部分无法被防火墙所接受, 如果超出了在/var/log/messages文件中将会看到错误消息nf_conntrack: table full,dropping packet, 所以如果你觉得数量不够了,就可以通过增加内存去扩大连接数量上限。而其默认值会根据实际内存的大小而改变。

table full dropping packet

错误信息

在启用了 iptables 的服务器上,流量高的时候经常会出现下面的错误:

ip_conntrack: table full, dropping packet

这个问题的原因是由于服务器收到了大量的连接,在启用了 iptables 的情况下, iptables会把所有的连接都做链接跟踪处理,这样 iptables 就会有一个链接跟踪表,当这个表满的时候,就会出现上面的错误。

当前数量:

wc -l /proc/net/nf_conntrack

269683 /proc/net/nf_conntrack

最大容量:

sysctl net.nf_conntrack_max
net.nf_conntrack_max = 262144

解決方法

调整 net.nf_conntrack_max 参数:

# 编辑文件
vim /etc/sysctl.conf

# 添加如下
net.nf_conntrack_max = 102400

# 立即生效
sysctl -p

使用Raw表

iptablesraw表是不做数据包的链接跟踪处理的,并且优先级是最高的,可以把那些连接量非常大的链接加入到 raw表:

# 假设 IP地址:1.2.3.4 的记录数量非常大
iptables -t raw -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT

ubuntu 系统 conntrack 模块

安装命令

apt-get install conntrack

使用帮助

conntrack -h

举个栗子

# Show the connection tracking table in /proc/net/ip_conntrack format
conntrack -L

# Show the connection tracking table in /proc/net/nf_conntrack format
conntrack -L -o extended

参考

回到页面顶部