如何防止 DDOS 攻击

刚得知某个未曾“联系”过网友的博客被 DDOS 攻击了,不得不改为采用 WordPress.com 的服务。我正好有这方面不太成熟的经验,向读者们分享一下。

一、防止泄漏源站 IP

防止 DDOS 或 CC 攻击的关键点在于,不要泄漏源站 IP,也就是你 VPS 服务器的 IP。建议使用 Cloudflare 的免费 CDN,因为既然你已经用了速度不佳的托管服务,那就意味着放弃了网站到中国大陆的速度了,况且绝大部分网站托管服务的连接速度不会比 CloudFlare 更快。

当你购买 VPS 服务器装好 Webserver 后,第一时间在 Cloudflare 绑定域名,并开启 CDN 代理。

比如上图,我就没开启代理,因为我这段时间对速度感兴趣。尽管这样很不安全。

另外一个可能会泄漏源站 IP 的方式是通过 IP 地址反查域名,当你的 NGINX 只配置了一个站点,并且这个站点开启了 HTTPS 后,假如有人直接使用 HTTPS 访问你 VPS 的 IP 地址,NGINX 就会返回已配置域名的那个站点的 HTTPS 证书,也就泄漏了域名。有些网站不间断扫描全球 IP 地址,他们就可以通过这个方式将 IP 地址和域名关联起来。在 NGINX 1.19.4 之前,需要给默认站点配置假证书来解决这个问题,在 NGINX 1.19.4 版本之后,解决的方法就简单了,直接在默认站点的配置中开启 SSL,并禁止连接即可:

server {
    listen 443 default_server;
    server_name _;
    ssl_reject_handshake on;
}

通过以上两种方式,就可以从域名和 IP 两方面防止其对应关系泄漏。

二、在被 DDOS 之后,开启 Cloudflare 防护

开启 Cloudflare 防护并有效的前提就是攻击者只知道域名而不知道 IP 地址,否则攻击者可以直接对源站 IP 发动大量请求来瘫痪 VPS。

在满足上面所说的前提条件后,被攻击时只需在 Cloudflare 面板中调整安全级别、设置速率限制、5 秒盾等方式缓解攻击。

三、设置 Web 服务器仅允许 Cloudflare 服务器访问

因为使用了 Cloudflare CDN,所以正常来讲(除非你 IP 泄漏了)网站的内容均由 Cloudflare 的 CDN 服务器中转。那我们其实可以认为在这种情况下,Web 服务器应该只允许 Cloudflare 的 CDN 服务器访问即可,将其他非 Cloudflare 的 Web 请求阻断掉。

与国内 CDN 厂商遮遮掩掩不同,Cloudflare 的 CDN 服务器 IP 是公开的,其 IP 地址列表在官网有维护。所以有人就写了自动化脚本( iptables 版 | ufw 版 ),自动抓取 IP 并设置防火墙规则。

iptables 规则在服务器重启后就失效了,可以安装 iptables-persistent 包来将其自动持久化,有需要的话可自行搜索。另外,还可以将 cloudflare-ips-only 脚本加到 crontab 中,自动每日运行。

一般来说,只要源站 IP 没泄漏,做不做仅允许 Cloudflare 访问其实无关紧要,因为几乎不可能猜出来域名和 IP 的对应关系。而一旦源站 IP 泄漏了,那做不做也就无关紧要了,因为攻击者会直接将域名和 IP 通过 Hosts 文件等方式关联起来,或者直接攻击 IP。所以放 DDOS 攻击的重点还是隐藏源站 IP。

而我自己目前尚未隐藏,不出名也就少了这些烦恼。