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 性能优化常用设置...
#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"