http://blog.yorkgu.me/2012/02/09/kernel-nf_conntrack-table-full-dropping-packet/
综合:ip_conntrack就是linux NAT的一个跟踪连接条目的模块,ip_conntrack模块会使用一个哈希表记录 tcp 通讯协议的 established connection记录,当这个哈希表满了的时候,便会导致nf_conntrack: table full, dropping packet错误。
解决办法如其所述,对ip_conntrack的两个参数进行设置即可,不过在centos上,需要这样设置:
1
2
3
4
5
|
vi /etc/sysctl .conf
net.ipv4.netfilter.ip_conntrack_max = 655350 net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1200 #默认超时时间为5天,作为一个主要提供HTTP服务的服务器来讲,完全可以设置得比较短 sysctl -p # 让刚刚修改过的设置生效
|
至于为什么会有这样的设置,这个设置的作用是什么,就要从NAT说起了。NAT(Network Address Translation,网络地址转换)是将IP数据报报头的IP地址转化成另外一个IP地址的过程,主要用来实现局域网内的机器访问公共网络(俗称外网)的功能。公共IP地址是指在因特网上全球唯一的IP地址,RFC 1918协议还为局域网预留出了三个IP不会在公网上进行分配的地址块:
- 10.0.0.0~10.255.255.255
- 172.16.0.0~172.31.255.255
- 192.168.0.0~192.168.255.255
这些IP地址就可以用来分配给局域网上的各种设备,这些设备在访问外网时,就需要通过一台NAT服务器进行路由转换,通常情况下,路由器就兼备了这样一个功能。除了路由器,也可以配置linux服务器实现NAT功能。ip_conntrack就是linux NAT的一个跟踪连接条目的模块,ip_conntrack模块会使用一个哈希表记录 tcp 通讯协议的 established connection记录,当这个哈希表满了的时候,便会导致nf_conntrack: table full, dropping packet错误。
关于如何优化conntrack模块,有一篇文章对此进行了解释,Netfilter conntrack performance tweaking, v0.8,为了访问方便,我这里也留一个备份地址 netfilter_conntrack_perf-0.8.txt。
查看目前 ip_conntrack 配置的值
1
2
|
> cat /proc/sys/net/ipv4/ip_conntrack_max
> cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
|
查看目前 ip_conntrack buffer 的使用状况
1
2
3
|
> cat /proc/sys/net/ipv4/netfilter/ip_conntrack_count
> grep ip_conntrack /proc/slabinfo
ip_conntrack 38358 64324 304 13 1 : tunables 54 27 8 : s |