免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1397 | 回复: 0
打印 上一主题 下一主题

增强Linux iptables和FreeBSD ipfilter的功能 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-26 10:31 |只看该作者 |倒序浏览

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


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/6922/showart_53548.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP