使用Cloudflare为网站部署免费的防御措施
我决定给我的博客套一层Cloudflare。
“不是,你网站那点访问量套个der的cf啊?”
“我之前也觉得没必要,但为什么我这么小的站都有人来搞事啊。。。看来还是有必要上一下防了。反正Cloudflare有free plan,那个够好用了,不用白不用。”
发生肾磨石了?
朋友们好啊,我是本博客的博主。
刚才有个朋友问我,你的个人博客为肾磨访问不了了,我说怎么回事?给我发了几张服务器无响应的截图,我一看Nginx日志,哦!源赖氏港才,有两个IP地址,非常可疑,一个请求90多万次,一个请求80多万次。
我一看这请求量!啊…我的服务器CPU占用率直线上升,到了100%,诶…服务器扛不住了,我说这是怎么回事。我说你这个请求来得太频繁了,不能这么搞,他不理我。我说小朋友你看这个CPU负载,他看都不看。他说你这也没什么办法。我说我这个有办法,得用防火墙拦截全部流量,传统运维是讲防御的,四两拨千斤,二百多万的每分钟请求数都敌不过我这一条防火墙规则啊…哈!他非得继续攻击,我说可以。
诶…我一说他脚本啪就跑起来了,很快啊!然后上来就是,一个拒绝服务,一个CC攻击,一个API滥用!
我全部防出去了,防出去了啊,防出去以后自然是赛博攻防以点到为止,封了他的IP,未进一步采取行动。我笑一下,准备降低防火墙的防御级别。
因为这时间,按传统赛博攻防的点到为止,他已经输了,如果不解封IP,他这些IP永远访问不到我的网站。
他也承认我先封了他IP。他承认我先封了他IP,啊!我降低防火墙级别的时间不拦截了,他突然换了几个IP地址来继续攻击,啊,我大E了啊,没有闪。
诶…他的新IP地址给我服务器,啊,一瞬间,过载了一下,但没关系啊!几分钟以后,当时我紧急优化防火墙规则了,我说停停。然后几分钟以后,CPU负载就稳住了。
我说小伙子你不讲武德你不懂,他忙说对不起对不起,我不懂技术,啊,我是…他说他是随便试试的。
他可不是随便试试的啊,DoS、CC、API攻击,训练有素,后来他说他学过三四年网络安全,啊,看来是有bear来。
这个攻击者,不讲武德,
来,扫!
来,过载!
我1核2G的低配服务器。这好吗?这不好。
我劝!这位攻击者耗子尾汁,好好反思,以后不要再犯这样的聪明,小聪明啊,额…互联网要以和为贵,要讲武德,不要搞窝里斗。
谢谢朋友们!
(以上内容存在一定的艺术创作成分)
虽然风波暂时过去了,但这让我意识到即使是我这种平时根本没有访问量的小站,也有必要部署一些防御措施来抵御这类偶发的高频请求。
说起网站防御,那必不能不提Cloudflare,其提供的free plan对于我这样的个人建站者而言,已经足够好用了。不过由于是第一次使用这类工具,缺少一些经验,因此花了一点时间,下面把部署过程记录一下。
DNS托管
首先注册一个Cloudflare账号,选择free plan(对于小网站而言已经足够)。第一步需要将DNS服务器设置为Cloudflare提供的两个名称服务器:
该步骤需要前往之前的域名DNS服务提供商进行更改,更改成功后,需要将原先的所有DNS记录都托管到Cloudflare的DNS解析服务下。更改DNS名称服务器及解析这一步需要等上一段时间,激活成功后,Cloudflare会发一封邮件到注册邮箱:
设置CDN
DNS解析完成后,此时我们仅仅使用了Cloudflare的DNS解析功能,还没有为站点激活防御措施。为了激活该功能,我们需要为需要的二级域名开启代理状态,如下图为本站域名的DNS配置:
设置SSL/TLS
如果你的站点本身具有TLS证书,那么需要在「SSL/TLS->概述」中将加密模式设置为 完全(严格),否则在访问站点时会报“重定向次数过多”。
配置WAF
下文的WAF部署过程参考了这篇文章,在此致谢!
在「安全性->WAF」设置下依次配置「自定义规则」、「速率限制规则」
自定义规则
免费用户支持五条自定义规则,适合每个网站的WAF配置都不一样,不过可以先配置三条较为通用的:
- 白名单
根据需求定义一个白名单,首先可以放行一些经Cloudflare验证的自动程序,比如谷歌、百度的爬虫等。
(cf.verified_bot_category in {"Search Engine Crawler" "Search Engine Optimization" "Monitoring & Analytics" "Advertising & Marketing" "Page Preview" "Academic Research" "Security" "Accessibility" "Webhooks" "Feed Fetcher" "AI Crawler" "Aggregator" "Other"})
操作选择「跳过」,要跳过的 WAF 组件可以全勾上,我则去掉了两个速率限制规则。
其他的IP白名单等,可自行根据需求来定义。
- ASN质询
对一些常见数据中心服务商的ASN自治网络进行验证。
(ip.geoip.asnum in {174 195 209 577 792 793 794 1215 1216 1217 2497 2914 3223 3255 3269 3326 3329 3457 3462 3598 4184 4190 4637 4694 4755 4785 4788 4816 4826 4835 5056 5610 5617 6471 6584 6830 6876 6877 6939 7029 7224 7303 7489 7552 7684 8068 8069 8070 8071 8074 8075 8100 8220 8560 8881 8987 9009 9299 9312 9370 9534 9678 9952 9984 10026 10453 11351 11426 11691 12076 12271 12334 12367 12874 12876 12989 14061 14117 14140 14576 14618 15169 16276 16509 16591 16629 17043 17428 17707 17788 17789 17790 17791 18013 18228 18403 18450 18599 18734 18978 19527 19740 20207 20473 20552 20554 20860 21704 21769 21859 21887 22773 22884 23468 23724 23885 23959 23969 24088 24192 24424 24429 24940 25429 25697 25820 25935 25961 26160 26496 26818 27715 28429 28431 28438 28725 29066 29286 29287 29802 30083 30823 31122 31235 31400 31898 32097 32098 32505 32613 34081 34248 34549 34947 35070 35212 35320 35540 35593 35804 35816 35908 35916 36351 36352 36384 36385 36444 36492 36806 37963 37969 38001 38197 38283 38365 38538 38587 38588 38627 39284 40065 40676 40788 41009 41096 41264 41378 42652 42905 43289 43624 43989 45011 45012 45062 45076 45085 45090 45102 45102 45102 45103 45104 45139 45458 45566 45576 45629 45753 45899 45932 46484 46844 47232 47285 47927 48024 48024 48337 48905 49327 49588 49981 50297 50340 50837 51852 52000 52228 52341 53089 54463 54538 54574 54600 54854 54994 55158 55330 55720 55799 55924 55933 55960 55967 55990 55992 56005 56011 56109 56222 57613 58073 58199 58461 58466 58519 58543 58563 58593 58772 58773 58774 58775 58776 58844 58854 58862 58879 59019 59028 59048 59050 59051 59052 59053 59054 59055 59067 59077 59374 60068 60592 60631 60798 61154 61317 61348 61577 61853 62044 62240 62468 62785 62904 63018 63023 63075 63288 63314 63545 63612 63620 63631 63655 63677 63678 63679 63727 63728 63729 63835 63838 63888 63916 63949 64050 131090 131106 131138 131139 131140 131141 131293 131428 131444 131477 131486 131495 132196 132203 132509 132510 132513 132591 132839 133024 133199 133380 133478 133492 133746 133752 133774 133775 133776 133905 133929 134238 134327 134760 134761 134763 134764 134769 134770 134771 134835 134963 135061 135290 135300 135330 135377 135629 137693 137697 137699 137753 137784 137785 137787 137788 137876 137969 138366 138407 138607 138915 138949 138950 138952 138982 138994 139007 139018 139124 139144 139201 139203 139220 139316 139327 139726 139887 140096 140596 140701 140716 140717 140720 140723 140979 141157 141180 142570 149167 177453 177549 197099 197540 198047 198651 199490 199506 199524 199883 200756 201094 201978 202053 202675 203087 204601 204720 206092 206204 206791 206798 207319 207400 207590 208425 208556 211914 212708 213251 213375 262187 263022 263196 263639 263693 264344 264509 265443 265537 266706 267784 269939 270110 328608 394699 395003 395936 395954 395973 398101 })
操作选择了「JS质询」。
- 风险IP质询
创建一个风险IP列表,利用Cloudflare提供的威胁分数和这个IP列表来判断IP的危险度,由于列表过大,需要先通过「管理账户->配置->列表」创建一个IP列表,为方便起见,可以从下面提供的CSV文件下载该列表并导入。
然后添加下面规则:
(ip.src in $badip and cf.threat_score gt 30)
操作同样选择了「JS质询」。
速率限制规则
免费用户支持配置一条速率限制规则,我们可以根据服务器的情况来进行配置,我这里配置如下:
(http.request.uri.path eq "/")
当速率超过50次/10秒时触发。免费用户只支持一种操作,即「阻止」,响应方式选择了「默认 Cloudflare 速率限制响应」。
其他配置
「安全性→设置→安全级别」:高(在网站受攻击时可以使用「I’m Under Attack!」)
「安全性→设置→质询通过期」:15分钟或者30分钟,受到攻击较严重时则可以设置到5分钟
「安全性→设置→浏览器完整性检查」:打开
「安全性→DDoS→HTTP DDoS 攻击防护」:
「安全性→自动程序」:打开自动程序攻击模式。