问题:kernel: nf_conntrack: table full, dropping packet
意思是: nf_conntrack表满了,数据包正在被丢弃
分析:
1、nf_conntrack是什么?
nf_conntrack是内核中一个用来记录和跟踪连接状态的模块
2、问题里面的table是什么?
是一个记录各种连接(tcp,udp等)的信息及其状态(ESTABLISHED还是 TIME_WAIT)的一个表。
3、这个表长什么样子?
被跟踪的连接信息记录在/proc/net/nf_conntrack,如下
[root@master1] ~$ cat /proc/net/nf_conntrack
ipv4 2 tcp 6 115 TIME_WAIT src=xx.xx.xx.xx dst=xx.xx.xx.xx sport=54585 dport=9000 src=xx.xx.xx.xx dst=xx.xx.xx.xx sport=9000 dport=54585 [ASSURED] mark=0 zone=3 use=2
ipv4 2 tcp 6 100 TIME_WAIT src=xx.xx.xx.xx dst=xx.xx.xx.xx sport=40460 dport=9000 src=xx.xx.xx.xx dst=xx.xx.xx.xx sport=9000 dport=40460 [ASSURED] mark=0 zone=3 use=2
ipv4 2 tcp 6 431999 ESTABLISHED src=xx.xx.xx.xx dst=xx.xx.xx.xx sport=42482 dport=80 src=xx.xx.xx.xx dst=xx.xx.xx.xx sport=80 dport=42482 [ASSURED] mark=0 zone=3 use=2
tcp是跟踪的协议类型,6很明显是tcp的协议代码,这里conntrack可以跟踪tcp/udp/icmp等各种协议类型。这里115/100/431999 就是该连接的生存时间。在收到新包之前该值会逐渐变小,为0后记录会被删除。 如果收到新包,该值会被重置然后重新计时。
4、为什么系统要跟踪连接状态?
因为它是状态防火墙和NAT的实现基础。
5、怎么查看当前的跟踪连接数量?
cat /proc/sys/net/netfilter/nf_conntrack_count
45
6、产生这个问题的原因是什么?
当前的跟踪数量超过了设置的最大数量。
7、怎么解决这个问题?
1)不用这个模块,不建议使用这个方法。
卸载:
rmmod nf_conntrack
卸载后如果想重新加载:
modprobe nf_conntrack
2) 继续用但是不跟踪连接
filter表里存在但在raw里不存在的,默认会进行连接状态跟踪 。
举例: 对TCP/UDP连接不启用追踪
iptables -t raw -A PREROUTING -p tcp -j NOTRACK
iptables -t raw -A PREROUTING -p udp -j NOTRACK
iptables -t raw -A OUTPUT -p tcp -j NOTRACK
iptables -t raw -A OUTPUT -p udp -j NOTRACK
3)继续用但是优化参数
要解决这个问题,需要了解跟这个模块相关的内核参数。
相关内核参数
nf_conntrack_max 最大跟踪连接数
默认65536,建议设置为理论最大值,大小与机器内存有关,RAMSIZE (in bytes) / 16384 / (ARCH / 32),以64位的64G机器为例,CONNTRACK_MAX = 64*1024*1024*1024/16384/(64/2) = 2097152
[root@master1] ~$ cat /proc/sys/net/netfilter/nf_conntrack_max
65536
nf_conntrack_buckets 哈希桶(表)的个数
默认16384,是max的4分之一
这个参数需要解释一下:
nf_conntrack_max是记录最大数量,但是不可能所以记录都放到同一张表上,因为这样的话,这张表会非常大,不利于查询效率。所以要把记录分为多张表(桶)来存放。 一个桶放四条,所以 nf_conntrack_max = nf_conntrack_buckets * 4
如果nf_conntrack_max 远远大于nf_conntrack_buckets ,就意味着每个桶里面会放很多记录, 也会影响查询效率
[root@master1] ~$ cat /proc/sys/net/netfilter/nf_conntrack_buckets
16384
nf_conntrack_tcp_timeout_established 处于established状态的连接从表中删除的超时时间
该参数会默认跟踪一个记录5天(432000秒),时间到了这个记录就会删除,如果established状态很多,可以调低这个参数的值为1个小时或者半个小时,来加速释放记录数量。 但是如果记录中只有很少的established状态的连接,那么这个参数对降低整个表记录的数量可能会效果不大。
[root@master1] ~$ cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
432000
同上还有这些参数
[root@master1] ~$ cat /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_
nf_conntrack_tcp_timeout_close nf_conntrack_tcp_timeout_max_retrans
nf_conntrack_tcp_timeout_close_wait nf_conntrack_tcp_timeout_syn_recv
nf_conntrack_tcp_timeout_established nf_conntrack_tcp_timeout_syn_sent
nf_conntrack_tcp_timeout_fin_wait nf_conntrack_tcp_timeout_time_wait
nf_conntrack_tcp_timeout_last_ack nf_conntrack_tcp_timeout_unacknowledged