本文记录博客遭受的一次攻击。

一、经过

  阿猪习惯睡前在被窝里玩会儿手机。但是昨晚在手机上访问自己的博客的时候,竟然发现网站报404无法访问。什么情况?!阿猪使用的可是腾讯云的COS+CDN,赫赫大厂不应该这么容易服务器出故障吧。一个不好的念头闪现,不会是网站被攻击了吧?

  阿猪赶忙关闭手机的飞行模式,果然收到了腾讯云发来的好几条提示短信。阿猪接着打开腾讯云小程序查看费用变动,还好没有产生扣费,暂时安下了一半的心(因为不确定费用结算是否有延迟)。因为阿猪事先在CDN中配置了IP访问频率限制和用量封顶规则,这说明网站无法访问是因为触发了规则自动下线了,而不是因为产生了大额的欠费被停止服务。

  从被窝里爬起来看了一下数据分析和日志,发现攻击主要来自172.233.66.140和172.233.131.234这两个美国IP,时间主要集中在23:27:36至23:29:23,一共请求了7.8万次,消耗了1.23GB流量。

二、应对措施

1、当晚临时修改了DNS解析记录,暂停了对境外访问请求的解析服务。

2、第二天在Vercel创建了镜像站点,并修改DNS解析记录,将境外的访问请求解析到Vercel的镜像站。镜像站会在国内站点的代码仓有更新时自动触发同步代码仓和部署,保持与国内站点的同步。

  这个方法暂时可以应对偶然的境外攻击。后续如果发现被针对的话(比如通过本地修改hosts表来绕过DNS解析规则),会考虑将域名完全托管到CloudFlare。

三、总结

1、要防患于未然

  国内的CDN服务商普遍采用后付费的结算模式,并且故意拉长流量使用量的统计和结算周期,导致没有防护措施的用户在欠费被停服时,普遍会有高额的欠费。虽然个人网站不常遭受攻击,但是当攻击降落的时候,几千甚至上万的欠费账单真的会让人欲哭无泪。

  例如这位叫做白雾茫茫的博友正好是阿里云的用户,分享了自己网站上周被攻击导致欠费四千余元的经历。(参考链接

2、防护规则的效果并没有用户认为的那么理想。

  阿猪设置的两条用量封顶限额(每小时100MB和每天500MB)虽然成功触发并执行了网站自动下线,但是3分钟内实际消耗了1.23GB流量,远大于预设值。而阿猪设置了另一条用量封顶限额(5分钟内100MB)并没有触发。

  阿猪设置的单链接下行速率限速为512KB/s,理论上3分钟内单个链接最多消耗90MB流量。然而虽然日志显示攻击者访问的URL主要集中在两三个资源文件,但是仍然消耗了1.23GB的流量,远大于理论数值。

  只有QPS限额看起来相对靠谱一些。阿猪设置了单IP每秒50次的QPS限额,两个攻击IP在约3分钟的时间内发起了7.8万次请求,实际只有1.13万条是200状态,其余的大部分是514状态。

  这说明防护规则的实际效果并没有用户认为的那样好,只能说聊胜于无吧。

后记:
  根据腾讯云技术支持人员的反馈,单链接下行限速仅针对单个客户端访问单个CDN节点。假如攻击者使用单个IP同时提交了多个请求,这些请求很有可能会被分配到不同的CDN节点,每个节点是单独限速的,而不是多个节点合并计算速率。这也是为什么阿猪虽然设置了限速,但是实际消耗的流量仍然远大于阿猪认为的理论数值的主要原因。