服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

运维之家

 找回密码
 注册
搜索
查看: 4607|回复: 0

解決 Linux “ip_conntrack: table full ,dropping packe

[复制链接]
dirtysea 发表于 2011-11-19 14:59:32 | 显示全部楼层 |阅读模式
用Apache自带的压力测试程序对我的服务器进行测试的时候出现这种情况:
使用命令 ./ar -c100 -n10000 http://localhost/index.php>10000info
第一次测试一切正常,紧接着再次运行上面命令的时候,当运行到Completed 6000 requests的时候标准输出就会出现ip_conntrack: table full, dropping packet。估计是IP连接跟踪功能的相关设定所致,但是却无法下手。google了一下才知道在proc中可以直接查到 ip_conntrack_max的值,输入如下命令:
cat /proc/sys/net/ipv4/ip_conntrack_max
命令输出16280
呵呵,原来如此,怪不得每次重新启动Apache后运行第二次压力测试到6000的时候就会出现table full。但是又想ip_conntrack的跟踪时间总得有个有效时间吧,其实也可以查到输入命令:
cat /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
结果显示432000,呵呵12个小时啊!为什么系统默认的设定是这么久呢?不懂,难道是为了对付慢速扫描的黑客?以后继续研究,解决眼前问题先。
知道原因了,解决起来自然有方法了,方案有两条:1、加大ip_conntrack_max的值。2、减小ip_conntrack_tcp_timeout_established的数值。
对于Apache服务器来说,每天1W的IP访问量,这些访问量应该是集中在12小时的时间段内,每个IP平均10次服务器请求,所以这个值应该在10W左右,呵呵,这么算对不对?先这么办吧!
cat "100000" > /proc/sys/net/ipv4/ip_conntrack_max
这是暂时的效果,如果要每次开机都使用这个数值,将上面的命令写入/etc/rc.d /rc.local或是在/etc/sysctl.conf中加入net.ipv4.ip_conntrack_max = 10000  。或者使用命令 sysctl -w net.ipv4.ip_conntrack_max = 10000
2、设定时间:
echo "数值" >/proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
设定自动开机启用同上。

查出目前ip_conntrack buffer使用状况
命令:grep conn /proc/slabinfo

查出目前 ip_conntrack 记录最多的前五个IP
命令:
cat /proc/net/ip_conntrack | cut -d ' ' -f 10 |cut -d '=' -f2 |sort |uniq -c |sort -nr |head -n 5

上面命令的结果可以让你查出一些异常的IP连接你的apache服务器。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|运维之家

GMT+8, 2024-4-19 23:21 , Processed in 0.087530 second(s), 14 queries .

Powered by Dirtysea

© 2008-2020 Dirtysea.com.

快速回复 返回顶部 返回列表