2024.12.16更新
本站已迁移至海外服务器,本站目前没有继续使用CDN的必要了
上个月初,本站的七牛CDN被刷了不少流量,特此记录一下,极大概率可能是某些PCDN用户刷的,不得不说这个群体是真缺德。
发现CDN被刷
因为主站服务器上行是小水管,所以所有静态文件都走了CDN来加速用户访问
这里为了描述简介,我将主站域名称为
主站域名
,CDN的域名称为域名A
正常情况下,域名A
CDN的流量日志应该是这样的:
但是某天我收到了几条七牛的流量阈值提醒,流量变成了这样,翻了好几倍:
甚至某天夜晚两小时刷了20G:
寻找原因
以开始当然是尝试寻找刷流量的ip来源,于是下载了CDN日志,发现都是同一个ip段,用随机UA,不停访问同一个js文件。这种特征基本可以断定是被刷流量了
在思考是不是得罪人了之后,我感觉这并不是针对性的攻击,毕竟力度太小了
简单搜索,在v2ex上发现不少类似遭遇的帖子:
现象基本一致,甚至IP均来自山西联通,可以断定是同一事件。
不得不说搞PCDN的这群人真是缺了大德,为了赚那么点钱,显示刷BT网络,接着刷各大镜像站导致各家无奈限速,最后又来刷各家的个人站点CDN
应对措施
第一时间我停止了域名A
的解析,不过没有效果。似乎是直接访问的七牛CDN节点IP并手动提交的http请求信息,我直接在七牛控制台删除了这个CDN,不再产生流量。
屏蔽刷流量访问
如果你觉得自己更新勤快,直接定前屏蔽ip段即可,这里有所有被屏蔽的IP段,这是最快的方法
我启用了之前备用的域名B
,这个一直指向的是腾讯CDN,可以随时无缝切换用于备用。不过这样单纯切换也没有用,因为恶意访问的请求是带正确的UA与referer的,很难使用CDN提供商的功能进行筛选。
于是我开启了域名B
腾讯CDN的访问鉴权,并将域名A
指向改为我的服务器,当用户访问域名A
时,会自动走一套验证逻辑,通过验证后会302跳转到带正确鉴权信息的域名B
网址,没通过验证的请求直接断开tcp。这样对于主站用户来说是无感的,同时也不影响我机器的小水管上行。
验证逻辑
具体验证逻辑思路如下:
因为正常访问cdn的请求,必定是会先访问我的博客主站的。
所以我的博客主站会先记录下当前访问者的IP,放入访问白名单中,保留30秒。同时页面上也有一个js每20秒会刷新一下,保证访客ip始终在白名单中。
cdn跳转请求处理那边只需要判断当前ip是不是在白名单中即可。
这里我以openresty
端来举个例子吧
在nginx全局的配置文件里,先声明一个变量share_ip
,用于存储临时的ip数据
然后在真正被访问的网站里,给某个特定路径加上一个心跳记录,用于给某个ip临时加白:
这样访问这个网站的/hb
路径后,请求ip便会被记录为合法,有效期75秒
在CDN跳转的网站处理代码中加上下面的代码,我这里用腾讯云的鉴权作为例子,大家如果有需求可以改为自己CDN使用的鉴权算法
这样服务端配置就完成了
在网页中,可以手动加上定期刷新白名单请求的js代码,刷新周期比过期时间短就可以了,比如:
效果
部署完这些后,没有再出现异常流量:
附带好处就是可以额外屏蔽某些不道德的爬虫访问cdn,防止流量被爬虫刷
这帮人就是专门通过刷CDN流量的刷下载量的, 他们做PCDN要平衡上传和下载的数据量,不然容易被运营商查出来, 然后也不知道是谁想出了通过刷CDN这种方法
这个302跳转防刷流量的方案我打包了一个docker应用
hub.docker.com/r/d9ee/celmet
不太一样,我的方法更直接更暴力,误判率可以做到0%
是通过访问并发度来识别吗,可以交流下。
通过两个站的量子纠缠效应进行识别