记一次服务器被 DDOS 事件

记一次服务器被 DDOS 事件

最近一直挺忙的,没大有时间照顾博客,没想到这次更新文章居然是因为这个…… 这年头连博客都要闲着没事打一打了吗? 这只是一个技术博客,内容都是免费的,要防到这种地步,我也是无语了。 《DDOS 攻击的防范教程》——阮一峰的网络日志 第一次攻击

最近一直挺忙的,没大有时间照顾博客,没想到这次更新文章居然是因为这个……

这年头连博客都要闲着没事打一打了吗?

这只是一个技术博客,内容都是免费的,要防到这种地步,我也是无语了。

《DDOS 攻击的防范教程》——阮一峰的网络日志

第一次攻击

首次攻击发生于 2023-03-21 21:15:36,腾讯云告警服务器遭到 DDOS 攻击,并进行了安全隔离(黑洞)。

收到了连续三封信件,攻击类型是 UDPFLOOD,攻击带宽达到了7761Mbps。

鉴于最近站点没什么更新,也没有提供重要的外部服务,攻击者产生的攻击带宽在 7Gbps 左右,干脆买了一份什么也挡不住一年 31 元的 T-Sec 轻量 10Gbps 高防包。

T-Sec-DDoS 防护 10Gbps 轻量包

很快啊,钱到账之后腾讯云立刻就进行了解封操作。

IP 解封通知

由于是个人博客,在线率其实无所谓,考虑到有了 10Gbps,免费 DDoS 服务大概是到不了 10Gbps 以上了(是我想多了),攻击者应该会就此住手,第一天的攻防行动到此结束。

第二次攻击

第二次攻击发生于 2023-03-22 22:55:47,攻击时间与上一次基本相近。

估计是攻击者这个时候下课了、放学了或者下班了?总之又进行了第二次攻击。

DDoS 攻击导致 IP 封堵通知

这次攻击峰值达到了 15677Mbps,正好超过了最大防护阈值 10000Mbps,缺德啊,很缺德啊。

好在因为买了个高防包,这次有机会下载记录下来的攻击数据包进行分析。

NTP 放大攻击

用 Wireshark 打开下载的 .cap 格式的攻击数据包,数据展示攻击包来自世界各地的设备,且全部为 NTP 协议。SRC 和 DEST 的 MAC 地址指向了一台华为设备,且所有的包 SRC 与 DESC 的 MAC 地址全部相同,可知这是一个利用单台设备产生的 NTP 放大攻击。

Wireshark 分析数据包内容

隐藏源站 IP 地址

由于当初考虑到这台服务器只挂简单的博客,应该不太会有人去和一个小博客叫板。

事实上我错了,确实有人以此打发时间……总之,当务之急是数据安全和隐藏起来泄露的源站IP。

备份数据

www 服务器使用 Active Backup for Business 套件,每隔一段时间会将所有数据备份到异地设备上,上一次的自动备份时间是 2023-03-18,在此期间,网站没有大的内容改动。

但仍然为了保存最新的数据更改,首先连接到腾讯云的 VNC,登录 shell 并停止了服务,sync 刷新到磁盘,安全关机并制作镜像,拍个快照。

连接至网络

在攻击停止后,根据观察到的规律,下一次攻击应该至少在第二天夜间才会发生。

使用轻量高防包的自助 IP 解封服务,解封 IP 地址并立刻转移站点数据。

并同时配置防护策略。

iptables 防护反扫描

先从腾讯云CDN后台查询自己域名的回源节点 IP 段,并将其添加到 iptables 放行。

同时配置阻断所有 ICMP 包,禁止其他 IP 段对设备的 80、443 端口直接访问。

腾讯云 CDN 查询回源节点 IP 段
屏蔽 80、443 其他 IP 段访问,只放行 CDN 回源节点

配置一下云服务器的防火墙,不要让腾讯云放行不希望外部访问的端口。

防火墙规则配置

这些服务器的端口随用随开,不过我一般直接走 TailscaleTailscale 不需要开放额外端口,就能直接访问主机所有资源,省心省力。

如果CDN有开了“SEO配置优化”之类的选项,需要将其关闭,否则CDN会向搜索引擎汇报源站IP,从而导致绕过CDN,无法连接和抓取页面。

禁止 Nginx 对默认页面返回 HTTP 响应

创建一个 Nginx 规则,对 default 站点直接返回 444 状态码,指示 Nginx 强制关闭连接,而不做出任何回应。

否则攻击者可以通过 IP 连接到默认站点,从而暴露源站 IP 地址。

该方法同样也避免了错误的 HTTPS 配置导致源站 IP 暴露。

location / {
  return 444;
}
return 444;

禁止 WordPress 的 Pingback 和 Trackback

WP 的 Pingback 和 Trackback 可能会导致 WP 程序主动发起出站连接到攻击者设置的服务器,这可能导致源站泄露,在讨论里面关闭两个功能,并操作数据将所有的文章的 ping_status 修改为 closed。

与此同时,安装了额外的拓展插件,完全禁用 XML-RPC 和 Pingback 的功能。

暂停 planet.js 和任何主动出站连接的程序

我在 planet.ghostchu.com 使用的 planet.js 会主动外连 RSS 服务获取聚合信息,因为是 docker 容器,所以直接关掉就好了。

如果你有其他类似的程序,也需要想办法阻止他们主动外连其他 IP。

禁用自动 SSL,自签证书

部分软件带有 “自动 SSL” 证书功能,在申请 SSL 证书的过程中可能会导致真实源站 IP 地址暴露。

解决方案是创建一个 10 年的自签证书用于 CDN 和源站之间的加密访问。

不需要担心浏览器信任与否的问题,只要 CDN 信任就好了。

至于客户端 HTTPS,证书交给 CDN 签发,不再在源站服务器上管理。

使用安全的 SMTP 发信服务

SMTP 会暴露源站 IP 这点应该不少人都知道,在此不过多赘述,本站之前也介绍过使用阿里家的 DirectMail 服务隐藏源站 IP 地址。

检查并取消直接 A 记录到主机的 DNS 解析

我有一个子域 direct.ghostchu.com 是直接 A 记录解析到主机 IP,以便在不同 CDN/OSS 服务商间动态修改源站 IP 地址。

然而看起来这个子域已经暴露,可以在 censys 上被查找到。

所以接下来需要把这个 DNS 解析删除掉。

更换 IP 地址

由于之前的源站 IP 泄露,由于 Internet 的缺陷,通过自己的系统防火墙设置是没有办法阻止别人给你发送的恶意数据包消耗你的带宽的。

你可以拒绝处理这些数据包,但是数据包经过了运营商的层层转发最终已经到了你的线路中,线路被拥塞,不管你是否处理它们,数据包已经将你的带宽消耗完,这也是 DDoS 至今没有特效解决方案的原因。

源站 IP 已经泄露,任何防护措施已经没有任何意义(除非有人真的愿意买20个w一个月起步的腾讯云高防包)。

仅仅 30Gbps 的防御,就需要 19800.00 元一个月

轻量服务器只有一次更换 IP 地址的机会,因此更换之前/之后要做充分的工作,保护好自己最后一个生命周期内的 IP 地址。

更换后,到 CDN 配置中修改源站地址,站点即可恢复访问。

锦上添花 - CC 防护

在隐藏好源站 IP 后,攻击者仍然可以通过 CC 攻击,消耗你的服务器资源。

你可以从 CDN 处拉黑攻击 IP 段,设置 IP 访问限频、用量封顶等避免服务器资源消耗过多或者账单飞升。

此外,你使用的服务器面板通常也有一定的抗 CC 功能,例如宝塔面板和 AMH 都有这个功能。

终极解决方案?

其实还有其他方案可用,例如 Serverless,或者 Github Pages 等服务。

只需要将自己的 Wordpress 站点转为静态(例如 Hexo)。

也可以使用 SakuraFrp 等 Frp 服务托管网站(在攻击期间你们看到的 503 Service Unavailable 页面就是腾讯云CDN回源热备源站到 SakuraFrp 再穿透到 Vultr 服务器的。

Comment