iptables限制IP连接数connlimit

最近公司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