案例呈现
某公司的服务器发生故障,首先是网站的带宽跑满,其次是CPU一直上不去。服务器架构只有简单的1个nginx负载和2台web。Web上面是2台有几个tomcat项目包
首先查看阿里云监控的流量图,我们可以看到正常流量。然后突然流量增加:
这里CPU使用率一直特别高,使用top命令来查看进程,发现不是这里的问题。
但是,看到web上面的tomcat项目并没有占用多少资源。开始进行日志查看。
首先查看的是系统错误日志 :
发现好像是洪水攻击,且服务器已经影响到业务。导致无法SSH连接进行管理,当时已设置tcp的连接数,发现设置完成之后好了。但是几分钟之后还是出现问题。
当时把所有的服务器全停了,然后等了半个小时,在次开启,发现一开起几分钟就会出现这种问题:
后来发现一停掉,负载就下去,最后通过nginx负载均衡发现问题 。
在这期间,我查看了阿里云监控的态势感知 :
查看web访问日志,终于发现了问题:
[root@vm-69-6cc2 logs]# grep 07/Sep/2016 mallView_access.log |awk '{a[$1]++}END{for(i in a)print i,a[i]}'
114.111.167.89 60
111.205.180.168 60
60.205.125.164 407876
有一个IP一直在建立连接!
温馨提示:有时只查看web访问日志是不行的,还要查看连接数。
netstat -an|grep "ESTABLISHED"|awk -F "[ :]+" '{print $6}'|sort|uniq -c|sort -rn -k1
设置防火墙拒绝这个IP地址 :
重新启动发现负载正常。
经验分享
防范DDOS攻击脚本
防止SYN攻击(轻量级预防)
iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
iptables -A syn-flood -j REJECT
防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
用Iptables抵御DDOS (参数与上相同)
iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
防范CC攻击
当apache站点受到严重的cc攻击,可以用iptables来防止web服务器被CC攻击,实现自动屏蔽IP的功能。
1.系统要求
(1)LINUX 内核版本:2.6.9-42ELsmp或2.6.9-55ELsmp(其它内核版本需要重新编译内核,比较麻烦,但是也是可以实现的)。
(2)iptables版本:1.3.7
2.安装
安装iptables1.3.7和系统内核版本对应的内核模块kernel-smp-modules-connlimit
3.配置相应的iptables规则
示例如下:
(1)控制单个IP的最大并发连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT #允许单个IP的最大连接数为 30
(2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
4.验证
(1)工具:flood_connect.c(用来模拟攻击)
(2)查看效果:
使用:
watch 'netstat -an | grep:21 | grep<模拟攻击客户机的IP>| wc -l'
实时查看模拟攻击客户机建立起来的连接数,使用:
watch 'iptables -L -n -v | \grep<模拟攻击客户机的IP>'
查看模拟攻击客户机被 DROP 的数据包数。
5.注意
为了增强iptables防止CC攻击的能力,最好调整一下ipt_recent的参数如下:
cat/etc/modprobe.conf options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60
记录1000个IP地址,每个地址记录60个数据包 #modprobe ipt_recent