今天由于一台web服务器出现了ip_conntrack表满的情况。已经将/proc/sys/net/ipv4/ip_conntrack_max设置为65536,但是还是满了,按照网上文章知道,通过减小/proc/sys/net/ipv4/netfilter、ip_conntrack_tcp_timeout_established的值,可以让队列释放,但是这个应该是以后的队列才可以的。网上又有文章通过hping2来进行清理,于是我进行了测试:
- #!/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 > /root/1.log 2>&1 &
-
done
OS:rhel5.3 x64
首先下载hping2.0.0-rc3.tar.gz
tar zxvf hping2.0.0-rc3.tar.gz
cd cd hping2-rc3/
./configure
make
# make
gcc -c -O2 -Wall -g arsglue.c
在包含自 ars.h:18 的文件中, 从 arsglue.c:5:
byte***.h:22:3: 错误:#error can not find the byte order for this architecture, fix byte***.h
在包含自 arsglue.c:5 的文件中:
ars.h:180:2: 错误:#error "Please, edit Makefile and add -DBYTE_ORDER_(BIG|LITTLE)_ENDIAN"
]ars.h:244:2: 错误:#error "Please, edit Makefile and add -DBYTE_ORDER_(BIG|LITTLE)_ENDIAN"
先放弃,找rpm版的,安装和容易,但是又出问题了,
于是继续 google
http://blog.chinaunix.net/space.php?uid=374372&do=blog&id=89970
说需要修改
getlhs.c,于是我是用双网卡做bonding主备的,所以修改为
- int get_linkhdr_size(char *ifname)
-
{
-
-
if ( strstr(ifname, "ppp") ) { /* also works for ippp (ISDN) */
-
linkhdr_size = PPPHDR_SIZE_LINUX;
-
return 0;
-
} else if ( strstr(ifname, "eth") ) {
-
linkhdr_size = ETHHDR_SIZE;
-
return 0;
-
} else if ( strstr(ifname, "bond") ) {
-
linkhdr_size = ETHHDR_SIZE;
-
return 0;
-
} else if (strstr(ifname, "ets")) {
-
linkhdr_size = 0;
-
return 0;
-
} else if ( strstr(ifname, "lo") ) {
-
linkhdr_size = LOHDR_SIZE;
-
return 0;
-
} else if (strstr(ifname, "atm")) {
-
linkhdr_size = 0;
-
return 0;
-
} else if ( strstr(ifname, "wlan") ) {
-
linkhdr_size = WLANHDR_SIZE;
-
return 0;
-
}
-
else
-
return -1;
-
}
于是开始google,但是也没有找到有用的结果,经过我分析,应该是gcc 不知道是(BIG|LITTLE)_ENDIAN" 导致的,于是将hping2拷贝到我32位的虚拟机上面去测试,make很正常,于是我确定是gcc 无法识别,打开byte***.h修改
- /* Original code from the Linux C library */
-
/* Copyright (C) 2000,2001 Salvatore Sanfilippo <antirez@invece.org>
-
* This code is under the original GNU C library license (GPL) */
-
-
/* $Id: byte***.h,v 1.3 2003/07/28 09:00:55 njombart Exp $ */
-
-
#ifndef ARS_BYTE***_H
-
#define ARS_BYTE***_H
-
-
#if defined(__i386__) \
-
|| defined(__x86_64__) \
-
|| defined(__alpha__) \
-
|| (defined(__mips__) && (defined(MIPSEL) || defined (__MIPSEL__)))
-
#define BYTE_ORDER_LITTLE_ENDIAN
-
#elif defined(__mc68000__) \
-
|| defined (__sparc__) \
-
|| defined (__sparc) \
-
|| defined (__PPC__) \
-
|| defined (__BIG_ENDIAN__) \
-
|| (defined(__mips__) && (defined(MIPSEB) || defined (__MIPSEB__)))
-
#define BYTE_ORDER_BIG_ENDIAN
-
#else
-
# error can not find the byte order for this architecture, fix byte***.h
-
#endif
-
-
#endif /* ARS_BYTE***_H */
红色部分增加x86_64的判断。
重新
./configure
make
make strip
make install
一切OK,同时清理ip_conntrack也成功了,但是发现一个问题,并不是一次就能彻底清理的,需要多执行几次脚本,也许是队列里面太多的原因吧。
阅读(5805) | 评论(0) | 转发(0) |