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 可以查看挂载的模块

原文地址:https://www.cnblogs.com/itfenqing/p/7953521.html