服务器遭遇DDOS攻击防御实录

什么事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、增加服务器资源,带宽扩容,砸钱买服务器服务商的服务(例如阿里云防护等,前提是得有钱...)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值