iptables防御DDos攻击处理
vim dropip.sh # 自动提取攻击 ip
#!/bin/bash netstat -na | awk '/ESTABLISHED/{split($5,T,":");print T[1]}' | sort | grep -v -E '192.168|127.0' | uniq -c | sort -rn | head -10 | awk '{if ($2!=null && $1>4) {print $2}}' > /var/log/rejectip for i in $(cat /var/log/rejectip) do rep=$(iptables-save | grep $i) if [[ -z $rep ]];then /sbin/iptables -A INPUT -s $i -j DROP echo "$i kill at `date`">>/var/log/ddos-ip fi done
脚本的执行过程:
- 首先通过 netstat -na 查看所有的连接
- 然后通过 awk 提取所有已经成功建立连接的远程 IP 地址(也就是疑似攻击者的 IP)
- awk 只对拥有 ESTABLISHED 关键字的行做处理
- split 指定处理第五列(也就是远程 IP 的列),将处理的数据存放入 T 数组中,指定以 : 来分隔
- 接着通过 sort 排序,此时会将相同的 IP 放在一起(因为 uniq 统计的时候是按行处理的,分开的相同行处理不到)
- 我们将本地的连接剔除统计
- 随后通过 uniq 命令对相同的 IP 做统计,统计出其出现的次数
- 再通过 sort 命令做反向的排序( -r 参数出现次数高的排前,低的排后)
- 使用 head 命令来读取前十个 IP 地址
- 随后我们再次使用 awk 过滤出连接数超过 4 次的 IP 地址
- 然后将过滤出来的 IP 地址重定向至 /var/log/rejectip 中
- 使用 for 循环读取文本中的 IP 地址
- 首先检查这个 IP 地址是否已经加入了 iptables 的规则中
- 若是已经加入则不处理
- 若是还未加入使用 iptables 将其 drop 掉并记录至日志中
- 首先检查这个 IP 地址是否已经加入了 iptables 的规则中
增加 iptables 规则,并发送 10 个包
#使用 limit 对 syn 的每秒钟最多允许 1 个新链接,接收第三个数据包的时候触发 iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT #或者针对每个客户端做出限制,每个客户端限制并发数为 10 个,这里的十个只是为了模拟,可以自己酌情考虑 iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 10 -j REJECT
SYN 防范配置文件
对于这样类型的攻击,不仅可以从 iptables 来防范,还可以修改 TCP 的一些配置来进行防范。
vim /etc/sysctl.conf # 表示开启 SYN Cookies。当出现 SYN 等待队列溢出时,启用 cookies 来处理,可防范少量 SYN 攻击,默认为 0,表示关闭 net.ipv4.tcp_syncookies = 1 # 表示开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接,默认为 0,表示关闭; net.ipv4.tcp_tw_reuse = 1 # 表示开启 TCP 连接中 TIME-WAIT sockets 的快速回收,默认为 0,表示关闭。 net.ipv4.tcp_tw_recycle = 1 # 表示开启 TCP 连接的最大数量的限制 net.ipv4.tcp_max_tw_buckets = 5000
CC 原理
CC 攻击(ChallengeCollapsar),它的原理就是攻击者控制某些主机不停地发大量数据包给对方服务器造成服务器资源耗尽,一直到宕机崩溃。CC 主要是用来攻击页面,当一个网页访问的人数特别多的时候,打开网页就很慢。而 CC 就是模拟多个用户(多少线程就是多少用户)不停地进行访问那些需要大量数据操作的页面,造成服务器资源的浪费,CPU 长时间处于 100%,一直都有处理不完的连接直至就网络拥塞,正常的访问被中止。
相对于 SYN flood 来说,CC 攻击就是做一次完整的请求,属于 TCP 全连接攻击,攻击者使用“合法”的源 IP 与访问请求,Collapsar 无法判断真假只好放过,但是整个请求非常的消耗资源,如翻阅数据库呀,不停的翻页等等,一次的连接很长,消耗很多的资源的。
4.2 CC 攻击防御方法
- 域名欺骗解析
发现针对域名的 CC 攻击,可以把被攻击的域名解析到 127.0.0.1 这个地址上。因为 127.0.0.1 是本地回环 IP 是用来进行网络测试的,如果把被攻击的域名解析到这个 IP 上,就可以实现攻击者自己攻击自己的目的。
- 更改 Web 端口
Web 服务器通常是通过 80 端口对外提供服务,因此攻击者实施攻击就以默认的 80 端口进行攻击,所以可以通过修改 Web 端口达到防止 CC 攻击的目的。
- IIS屏蔽 IP
通过命令或查看日志来发现 CC 攻击的源 IP,就可以在 IIS 中设置屏蔽该 IP 对 Web 站点的访问,从而达到防范 IIS 攻击的目的。
参考: https://m-zhoujie2.gitbooks.io/-linux-devops-2/content/chapter3-7.html