CDN 免费防火墙实战:用 WAF 自定义规则与限速挡住 CC 攻击、恶意爬虫与扫描器

CDN 免费防火墙到底能挡多少攻击

很多站长把域名挂上 CDN 之后就觉得高枕无忧了,实际上 CDN 的默认防护只是"基础套餐"——它把流量接过去了,但并不会帮你区分正常访客和攻击者。真正能挡住 CC 攻击、恶意爬虫、SQL 注入尝试的,是 CDN 后台里那一套安全规则(WAF)。这篇文章就以 Cloudflare 为例,讲清楚免费版能配出哪些有效防护,以及怎么配才不误伤正常流量。

先明确一个预期:Cloudflare 免费版的 WAF 是"够用但不强大"的级别。它能挡住大量低质量自动化攻击、明显的恶意 payload 和异常的访问频率;但对于精心伪装的分布式 CC 或七层 DDoS,免费版力有不逮。所以正确的心态是——用免费规则把 90% 的噪音过滤掉,把服务器资源留给真实用户,而不是幻想它能挡住一切。

第一道防线:Security Level 与 Bot Fight Mode

在 Cloudflare 后台的 Security 页面,有几个"总开关",它们不需要写任何表达式就能起作用,应该优先打开:

  • Security Level(安全级别):从 Off 到 I'm Under Attack 共五档。日常建议设为 Medium,它会根据访客的威胁评分决定是否弹验证码。攻击来临时临时调到 High,甚至 Under Attack 模式。
  • Bot Fight Mode:免费版可用,会自动给已知的恶意 bot 发 JS 挑战。开了之后对正常搜索爬虫(Googlebot 等)无影响,能过滤掉一批刷量脚本。
  • Browser Integrity Check:检查 HTTP 头是否符合真实浏览器特征,能挡住一部分直接发请求的脚本。

这些开关是零成本的,先把它们都打开,就已经能过滤掉相当一部分垃圾流量。

核心武器:自定义 WAF 规则(Security Rules)

免费版提供 5 条自定义规则,数量不多,所以每一条都要用在刀刃上。规则由"表达式(Expression)+ 动作(Action)"构成,表达式支持丰富的字段。下面给出几条实战中非常有效、且几乎不误伤的规则。

规则一:拦截恶意路径探测

攻击者扫描后台、探测漏洞时会访问一堆正常站不存在的路径。用一条规则集中拦截:

(http.request.uri.path contains "/wp-config.php")
or (http.request.uri.path contains "/.env")
or (http.request.uri.path contains "/.git")
or (http.request.uri.path contains "/xmlrpc.php")
or (http.request.uri.path contains "/phpmyadmin")

动作选 Block。注意:如果你的站确实需要用 XML-RPC 发布(比如很多wp-cli以外的方式),就别拦 xmlrpc.php,改成用 Rate Limiting 限速。

规则二:拦截异常 User-Agent

大量采集和攻击脚本会使用空 UA 或明显的工具标识:

(http.user_agent eq "")
or (http.user_agent contains "curl")
or (http.user_agent contains "python")
or (http.user_agent contains "scrapy")
or (http.user_agent contains "masscan")

动作可以用 Managed Challenge(托管质询),而不是直接 Block——万一有正常工具被误判,质询还能让它过。这条规则对防采集特别有效。

规则三:保护后台登录页

把你的后台登录地址(比如 /wp-login.php 或 /admin)单独拎出来,要求通过 JS 挑战才能访问:

(http.request.uri.path contains "/wp-login.php")
and (http.request.method eq "POST")

动作选 Managed Challenge。这样暴力破解脚本因为执行不了 JS 直接被拦,而真人登录体验基本不受影响。

补充手段:Rate Limiting 限速抗 CC

WAF 规则是"看特征",而 Rate Limiting(速率限制)是"看频率",对付 CC 攻击更直接。免费版每条规则可以按路径/IP 维度限速。推荐配置:

# 对全站按 IP 限速:每 10 秒超过 50 次请求则质询
(http.request.uri.path matches ".*")
→ 速率: 50 requests / 10 seconds per IP
→ 动作: Managed Challenge

对动态页面(PHP)单独设更严的阈值,对纯静态资源放宽。这样既能挡住高频刷页,又不会误伤加载图片、CSS 的正常用户。阈值要给正常访客留足余量——一个页面可能同时请求几十个资源,按"每 IP 每 10 秒 50 次"起步是比较稳妥的。

别把自己锁在门外:自保与排错

配安全规则最怕的就是把真实用户或自己拦了。几条保命经验:

  • 先 Skip 后 Block。新规则先设成 Log 或 Skip,观察几天日志里命中的都是谁,确认没打到正常流量再改成 Block。
  • 给自己开白名单。在规则最前面加一条:(ip.src eq 你的固定IP) → Skip 所有后续规则,避免调试时把自己锁死。
  • 放行搜索引擎。在限速规则里排除已验证的 Googlebot/Bingbot,否则收录会被自己掐断。
  • 用 Event Log 复盘。Security → Events 能看到每一条请求命中了哪条规则、做了什么动作。排查"为什么用户说打不开"时,这里是第一现场。

回归源站:别忘了真实 IP 防护

挂 CDN 有一个巨大陷阱:如果源站 IP 泄露了,攻击者可以直接绕过 CDN 打你的真实服务器,所有 CDN 防护形同虚设。务必做到:

  • 源站防火墙只放行 CDN 的回源 IP 段,其他一律拒绝。
  • Nginx 里配置 real_ip_header CF-Connecting-IP 并设置 set_real_ip_from 为 Cloudflare 网段,这样日志里记录的是访客真实 IP 而不是 CDN 节点 IP。
  • 不要在任何地方(历史 DNS 记录、SSL 证书透明度日志、邮件头)暴露源站 IP;必要时更换源站 IP。

表达式语法速查:把规则写对

Cloudflare 的 WAF 规则用一套类 Wireshark 的表达式语言,掌握下面这些字段和运算符,绝大多数规则都能自己写出来:

  • http.request.uri.path:请求路径,用 contains / eq / matches(正则)判断。
  • http.user_agent:User-Agent 字符串,用 contains 匹配工具特征。
  • http.request.method:请求方法,如 eq "POST"。
  • ip.src:访客源 IP,可配合 in { } 做网段判断。
  • cf.threat_score:Cloudflare 的威胁评分,数值越高越可疑,可用来做阈值拦截。
  • http.request.headers:任意请求头,如检查是否存在 X-Forwarded-For。

运算符优先级上,and 高于 or,复杂条件一定用括号分组,否则容易写出与预期相反的逻辑。写完可以先在 Cloudflare 编辑器右侧输入一个测试请求验证,它会即时显示是否命中。

动作怎么选:Block、Challenge 还是 Managed Challenge

选对动作,和写对表达式一样重要。三种常见动作的适用场景:

  • Block(拦截):直接返回 403 拒绝。适合确定百分百是恶意的场景,比如访问 /.env、/.git 这类敏感文件。缺点是误杀没有挽回余地。
  • Managed Challenge(托管质询):Cloudflare 自动在 JS 挑战、验证码、拦截之间动态选择。适合"疑似可疑但不确定"的流量,是免费版里最推荐的默认动作——真人能过,脚本过不了。
  • JS Challenge / Interactive Challenge:前者静默执行 JS 校验,用户几乎无感;后者弹人机验证。一般用 Managed Challenge 就够了。

经验法则:拿不准的一律先用 Managed Challenge,只有确认无害之后再升级为 Block。

免费版的天花板与升级判断

诚实地说,Cloudflare 免费版安全能力有明确上限:自定义规则只有 5 条、Rate Limiting 规则数量有限、没有高级的 Bot 分析,也不支持对已登录会话做更细粒度的识别。那么什么时候该考虑升级到 Pro?

  • 你的站开始被持续、分布式的高强度 CC 攻击,免费限速的粒度不够用;
  • 你需要按国家/地区、按 cookie、按更复杂的组合条件下发规则,而免费版字段不够;
  • 你在意真实的爬虫分析与更精确的 bot 识别。

对绝大多数个人站长、中小流量站点来说,免费版配合前面讲的规则组合已经足够。先把手上的免费能力用满、用对,比急着付费更重要——很多"云防护没用"的抱怨,其实只是规则根本没配好。记得定期回 Security → Events 看拦截日志,根据真实攻击特征迭代规则,让防护随着你遇到的威胁一起进化。

把防护做成一个闭环

最后强调一个观念:CDN 安全规则不是配完就扔在那里的东西,而应该是一个持续运转的闭环。闭环有四个环节——观察、配规则、看日志、再调整。刚开始你不了解自己的站被谁访问、被什么攻击,就先只开总开关、把规则设成 Log 观察一周;一周后从 Events 日志里把排名靠前的可疑模式提炼出来,写成规则;再观察拦截日志里有没有误伤真人,有就加白名单或放宽阈值。这样一个循环跑两三轮,你的规则集就会越来越贴合自己站的真实威胁画像,而不是照抄网上千篇一律的模板。

对个人站长来说,这套方法论比任何具体规则都值钱。因为攻击手段天天在变,只有掌握了"观察—迭代"的思路,才能在面对新威胁时快速反应,而不是每次都被打个措手不及。

小结

CDN 免费防火墙不是银弹,但配得好,足以让一个个人站长用零成本挡掉绝大多数自动化攻击。核心思路是三层递进:先用总开关(Security Level、Bot Fight Mode)过滤噪音,再用自定义 WAF 规则精准拦截恶意特征,最后用 Rate Limiting 压制高频 CC。所有规则遵循"先观察后拦截、永远给自己留白名单"的原则,就能在安全与可用性之间找到平衡。记住,防护的终点不只是云端规则,还包括锁定源站真实 IP——两头发力,才算完整。

Last modification:October 11th, 2026 at 07:26 pm

Leave a Comment