事情的起因是前几天收到了七牛云的额度不足告警,发现对象存储的 CDN 流量消耗不对劲,于是展开了排查。
您的账号当前可用额度 2.71 元,低于您设置的阈值 3.00 元,可能即将欠费,请您及时充值避免停服。
奇怪的流量变化
虽然我的博客《泫言》从 2017 年运行至今,还算稳定,但毕竟不是大神,访问量不大,一般不会有竞争对手或者恶意攻击来搞我。根据以往经验,对象存储充值 10 元能用很久,但距上次充值不久就收到额度提醒,这引起了我的警觉。
遇到问题第一步当然是去查七牛云的 CDN 监控,一眼看到从 11 月 5 日开始不对劲,正常情况下每日 CDN 流量不超过 50MB,但当天骤增至 734MB,后续几天都接近 1GB。

至此基本可排除恶意攻击,恶意攻击不会使用每天都固定刷 1G 流量这样“温和”的举措。
以七牛云为例,CDN 下行流量价格为 0.2046 元/GB,按每日 1GB 计算,一年费用约 74.679 元。虽然这钱不多,但是都被脚本和机器消耗完也不太爽。
排查流量来源
又快半年没有更新博客了,按理不应有大量正常用户访问。查看博客底部的访问统计,人数仍在 10 万左右。按小时的流量统计显示,记录分布非常均匀规律,不符合正常用户访问特征。
随后检查了谷歌分析(Google Analytics)数据,11月5日和11月6日虽有短暂用户量波动,但很快恢复正常,因此流量来源应该不是真实用户。

接下来要进一步实锤这个判断,我在 CDN 的「统计分析」和「日志分析」中发现,超过 94% 的流量来自江苏的 IP。按不同 IP 的流量消耗排序,没有单个 IP 占用过多流量。最近 7 天流量消耗前几的 IP 归属地如下:
- 中国江西南昌 | 联通 62.4826 MB
- 中国上海上海 | 电信 45.1876 MB
- 中国江苏徐州 | 电信 30.1108 MB
- 中国江苏苏州 | 电信 27.6015 MB
由于流量并非由少数 IP 主导,无法通过 IP 黑名单屏蔽特定发起方。
分析请求特征
查看请求文件次数,由于《泫言》首页有 4 张图片,多数请求都只会访问首页,所以流量大头都集中在这几个图片上,情况很正常。接下来分析了最多的 Referer 和 User-Agent 分布。
请求里面占 90% 以上的 Referer 都是空的
-
请求里面占 90% 以上的 User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3这个数据就比较诡异了,占据大头的 Referer 和 User-Agent 都不正常。
- Chrome/58.0.3029.110 release 发布于 2017 年 5 月 9 日,版本非常陈旧。
- 正常浏览器直接打开图片,会携带对应 Referer,也实锤了这些访问不是真实用户的行为。
临时解决
现在要临时解决问题,不想让这类请求继续消耗我的流量,我给 CDN 增加了防盗链设置。规则是仅放行来源为 *.cugxuan.cn 的请求,如果 Referer 为空则直接拒绝。
不带 referer 不能正常请求
$ curl --location
'https://image.cugxuan.cn/avater.jpg'
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>openresty</center>
</body>
</html>
带了 referer 的就能正常返回
$ curl --location
'https://image.cugxuan.cn/avater.jpg'
--header
'referer: https://blog.cugxuan.cn'修改之后 403 状态码的请求显著增加,该错误成为 CDN 统计中占比最高的类型,同样流量消耗也回归了正常水平。

结果与猜测
尽管通过临时屏蔽解决了问题,但也带来了不便。例如,在无痕模式下直接打开我的头像会显示 403,而在博客内右键打开图片则正常展示。
理论上本问题不会是搜索引擎以及大厂 AI 的产物,因为博客运行多年,很早就被 Google 和百度等搜索引擎收录,从未出现类似流量消耗。按照现有认知猜测了以下可能,也欢迎有类似经历的朋友与我交流:
- 小作坊的产物,如人工或 AI 编写的程序定期抓取。
- 某些 RSS 工具更新策略不当,缓存逻辑有问题导致重复拉取。
