什么事DDOS攻击?
DDOS攻击它在短时间内发起大量请求,耗尽服务器的资源,无法响应正常的访问,造成网站实质下线。
举例来说就是:我开了一家有五十个座位的重庆火锅店,由于用料上等,童叟无欺。平时门庭若市,生意特别红火,而对面二狗家的火锅店却无人问津。二狗为了对付我,想了一个办法,叫了五十个人来我的火锅店坐着却不点菜,让别的客人无法吃饭。
上面这个例子讲的就是典型的 DDoS 攻击,全称是 Distributed Denial of Service,翻译成中文就是分布式拒绝服务。一般来说是指攻击者利用“肉鸡”对目标网站在较短的时间内发起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。在线游戏、互联网金融等领域是 DDoS 攻击的高发行业。
遭受攻击过程:
晚上10点多收到多次短信报警,网站无法访问,查看服务器状态,cpu占用100%,网络带宽资源一直被占满,尝试登录ecs服务器无法连接,立即登录阿里云后台通过安全组策略设置只允许本机ip访问,登录服务器后查看日志,发下几分钟之内产生几G的日志,趁攻击者不在,立即临时封禁异常流量ip,让网站临时跑起来,但是这个只能临时解决问题,果然没过多久,服务器又无法访问。
处理过程:
1、设置防火墙规则(来自于网络)
#防止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
2、利用iptables的ipset扩展,编写脚本根据实际情况利用nginx日志定时自动屏蔽高频率ip
cat /data/logs/nginx_ipset.sh
#!/bin/bash
FILES="/data/logs/access.log"
#DATE=`date -d '1 minutes ago' +%Y:%H:%M`
DATE=`date -d '1 minutes ago' +%Y:%H:%M`
DATE1=`date +%Y:%H:%M`
grep ${DATE} /data/logs/access.log | awk '{print $1}' | sort | uniq -c | sort -n -k 1 -r | head -n 100 > /data/logs/ip
grep ${DATE1} /data/logs/access.log | awk '{print $1}' | sort | uniq -c | sort -n -k 1 -r | head -n 100 >> /data/logs/ip
NUM=`awk '{print $1}' /data/logs/ip`
IP=`awk '{print $2}' /data/logs/ip`
# 1分钟内单ip访问次数超过30次的ip通过ipset封锁,0.0.0.0请替换不需要限制的成白名单ip
ip=`cat /data/logs/ip | awk '{if($1>30 && $2!="0.0.0.0" ) print $2}'`
for line in $ip
do
echo $line >> /data/logs/black.log
/usr/sbin/ipset -! add allset $line
done
exit 0
然后设置定时任务每分钟执行一次脚本:*/1 * * * * /bin/sh /data/logs/nginx_ipset.sh
如何攻击过于频繁,定时时间可以设置更短,例如每20s执行一次:
* * * * * /bin/sh /data/logs/nginx_ipset.sh
* * * * * sleep 20; /bin/sh /data/logs/nginx_ipset.sh
* * * * * sleep 40; /bin/sh /data/logs/nginx_ipset.sh
3、配置nginx.conf,屏蔽攻击来源的user_agent
以上只是本次攻击所用到的途径,主要是对请求的拦截当然如果遇到更大流量的攻击,可能还要采取以下措施:
4、cookie携带token验证
首先为每个访问者定义一个字符串,保存在Cookies中作为Token,必须要带有正确的Token才可以访问后端服务。当用户第一次访问时,会检测到用户的Cookies里面并没有这个Token,则返回一个302重定向,目标地址为当前页面,同时在返回的Http头中加入set cookies字段,对Cookies进行设置,使用户带有这个Token。
客户端如果是一个正常的浏览器,那么就会支持http头中的set cookie和302重定向指令,将带上正确的Token再次访问页面,这时候后台检测到正确的Token,就会放行,这之后用户的Http请求都会带有这个Token,所以并不会受到阻拦。
客户端如果是CC软件,那么一般不会支持这些指令,那么就会一直被拦在最外层,并不会对服务器内部造成压力。
5、增加服务器资源,带宽扩容,砸钱买服务器服务商的服务(例如阿里云防护等,前提是得有钱...)