Chinaunix首页 | 论坛 | 博客
  • 博客访问: 163803
  • 博文数量: 68
  • 博客积分: 1410
  • 博客等级: 上尉
  • 技术积分: 650
  • 用 户 组: 普通用户
  • 注册时间: 2005-05-18 11:13
文章分类

全部博文(68)

文章存档

2011年(1)

2006年(21)

2005年(46)

我的朋友

分类: 系统运维

2005-10-26 10:31:19

前几天公司网络很不稳定,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)值都要是质数

阅读(1857) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~