最新消息:

Linux NAT ip_conntrack: table full

Linux admin 1浏览

Web服务器用了一段时间,随意间使用dmesg命令后竟然发现了一些奇怪的内核日志,如下:
ip_conntrack: table full, dropping packet.

后来才知道, Linux TCP 的 ip_conntrack 模块会记录 tcp 通讯协议的 established connection 记录, 而且默认 timeout 时间长达五天 (432,000 秒), 由于Web站点使用memcached因此怀疑一些TCP链接从来就没有释放过,所以导致这种问题。

解决方法 (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

相关日志用 iptables 屏蔽来自某个国家的 IP
iptables 端口转发
iptables的相关概念和数据包的流程
ip_conntrack: table full, dropping packet

最后编辑: selboo 编辑于2011/08/21 01:36

转载请注明:爱开源 » Linux NAT ip_conntrack: table full