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
位则x
为32
其默认值为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表
iptables
的raw
表是不做数据包的链接跟踪处理的,并且优先级是最高的,可以把那些连接量非常大的链接加入到 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