开发者社区> 问答> 正文

ip_conntrack: table full, dropping packet 现象解决

a123456678 2016-06-12 14:52:03 1241

周末公司的服务器出现了断网情况,日志信息(var/log/messages)

May 22 20:16:49 web kernel: printk: 1103 messages suppressed.
May 22 20:16:49 web kernel: ip_conntrack: table full, dropping packet.

在网上查了下解决方法

IP_conntrack表示连接跟踪数据库 (conntrack database),代表NAT机器跟踪连接的数目,连接跟踪表能容纳多少记录是被一个变量控制的,他可由内核中的ip- sysctl函数配置。每一个跟踪连接表会占用350字节的内核存储空间,时间一长就会把默认的空间填满,那么默认空间时多少?我以redhat为例在内 存为64MB的机器上时4096,内存为128MB是 8192,内存为256MB是16376,那末就能在/proc/sys/net/ipv4/ip_conntrack_max里查看、配置。
例如:增加到81920,能够用以下命令: 
echo "81920" > /proc/sys/net/ipv4/ip_conntrack_max

那样配置是不会保存的,要重启后保存能够在/etc/sysctl.conf中加: 
net.ipv4.ip_conntract_max =81920
按照此方法改变后一切正常,要是在满了能够加大其值.

修改/proc/sys/net/ipv4/下的一些参数...不让连接存活的时间过长,因为很多都只是http,短连接接到响应就关闭连接了,但是ip_conntrack仍然需要保存

下载hping: 
http://www.hping.org/download.html 

./configure 
make 
make install 

安装后写一个script: 

代码: 
[code:1:204710b32b] 
#!/bin/bash 

echo 
echo "############################" 
echo "# Edit by Youngh 2003.06.24 v1.1 " 
echo "# Usage : clr_conns IpAddress" 
echo "# This will clear all connections from this IP_Address" 
echo "# Example:/root/clr_conns 10.0.3.3 " 
echo "############################" 
echo 

if [ -z ] ; then 
exit 
fi 

grep -E "^tcp .ESTABLISHED src= " /proc/net/ip_conntrack | while read line ; do 
S_IP=`echo $line | awk ''` 
S_SOCK=`echo $line | awk ''` 
D_IP=`echo $line | awk ''` 
D_SOCK=`echo $line | awk ''` 
echo "$S_IP:$S_SOCK $D_IP:$D_SOCK" 

hping2 $D_IP -R -s $S_SOCK -p $D_SOCK -a $S_IP -k -c 1 >/dev/null 2>/dev/null & 

done 
[/code:1:204710b32b] 
保存为clr_conns.sh 

用: 

sh clr_conns.sh x.x.x.x 

就能够清除显示的连接.

网络协议 Shell Linux 数据库 Perl
分享到
取消 提交回答
全部回答(1)
  • a123456678
    2019-07-17 19:34:05

    通过网上查找资料,找到了解决的方法:

    显示当前的会话数:
    cat /proc/net/ip_conntrack | wc -l
    显示系统目前配置的最大 conntrack 数:
    cat /proc/sys/net/ipv4/ip_conntrack_max
    # 一旦前者的数字大于后者时,系统就报错,解决办法:
    echo 81920 > /proc/sys/net/ipv4/ip_conntrack_max
    # 然后写入 /etc/sysctl.conf
    
    sys.net.ipv4.ip_conntrack_max = 81920
    ip_conntrack: table full, dropping packet
    
    ip_conntip_conntrack模块默认的链接超时时间是432000 单位/秒
    net.ipv4.ip_conntrack_max 最大net.ipv4.ip_conntrack是根据内存大小划分的。
    
    调整系统内核 
    vi /etc/sysctl.conf
    net.ipv4.ip_conntrack_max = 81920                  
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 1500
    
    最近一个web系统经常报出如下日志信息:Apr 17 16:37:26 www kernel: printk: 135 messages suppressed.
    
    Apr 17 16:37:26 www kernel: ip_conntrack: table full, dropping packet.
    
    Apr 17 16:37:26 www kernel: ip_conntrack: table full, dropping packet.
    
    Apr 17 16:37:33 www kernel: printk: 139 messages suppressed.
    
    Apr 17 16:37:33 www kernel: ip_conntrack: table full, dropping packet.
    
    Apr 17 16:37:37 www kernel: printk: 60 messages suppressed.
    
    Apr 17 16:37:37 www kernel: ip_conntrack: table full, dropping packet.
    
    Apr 17 16:37:52 www kernel: printk: 19 messages suppressed.
    
    Apr 17 16:37:52 www kernel: ip_conntrack: table full, dropping packet.有丢包现象,应该是系统内核屏蔽了网卡功能,此时系统对外表现为连接时通时断,接着执行如下操作:[root@web ~]# cat /proc/sys/net/ipv4/netfilter/ip_conntrack_max
    
    65536针对这个问题,可调整以下参数:
    
    echo 180 >/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established 
    echo 6553600 >/proc/sys/net/ipv4/netfilter/ip_conntrack_max 
    echo 120 >/proc/sys/net/ipv4/neigh/default/gc_stale_time 
    echo 10240 >/proc/sys/net/ipv4/neigh/default/gc_thresh1 
    echo 40960 >/proc/sys/net/ipv4/neigh/default/gc_thresh2 
    echo 81920 >/proc/sys/net/ipv4/neigh/default/gc_thresh3 
    或
    
    vi /etc/sysctl.conf
    
    net.ipv4.ip_conntrack_max=6553600 
    net.ipv4.netfilter.ip_conntrack_max=6553600 
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait=120 
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait=60 
    net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait=120 
    net.ipv4.neigh.default.gc_thresh1=10240 
    net.ipv4.neigh.default.gc_thresh2=40960 
    net.ipv4.neigh.default.gc_thresh3=81920 
    net.core.rmem_default = 2097152 
    net.core.rmem_max=16777216 
    net.core.wmem_max=16777216 
    net.core.wmem_default = 2097152 

    全部修改完成后,执行/sbin/sysctl -p让参数生效

    0 0

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程