分类: LINUX
2014-02-27 20:18:22
转自:
作者: Oracle+Linux专业技术门户
网友提出了一个这样问题,LINUX 如何限制某 端口的IP连接次数,记得前面写过文章,是通过apache模块的方式限制ip的最大连接数,可是如果要限制的端口很多,显然apache模块这个办法就不行了,于是提出了用iptables来限制,给出了一个iptables规则:
iptables -I INPUT -p tcp --dport 目标端口 -m connlimit --connlimit-above 10 -j REJECT
这个规则在没有载入任何iptables模块时,是不能用的,会报类似错误:
[root@localhost ~]# iptables -I INPUT -p tcp --dport 8000 -m connlimit --connlimit-above 4 -j REJECT
iptables: Unknown error 4294967295
这个错误表示,系统内核没有connlimit模块支持!因此,就需要将connlimit加入内核支持,也就是需要给内核打补丁,重新编译iptables和系统内核!
1:先在处下载patch-o- matic-ng补丁,
注意最新并且含有connlimit的补丁包好像是patch-o-matic-ng-20060725.tar.bz2,
之后的补丁包中都没有connlimit补丁;
2:然后下载iptables源代码
... .5-20060823.tar.bz2,
3:最后下载kernel源代码,
编译2.4.x内核一般没有问题,2.6.11以下的似乎也没有什么问题,不过2.6.12开始打补丁时,会提示...的错误。
在打完补丁后使用connlimit模块时会报一个奇怪的错误
“connlimit match: invalid size 0!=16 iptables: Invalid argument”,
而且在编译内核模块时有一些警告"signed//unsigned comparision warnings",
不知道是什么原因,只好换一个低版本内核linux-2.6.15.tar.bz2。
由于redhat as4的内核默认没有 connlimit模块,所以要编译内核,在网上好像有不编译内核给iptables添加模块的办法,但我没成功,只好老老实实编译内核。
4:操作开始:
#cp patch-o-matic-ng-20060725.tar.bz2 iptables-1.3.5-20060823.tar.bz2 linux-2.6.15.tar.bz2 /usr/src/
#bunzip2 -d *.bz2
#tar xvf *.tar
#ln -s iptables-1.3.5-20060823 iptables
#ln -s linux-2.6.15 linux
#cd /usr/src/linux
#make mrproper
#make clean
#cd /usr/src/patch-o-matic-ng-20060725
#./runme connlimit
直接打补丁会报错,
需要修改/usr/src/patch-o-matic-ng- 20060725/patchlets/connlimit/linux-2.6.11/net/ipv4/netfilter/Makefile.ladd
文件,将
obj-$(CONFIG_IP_NF_MATCH_STATE) += ipt_state.o
改为
obj-$(CONFIG_IP_NF_MATCH_TOS) += ipt_tos.o
#./runme connlimit
#cd /usr/src/linux
#make menuconfig
注意:内核参数一定要将Networking-->Networking options --->Network packet filtering(replaces ipchains)--->IP: Netfilter Configuration --->Connections/IP limit match support 选为模块或编译进内核;如果你找不到这一项,那么刚才打补丁没有成功;如果你对多如牛毛的内核选项很烦,你可以用make oldconfig,
5:重启后,试一试命令
iptables -m connlimit -help
iptables -I INPUT -p tcp -m connlimit --connlimit-above 4 -j REJECT
iptables -L
如成功则补丁打成功了。