在做NAT的机器上处理ip_conntrack满的方法 ( 原 创 )

发表于:2007-07-04来源:作者:点击数: 标签:
conntrack表满的处理方法 前段时间配置的iptables+squid做的proxyserver,一直工作正常。今天我上控制台上发现 Jun1812:43:36red-hatkernel:ip_conntrack:tablefull,droppingpacket. Jun1812:49:51red-hatkernel:ip_conntrack:tablefull,droppingpacket. Jun1

conntrack 表满的处理方法
     前段时间配置的iptables+squid做的proxy server ,一直工作正常。今天我上控制台上发现
Jun 18 12:43:36 red-hat kernel: ip_conntrack: table full, dropping packet. 
Jun 18 12:49:51 red-hat kernel: ip_conntrack: table full, dropping packet. 
Jun 18 12:50:57 red-hat kernel: ip_conntrack: table full, dropping packet. 
Jun 18 12:57:38 red-hat 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
按照此方法改变后一切正常,要是在满了可以加大其值.

 pdiunix 回复于:2004-07-16 11:56:07
写的好,支持原创!!

 llzqq 回复于:2004-07-16 12:43:37
已经加到“一句话问答”中了

 散步的风 回复于:2004-07-16 15:43:25
这个早就知道,这个解决办法只是一个堵的办法,有没有办法输导啊。就是超过之后自动覆盖以前的内容。仅仅增大表的数量不是终极的解决方案啊。就算你设置的再大,他终究有一天会满的。没有办法,我再公司的设置(公司大概有将近1k的电脑)是每隔1个月就重新启动一次服务器,郁闷!

 q1208c 回复于:2004-07-16 15:56:26
小声问一下楼上的"风"兄弟,它自己不会清空的么?一直加下去的么?

 q1208c 回复于:2004-07-16 16:06:58
刚刚看了一下我的,那个表里的项是会少的。就是当一个连接结束时,就从表时删了呀!

 coco520 回复于:2004-07-19 16:48:10
里面的tcp连接缺省的timeout时间使5天,对于主要数据使http协议来说太长了,你可以把它调短一些,我现在调成5分钟,暂时没出什么问题。:)

 test_tmp 回复于:2004-07-20 08:58:44
小声问一下楼上的,如何调成5分钟呀!谢谢!

 nozxb 回复于:2004-07-20 09:20:53
:)

 saman 回复于:2004-07-22 16:46:39
[quote:44744beb2b="test_tmp"]小声问一下楼上的,如何调成5分钟呀!谢谢![/quote:44744beb2b]
需要重新编译一下内核,具体的方法网上查查吧,很久以前做过,忘了。
个人觉得最好的办法还是加大内存,1G足够了。偶尔再重启一下。

 散步的风 回复于:2004-07-25 12:41:01
[quote:4766926c65="saman"]
需要重新编译一下内核,具体的方法网上查查吧,很久以前做过,忘了。
个人觉得最好的办法还是加大内存,1G足够了。偶尔再重启一下。[/quote:4766926c65]

能不能给个提示?

 huter 回复于:2004-09-14 09:37:56
升级内核就可以防止 ip_conntrack满的问题,我的NAT上96M内存也不需要重启。

 双眼皮的猪 回复于:2005-01-06 09:35:17
不是你的nat上多大内存也不需要重新启动,跟踪的连接数不多,32m也不需要重新启动的...

至于解决办法,建议先读一读tcpip详解,楼主的这种解决办法这能缓,不能真正有效果...

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

不需要重新编译内核吧,一般只是在/proc/sys/net/ipv4里边这些参数微调一下就行了 ...但重新启动就没效果了
希望在启动后也有效,加到/etc/sysctl.conf里改一下...

 skylove 回复于:2005-01-16 23:54:28
网关定时帮用户主动帮着释放连接就是了嘛...哦呵呵
hping命令出马,谁与争锋,去linuxforum看吧,那里的斑竹写了个方法,我都用了n个月了...

 platinum 回复于:2005-01-17 08:16:46
下载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 $1 ] ; then 
exit 
fi 
 
grep -E "^tcp .{10,25}ESTABLISHED src=$1 " /proc/net/ip_conntrack | while read line ; do 
S_IP=`echo $line | awk '{print substr($5,5)}'` 
S_SOCK=`echo $line | awk '{print substr($7,7)}'` 
D_IP=`echo $line | awk '{print substr($6,5)}'` 
D_SOCK=`echo $line | awk '{print substr($8,7)}'` 
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 

就可以清除显示的连接. 

摘自:中国Linux论坛

 xuhehao 回复于:2005-01-17 08:29:31
[quote:eac94819e5="cgweb"]那样设置是不会保存的,要重启后保存可以在/etc/sysctl.conf中加: 
net.ipv4.ip_conntract_max =81920 
按照此方法改变后一切正常,要是在满了可以加大其值.
[/quote:eac94819e5]

net.ipv4.ip_conntract_max =81920
是这个语法吗?还是
net.ipv4.ip_conntrack_max =81920  :shock:

原文转自:http://www.ltesting.net