昨天2023年7月16日,本站遇到了搭建博客以来最大的攻击,10分钟2700w的请求🙏,峰值达到了令人震惊的1400w!
从时间上来看,18:40
到18:50
,短短10分钟,几乎是一瞬间就被请求了https数2000万次,多吉云在20:00
给我发送了请求数激增到2000w
的短信
我立马反应过来,登录控制台一看,哦豁,由于之前换了域名,还没来的及设置QPS 限制
,于是就被钻空子了
什么是QPS 限制? {#什么是QPS-限制?}
超出 QPS 限制的请求会直接返回错误,设置较低频次限制可能会影响正常用户的使用,请根据业务情况合理设置阈值。
被 QPS 限制拦截的请求不会产生 HTTPS 请求数计费。但需要特别注意的是,当请求被"域名防盗链"规则优先拦截后,无论是否超过 QPS 限制,都将进行 HTTPS 请求数计费。
比如我设置为120次/s
,那么一个ip在1s内只能请求当前域名120次,将QPS设置在一个合理的范围内将能够很大程度上的保护你的站点,设置过低将降低正常用户的访问。
日志查看 {#日志查看}
设置好QPS以后,我痛定思痛,将多吉云提供的将近3G的日志下载了下来
下载下来vscode打开一看,好家伙,上百万行数据,随便搜索了一下,无一例外,全是国外ip
痛定思痛 {#痛定思痛}
首先一定要设置好QPS和每日上限,我目前每日上限设置为5G,QPS为20/s
经过仔细观察可以发现,几乎所有的攻击都来自海外,所以我们需要屏蔽海外的流量,首先Nginx防火墙
,从Nginx下手其实并不是最优解,因为即便是在Nginx将所有的海外ip都封禁了,但是由于我有使用CDN,也就是说,流量还是会先经过CDN
再来到Nginx防火墙
,依然被刷掉了CDN的https次数,所以我们应该另外寻找办法
首先我们可以想到在机房层面屏蔽海外ip和udp,这是最优解,但是总是调整或者经常联系机房对我这个社恐来说是不现实的,于是我看上了第二种办法。
那就是从解析层面处理,使用DNSPod解析是支持境内与境内分开解析的,将境内解析到国内CDN以后,再将境外解析到127.0.0.1即可解决问题。
但是解析到127.0.0.1以后使用境外ip是完全打不开了,所以我做了一个单页面用来提示境外访问使用境内网络环境访问。
项目地址: https://github.com/anzhiyu-c/OverseasProhibition
然后使用cname这个单页网站解析到vercel
直接在vercl导入github项目后绑定自定义域名
至此算是做了我能想到的所有努力,欢迎大家补充。