nf_conntrack是什么?

问题: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

猜你喜欢

转载自blog.csdn.net/fanren224/article/details/88780311