一次ip_conntrack: table full, dropping packet.问题

images (3)

公司新上的一台nginx负载均衡,晚上高峰连接数达到峰值4W时,网卡DOWN了。外网ping不同VIP和NGINX。
查看nginx Waiting 峰值达到了4W,低谷也有1W5.
解决办法
1.增加内存:修改/etc/sysctl.conf的配置容量 net.ipv4.ip_conntrack_max=大的数值!
2.隔一段时间重新启动系统,清空ip_conntrack
3.对ip_conntrack编程,读取其内容,匹配指定的ip地址,然后调用发包程式发送RST报文,人为的完成tcp连接。用perl实现,调用了一个外部程式hping2,能够从其主页找到,这个程式就是个构包器


用法:cl.pl ipaddress

[php]

#!/usr/bin/perl
$ip = $ARGV[0];
#print $ARGS,$ip;
exit if(!$ip);
open(FH,”ip_conntrack”);
while()
{
if (/^tcp .*ESTABLISHED src=$ip/)
{
#print $_;
@line = split(/=/,$_);
$sip = $line[1];
$sip =~s/ .*//g;
$dip = $line[2];
$dip =~s/ .*//g;
$sport = $line[3];
$sport =~s/ .*//g;
$dport = $line[4];
$dport =~s/ .*//g;
print “$sip:$sport $dip:$dportn”;
`/usr/bin/hping2 $dip -R -s $sport -p $dport -a $sip -k -c 1 >/dev/null 2>/dev/null &`;
}
}
[/php]


Iptables---ip_conntrack的解析
网友对于博文Iptables 应用解析III---实例详解的问题.本来已回评论作解答,无奈评论怎么也显示不到正文中,不知道新浪博客出了什么问题,在此作一博文.希望关心此问题的网友们能满意...
ip_conntrack 是Linux NAT一个跟踪连接条目的模块记录着允许的跟踪连接条目ip_conntrack 模块会记录 tcp 通讯协议的 established connection 记录, 而且预设 timeout 时间长达五天 (432,000 秒).所以局域网中当有人使用p2p类的软件就很容易使ip_conntrack达到最大值...也由此造成:
ip_conntrack: table full, dropping packet.  的错误提示..网关丢弃数据包..网络中断..
具体解决办法如下二种:
1.加大ip_conntrack_max设定值
#modprobe ip_conntrack 需提前加载ip_conntrack模块
#echo "986400" > /proc/sys/net/ipv4/ip_conntrack_max 数值具体多大应计算得出
开机使用新数值..有三种办法:
除vi /etc/rc.local外亦有:
#vi /etc/sysctl.conf 加入: net.ipv4.ip_conntrack_max = 986400
#sysctl -w net.ipv4.ip_conntrack_max=986400

2.减小ip_conntrack timeout 的时限 默认5天即432000s
ip_conntrack_tcp_timeout_established 值默认432000s 即5天
#echo "3600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
开机使用同于上例
#vi /etc/sysctl.conf 加入: net.ipv4.ip_tcp_timeout_established = 3600
#sysctl -w net.ipv4.ip_tcp_timeout_established=3600

另:通过ip_conntrack buffer 使用状况查出局域网中进行p2p下载的主机
查看目前 ip_conntrack buffer 使用状况
#grep conn /proc/slabinfo
结果实例: ip_conntrack 5918 8140 384 10 1:tunables 54 27 0:slabdata 814 814 0 (各值说明如下)
ip_conntrack the cache name
5918 the number of currently active objects
8140 the total number of available objects
384 the size of each object in bytes
814 the number of pages with at least one active object
814 the total number of allocated pages
1 the number of pages per slab are given
man slabinfo 可查询详细说明.
查出目前 ip_conntrack 记录最多的前五名 IP
#cat /proc/net/ip_conntrack | cut -d ' ' -f 10 | cut -d '=' -f 2 | sort | uniq -c |
sort -nr | head -n 5
结果实例:
2987 192.168.1.30
334 192.168.1.52
166 192.168.1.56
99 192.168.1.43
84 192.168.1.46
由此可知, 192.168.1.30占用了绝大多数的ip_connect buffer,推断这个IP的User可能使用了P2P软件

推荐一个清除某IP链接的方法:通过过滤ip_conntrack表得到ESTABLISHED状态过多的ip,用hping工具将这些ip从表中清理掉...
下载: http://www.hping.org/download.html
安装: ./configure;make;make install
hping清理IP链接脚本:(此脚本修改链接状态为closed)
#!/bin/sh
if [ -z $1 ] ; then
echo "NO INPUT IP"
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 > /home/huaying/1.log 2>&1 &
done

对于具体p2p下载产生链接数及ip_connect_max具体设置数值大小推荐以下范文,感兴趣的朋友可以看看...http://www.chinaunix.net/jh/36/596067.html

附:linux NAT 性能优化常用设置...

[php]
#echo "1024 65000" > /proc/sys/net/ipv4/ip_local_port_range
#echo "100 1200 128 512 15 5000 500 1884 2">/proc/sys/vm/bdflush
#echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
#echo "1048576" > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
#echo "1" > /proc/sys/net/ipv4/ip_forward
#echo "268435456" >/proc/sys/kernel/shmall
#echo "536870912" >/proc/sys/kernel/shmmax
#echo "600" > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
#echo "1024" > /proc/sys/net/ipv4/neigh/default/gc_thresh1
#echo "2048" > /proc/sys/net/ipv4/neigh/default/gc_thresh2
#echo "4096" > /proc/sys/net/ipv4/neigh/default/gc_thresh3
#echo "52428800" > /proc/sys/net/ipv4/route/max_size
#echo "1" > /proc/sys/net/ipv4/conf/all/proxy_arp
#echo "1" > /proc/sys/net/ipv4/tcp_window_scaling

[/php]

还没有评论,快来抢沙发!

发表评论

  • 😉
  • 😐
  • 😡
  • 😈
  • 🙂
  • 😯
  • 🙁
  • 🙄
  • 😛
  • 😳
  • 😮
  • emoji-mrgree
  • 😆
  • 💡
  • 😀
  • 👿
  • 😥
  • 😎
  • ➡
  • 😕
  • ❓
  • ❗
  • 67 queries in 0.395 seconds