公交迷网 - 巴士之家

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索

ping: sendmsg: Operation not permitted

已有 1588 次阅读2008-1-18 11:55 |个人分类:疑难杂症

今天遇到这个问题,导致外部机器ping服务器丢包严重
google到了如下信息

IP_conntrack表示连接跟踪数据库(conntrack database),代表NAT机器跟踪连接的数目,连接跟踪表能容纳多少记录是被一个变量控制的,它可由内核中的ip- sysctl函数设置。每一个跟踪连接表会占用350字节的内核存储空间,时间一长就会把默认的空间填满,那么默认空间是多少?在内存为64MB的机器上是4096,内存为128MB是 8192,内存为256MB是16384,那末就能在/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
按照此方法改变后一切正常,要是再满了可以加大其值.
不过增大表可能造成性能下降。不要设得太大哦。




echo 21600 >/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
这个参数是连接超时,默认超时时间是5天,也就是432000秒,现在把它改成21600,就是6小时,在6小时后清除掉无效的连接
过几天就出现iptables full是说hash表已经被占满了,里面包括许多超时的连接,这其中基本100%已经是无效的了。
上面这行用来调整超时。
对已经建立的连接无效,已经建立的超时连接会在5天期满以后自动清除掉
所以你最好是在空闲的时候重新启动一下机器。
可以把上面这一句写在/etc/rc.d/rc.local文件里,每次启动自动执行一下

发表评论 评论 (1 个评论)

回复 夏天天 2008-8-22 17:42
前几天公司网络很不稳定,Linux和FreeBSD网关频频出现掉包的问题.
Linux的dmesg为: ip_conntrack: table full, dropping packet.
但在FreeBSD下好象什么错都没报,想想物理内存有512M之多,应该不会是内存不够的问题.
Linux网关有报错信息,问题很快便解决了;可由于FreeBSD没有报错, 起初还以为是网卡出现物理问题呢,后来试着修改了ipfilter的参数后问题便解决了.看来无论是iptables还是ipfilter都有一点设计上的缺憾,那就是不能够动态地根据物理内存的大小来调整NAT跟踪表的大小.
Linux的解决方法:
在开启了NAT的功能后, iptables会维护一张映射关系表, 这个表的默认条目大小是20408,而且对于每个条目要保存一定的时间(大概是两天或者是五天,偶不是很记得了:D). 根据自身的实际经验得知,这个大小只可为300人以下的网络提供正常的NAT服务.如果网络规模超过300人,便会出现ip_conntrack: table full, dropping packet, 也就是说网络就会出现掉包的问题,从而导致网速比蜗牛还慢. 重启虽然可以暂解决问题(只有重启才能清空ip_contrack表),但时间一长问题又会重新出现,所以我们需要一个治本的方法.
因为是ip映射表满了,所以为了解决问题,我们就需要扩大表的容量, 默认的映射表大小为20408, 我们把它改为原来的四倍好了(如果机器内存特别小的话,改动这个值时就需要注意了,不要一下子改成太大,要一点一点的往上改,防止系统出现问题):
#echo "81632" > /proc/sys/net/ipv4/ip_conntrack_max
这只是临时地改变了表的大小,系统并不保存, 重启后表的大小又会变回为默认值. 下面我们来修改/etc/sysctl.conf来永久改变跟踪表的大小:
如果该文件里有net.ipv4.ip_conntrack_max这一项的话,将其值改为81632即可, 如果没有则后动加入net.ipv4.ip_conntrack_max = 81632
FreeBSD的解决方法:
修改/sys/contrib/ipfilter/netinet/ip_nat.h,去掉LARGE_NAT前面的注释,将其改为#define LARGE_NAT
修改/sys/contrib/ipfilter/netinet/ip_state.h
IPSTATE_SIZE 64997
IPSTATE_MAX 45497  
注意:
(1)IP_STATE_MAX=IPSTATE_SIZE*0.7左右  
(2)第一个可以调到六位数, 但不要太贪心哦,否则可能会由于内存不足而出现问题  
(3)值都要是质数

手机版|小黑屋|公交迷网 ( 苏ICP备18015221号

GMT+8, 2024-6-1 10:26

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

返回顶部