申明:闲暇学习阮一峰老师的博客(http://www.ruanyifeng.com/blog/2018/06/ddos.html),所以想做简单的总结,方便以后查看。
HTTP 请求的特征一般有两种:IP 地址和 User Agent 字段。比如,恶意请求都是从某个 IP 段发出的,那么把这个 IP 段封掉就行了。或者,它们的 User Agent 字段有特征(包含某个特定的词语),那就把带有这个词语的请求拦截。
拦截可以在三个层次做:
(1)专用硬件
Web 服务器的前面可以架设硬件防火墙,专门过滤请求。这种效果最好,但是价格也最贵。
(2)本机防火墙
操作系统都带有软件防火墙,Linux 服务器一般使用 iptables。比如,拦截 IP 地址1.2.3.4
的请求,可以执行下面的命令。
$ iptables -A INPUT -s 1.2.3.4 -j DROP
iptables 比较复杂,我也不太会用。它对服务器性能有一定影响,也防不住大型攻击。
(3)Web 服务器
Web 服务器也可以过滤请求。拦截 IP 地址1.2.3.4
,nginx 的写法如下。
location / {
deny 1.2.3.4;
}
Apache 的写法是在.htaccess
文件里面,加上下面一段。
<RequireAll>
Require all granted
Require not ip 1.2.3.4
</RequireAll>
如果想要更精确的控制(比如自动识别并拦截那些频繁请求的 IP 地址),就要用到 WAF。
Web 服务器的拦截非常消耗性能,尤其是 Apache。稍微大一点的攻击,这种方法就没用了。
CDN https://www.cloudflare.com/zh-cn/
指的是网站的静态内容分发到多个服务器,用户就近访问,提高速度。因此,CDN 也是带宽扩容的一种方法,可以用来防御 DDOS 攻击。
网站内容存放在源服务器,CDN 上面是内容的缓存。用户只允许访问 CDN,如果内容不在 CDN 上,CDN 再向源服务器发出请求。这样的话,只要 CDN 够大,就可以抵御很大的攻击。不过,这种方法有一个前提,网站的大部分内容必须可以静态缓存。对于动态内容为主的网站(比如论坛),就要想别的办法,尽量减少用户对动态数据的请求。
各大云服务商提供的高防 IP,背后也是这样做的:网站域名指向高防 IP,它提供一个缓冲层,清洗流量,并对源服务器的内容进行缓存。
这里有一个关键点,一旦上了 CDN,千万不要泄露源服务器的 IP 地址,否则攻击者可以绕过 CDN 直接攻击源服务器,前面的努力都白费。
源服务器前面有 CDN。如果攻击域名,CDN 可以挡住;如果直接攻击源服务器,买弹性 IP ,可以动态挂载主机实例,受到攻击就换一个地址。