ipt_connlimit限制并发,ipt_recent限制单位时间内的请求数目
xt_connlimit(别名ipt_connlimit)
一.Centos5.8系统
需要手动的执行modprobe ipt_connlimit命令把模板加入内核中去.
先查看
#lsmod |grep xt
如未找到xt_connlimit
则执行
#modprobe ipt_connlimit
查看xt_connlimit信息:
#modinfo xt_connlimit
二.Centos6.X
已经包含到了内核中,不需要手动添加了.
三.规则配置示例:
1.connlimit:
connlimit参数:
--connlimit-above n #限制为多少个
--connlimit-mask n #这组主机的掩码,默认是connlimit-mask 32 ,即每个IP.
限制同一IP同时最多100个http连接(默认是B类IP)
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
或
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 100 -j ACCEPT
只允许每组C类IP同时100个http连接
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 --connlimit-mask 24 -j REJECT
限制某IP最多同时100个http连接
iptables -A INPUT -s 222.222.222.222 -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
2.recent(需要的模块是xt_recent)
限制每IP在一定的时间(比如60秒)内允许新建立最多100个http连接数
iptables -A INPUT -p tcp --dport 80 --syn -m recent --name BAD_HTTP_ACCESS --rcheck --seconds 60 --hitcount 100 -j LOG --log-prefix 'DDOS:' --log-ip-options iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 100 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
这个意思是建立一个的区块BAD_HTTP_ACCESS,60秒内允许100个请求;超过这个请求的拒绝;第一行是将超过请求的写入系统日志;
ps:上面recent规则只适用于默认规则为DROP中,如果要适用默认ACCEPT的规则,需要--set放前面 并且无-j ACCEPT
解决hitcount超出的错误
xt_recent: hitcount (100) is larger than packets to be remembered (20)
hitcount的值由/sys/module/xt_recent/parameters下的ip_pkt_list_tot做了限制,但是该文件是个只读文件.
处理办法如下:
在/etc/modprobe.d下新建xt_recent.conf,输入以下内容保存:
options xt_recent ip_list_tot=1024 ip_pkt_list_tot=200
移除xt_recent模块:
modprobe -r xt_recent
再加载该模块
modprobe xt_recent
再次查看
/sys/module/xt_recent/parameters下的ip_pkt_list_tot,发现已经更改为200,需要注意该值不要大于255,否则可能有问题;
附录:
modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。 modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。
-a或--all:载入全部的模块;
-c或--show-conf:显示所有模块的设置信息;
-d或--debug:使用排错模式;
-l或--list:显示可用的模块;
-r或--remove:模块闲置不用时,即自动卸载模块;
-t或--type:指定模块类型;
-v或--verbose:执行时显示详细的信息;
-V或--version:显示版本信息;
-help:显示帮助。
lsmod 可以查看挂载的模块