最近公司activemq服务器默认连接了N个TCP连接,看了下有几百个都是同一个IP,后面确认了是合作商的消费端有问题,没几条消息竟然创建了N个连接来接收消息,哥你这代码写得也太破了吧。像这种情况你去让他们改代码可想而知不太可能,只能在服务端这边做限制了,等到他们发现用不了的时候,自己就会乖乖的去改了。
用到了强大的iptables,但默认的iptables并没有connlimit这个模块,应该是跟系统版本有关,服务器的系统版本为:
[root@web01 ~]# uname -r
2.6.18-128.el5PAE
[root@web01 ~]# iptables –version
iptables v1.3.5
以下为参考了网上教程并在本地做了测试通过:
需要三样东东,系统内核源码、iptables源码和connlimit的补丁包,可通过以下地址下载:
wget https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.18.tar.gz –no-check-certificate
wget ftp://ftp.netfilter.org/pub/iptables/iptables-1.3.5.tar.bz2
wget ftp://ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20080214.tar.bz2
解压,操作开始
cd /zd/setup/patch-o-matic-ng-20080214 进入补丁包
export KERNEL_DIR=patch-o-matic-ng-20080214 指定内核源码和iptables源码的位置变量
export IPTABLES_DIR=/zd/setup/iptables-1.3.5
./runme –download 下载connlimit模块
./runme connlimit 应用connlimit补丁到内核,选y
cd patch-o-matic-ng-20080214
Connections/IP limit match support (IP_NF_MATCH_CONNLIMIT) [N/m/?] (NEW) m
提示新加入了connlimit的选项,问是否需要编译进入内核的时候,输入“m”,编译为模块
这里有很多提示,除了上面那个填m之外,可以一直按回车确认。
make modules_prepare
mv net/ipv4/netfilter/Makefile net/ipv4/netfilter/Makefile.orig ####备份原来的Makefile,里面包含了原始的编译信息,直接编译会无法通过
vi net/ipv4/netfilter/Makefile 创建新的makefile,内容如下:
=======================
obj-m := ipt_connlimit.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
=======================
make M=net/ipv4/netfilter/ 重新编译netfilter
cp net/ipv4/netfilter/ipt_connlimit.ko /lib/modules/2.6.18-128.el5PAE/kernel/net/ipv4/netfilter/ 将生成的ko模块copy到目标地址,并设置权限
chmod 744 /lib/modules/2.6.18-128.el5PAE/kernel/net/ipv4/netfilter/ipt_connlimit.ko
模块增加完成
##################################################################
##################################################################
depmod –a 测试connlimit模块是否兼容,没有显示说明正常
modprobe ipt_connlimit 加载connlimit模块
[root@etip-test-web01 ~]# lsmod|grep ip 查看是否加载成功
ipt_connlimit 6784 1
ip_conntrack 52897 1 ipt_connlimit
nfnetlink 10713 1 ip_conntrack
iptable_filter 7105 1
ip_tables 17029 1 iptable_filter
ipt_recent 12497 0
ipt_REJECT 9537 1
x_tables 17349 5 ipt_connlimit,ip_tables,ipt_recent,xt_tcpudp,ipt_REJECT
acpiphp 27089 0
dm_multipath 24013 0
scsi_dh 11713 1 dm_multipath
ipv6 261473 309
xfrm_nalgo 13381 1 ipv6
dm_mod 62201 11 dm_multipath,dm_raid45,dm_snapshot,dm_zero,dm_mirror,dm_log
##################################################################
##################################################################
iptables -I INPUT -p tcp –dport 22 -m connlimit –connlimit-above 3 -j REJECT 当22端口连接大于3时拒绝
iptables -I INPUT -p tcp -s 10.124.20.2 –dport 22 -m connlimit –connlimit-above 2 -j REJECT 当某ip连接22端口超过2个时拒绝连接。
下面为转载,原文用的是FORWARD,我个人觉得是INPUT才对,目的地址是服务器本身。
1、限制局域网内每个用户的连接数为50
iptables -I INPUT -p tcp -m connlimit –connlimit-above 50 -j REJECT
2、限制指定局域网用户XXX.XXX.XXX.XXX的连接数为50 (这里的XXX.XXX.XXX.XXX改成大家要限制的用户的IP)
iptables -I INPUT -p tcp -s XXX.XXX.XXX.XXX -m connlimit –connlimit-above 50 -j REJECT
这里举个例子,比如要限制192.168.1.2这个用户的连接数为50
iptables -I INPUT -p tcp -s 192.168.1.2 -m connlimit –connlimit-above 50 -j REJECT
3、限制除用户XXX.XXX.XXX.XXX以外的IP连接数为50 (也就是除了XXX.XXX.XXX.XXX用户不限制其它的都限,这个好吧,可以给自己开特权^_^)
iptables -I INPUT -p tcp -s !XXX.XXX.XXX.XXX -m connlimit –connlimit-above 50 -j REJECT
这里也举个例子,比如要除了不限制192.168.1.2外,限制其它所有用户的连接数为50
iptables -I INPUT -p tcp -s !192.168.1.2 -m connlimit –connlimit-above 50 -j REJECT