解決Linux NAT ip_conntrack: table full的方法

原本Linux NAT用得好好的,没想到几天前却出现了无法上网的情况,而系统记录也出现了这样的讯息:

ip_conntrack: table full, dropping packet.

后来才知道, Linux NAT的ip_conntrack模组会记录tcp通讯协定的established connection记录,而且预设timeout时间长达五天(432,000秒),因此只要LAN中有人使用P2P软体(如: eDonkey、BT...)就容易发生这种问题.

解决方法(1):加大ip_conntrack_max值

查出原本的ip_conntrack_max值:
指令: cat /proc/sys/net/ipv4/ip_conntrack_max

写入理想的数值(每一个ip_conntrack buffer会占用292 Bytes)
指令: echo "数值" > /proc/sys/net/ipv4/ip_conntrack_max
例如: echo "81920" > /proc/sys/net/ipv4/ip_conntrack_max
这个效果是暂时的,如果要每次开机都使用新的数值,需将上述指令写入/etc/rc.d/rc.local
或是在/etc/sysctl.conf加入: net.ipv4.ip_conntrack_max =数值
或使用指令: sysctl -w net.ipv4.ip_conntrack_max=数值

解决方法(2):降低ip_conntrack timeout时间

重设ip_conntrack_tcp_timeout_established (原值: 432000,单位:秒)
指令: echo "数值" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
例如: echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established

开机自动设置的作法同方法(1).

其他相关指令:

查看目前ip_conntrack buffer使用状况
指令: grep conn /proc/slabinfo

结果实例: ip_conntrack 3024 4090 384 409 409 1 (各值说明如下)

ip_conntrack the cache name
3024 the number of currently active objects
4090 the total number of available objects
384 the size of each object in bytes
409 the number of pages with at least one active object
409 the total number of allocated pages
1 the number of pages per slab are given

man slabinfo可查询详细说明.

查出目前ip_conntrack记录最多的前五名IP
指令: cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c | sort -nr | head -n 5

结果实例:

2816 192.168.1.100
14 163.30.85.129
6 220.132.142.175
6 127.0.0.1
4 218.187.5.223

由此可知, 192.168.1.100占用了绝大多数的buffer,推断这个IP的User可能使用了P2P软体.

相关推荐