Chinaunix首页 | 论坛 | 博客
  • 博客访问: 180770
  • 博文数量: 55
  • 博客积分: 207
  • 博客等级: 入伍新兵
  • 技术积分: 320
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-23 19:33
文章分类
文章存档

2012年(53)

2011年(2)

分类:

2012-06-13 23:42:18

原文地址:iptables限制同一IP连接数 作者:ygl23

新版的 iptables 有个好用简单又有效率的功能,可以设定它阻止瞬间联机太多的来源 IP。这种阻挡功能在某些很受欢迎的,特别像是大型讨论区网站,每个网页都遭到「无知却故意」的人士。一瞬间太多的链接访问,导致服务器呈现呆滞状态。
这时,就需要下列的三行指令:
iptables -I INPUT -p tcp --dport 80 -d SERVER_IP -m state --state NEW -m recent --name httpuser --set

iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 50 -j LOG --log-prefix 'HTTP attack: '

iptables -A INPUT -m recent --update --name httpuser --seconds 60 --hitcount 50 -j DROP
其中 SERVER_IP 换上被攻击的服务器 IP。
1.    第一行的意思是:-I,将本规则插入到 INPUT 链里头的最上头。什么样的规则呢?只要是 TCP 性质的联机,目标端口是80,目标 IP 是我们机器的IP,刚刚新被建立起来时,我们就将这个联机列入 httpuser 这分清单中。
2.    第二行的意思是:-A,将本规则附在 INPUT 链的最尾端。只要是60秒内,同一个来源连续产生多个联机,到达第49个联机时,我们对此联机留下 Log记录。记录行会以 HTTP attack 开头。每一次的本规则比对, –update 均会更新 httpuser 清单中的列表。
3.    第三行的意思是:-A,将本规则附在 INPUT 链的最尾端。同样的比对条件,但是本次的动作则是将此联机给断掉。
所以,这三行规则表示,我们允许一个客户端,每一分钟内可以接上服务器49个。具体数值可以看管理者决定。这些规则另外也可以用在其它对 Internet 开放的联机服务上,例如 port 22 (SSH), port 25 (smtp email)。
为 什么新版的 iptables 它在阻挡上很有效率呢?因为在旧版的 iptables 中,并没有这些新模块功能,导致我们得需要使用操作系统的 Shell 接口,周期性地执行网络检查与拦阻动作。 前者只动用到网络层的资源,而后者已经是应用层的大量(相对而言)运算。试想,服务器都已经给白目客户操翻天了,哪还有余力周期性地呼叫软件层级的计算, 来阻挡白目客户呢?
如果下上述指令时,得到下列错误:
iptables: Invalid argument. Run `dmesg' for more information.
增加 xt_recent模块 --hitcount parameter(默认值为20)的最大值,选项 ip_pkt_list_tot=50就ok了,默认值可以查看/sys/module/xt_recent/parameters/ip_pkt_list_tot

iptables: No chain/target/match by that name
这表示, kernel 在编译时,没有将 iptables module 功能勾选。要重新勾选再编译哦~~~另一个可能是,您使用的服务器,该服务公司所提供的共享核心中,并没有打开此功能,但因为是核心共享…所以…没有权利重新编译核心。

参考:linux中Iptables限制同一IP连接数防CC/DDOS攻击方法


iptables的connlimit功能(限制端口连接数)

LINUX 如何限制某 端口的IP连接次数,用iptables来限制的规则:
iptables -I INPUT -p tcp --dport 目标端口  -m connlimit --connlimit-above 10 -j REJECT

[root@localhost ~]# iptables -I INPUT -p tcp --dport 8000 -m connlimit --connlimit-above 4 -j REJECT

[root@localhost logs]# uname -a
Linux localhost 2.6.32-431.11.25.el6.ucloud.x86_64 #1 SMP Tue Jul 19 10:06:12 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost logs]# cat /etc/issue
CentOS release 6.5 (Final)
Kernel \r on an \m

1.限制与80端口连接的IP最大连接数为10,可自定义修改。
  1. iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 10 -j DROP
2.使用recent模块限制同IP时间内新请求连接数,recent更多功能请参考:Iptables模块recent应用。
  1. iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j LOG --log-prefix 'DDOS:' --log-ip-options
  2. #60秒10个新连接,超过记录日志。
  3. iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --rcheck --seconds 60 --hitcount 10 -j DROP
  4. #60秒10个新连接,超过丢弃数据包。
  5. iptables -A INPUT -p tcp --dport 80 --syn -m recent --name webpool --set -j ACCEPT
  6. #范围内允许通过。

上面的相对比较简单,下面我来分析更具体的配置方法。/Redhat/Fedora,在服务器执行

  1. vi /etc/sysconfig/iptables
  2. 删除原来的内容输入如下内容 保存
  3. # Generated by iptables-save v1.3.5 on Sun Dec 12 23:55:59 2010
  4. *filter
  5. :INPUT DROP [385263:27864079]
  6. :FORWARD ACCEPT [0:0]
  7. :OUTPUT ACCEPT [4367656:3514692346]
  8. -A INPUT -i lo -j ACCEPT
  9. -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
  10. -A INPUT -p icmp -j ACCEPT
  11. -A INPUT -s 127.0.0.1 -j ACCEPT
  12. -A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –set –name WEB –rsource
  13. -A INPUT -p tcp -m tcp –dport 80 -m state –state NEW -m recent –update –seconds 5 –hitcount 20 –rttl –name WEB –rsource -j DROP
  14. -A INPUT -p tcp -m multiport –ports 21,22,80 -j ACCEPT
  15. -A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m ttl –ttl-eq 117 -j DROP
  16. -A INPUT -p tcp -m tcp –tcp-flags SYN,RST,ACK SYN -m length –length 0:40 -j DROP
  17. -A INPUT -p tcp -m tcp ! –tcp-flags SYN,RST,ACK SYN -m state –state NEW -j DROP
  18. COMMIT
  19. # Completed on Sun Dec 12 23:55:59 2010
说明此设定仅对外开放21(FTP),22(SSH),80(http网站)三个TCP端口。设置80端口5秒内20个连接





阅读(3188) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~