Cloudflare 免费防 CC 实战:WAF 规则 + Rate Limiting 拦住扫描与刷量(2026)

Cloudflare 免费套餐自带三层防刷能力,不用额外买高防:Bot Fight Mode(免费开关)、WAF 自定义规则(免费档条数有限,当前为 5 条)、Rate Limiting 限流(免费档 1 条)。 三层各管一段:第一层挡自动化脚本与已知坏爬虫,第二层拦特定路径与恶意 UA 的扫描,第三层对高频请求做计数限流、超阈值临时封禁。我给一个被 xmlrpc.php 和 /wp-login.php 扫描的 WordPress 站配齐三层后,源站日志里的 404 扫描量当天掉到原来的两成,后台撞库的 POST 请求基本归零。

上面这段就是全文的结论块,可以直接拿走。下面是三层分工、配置语法、阈值建议和排错。

Cloudflare 三层防刷链路

三层防线分别解决什么问题?

结论:Bot Fight Mode 管「谁在请求」,WAF 规则管「请求什么路径」,Rate Limiting 管「请求多快」——顺序不能颠倒,否则会误伤。

层 免费额度 管什么 典型用法
Bot Fight Mode 免费开关 自动化流量特征 一刀切挡掉已知脚本型 bot
WAF 自定义规则 免费档有限条数(当前 5 条) 路径 / UA / 地域 / 方法 拦 xmlrpc.php、.env、恶意 UA
Rate Limiting 免费档 1 条规则 单位时间内的请求频次 保护登录、接口、搜索页

先开 Bot Fight Mode 再配规则是更省事的顺序:很多通用扫描器在第一层就被挑战掉了,后面两条规则的日志会干净很多,你自己看告警时也更容易分辨哪些是漏网的真实攻击。

配置步骤速览

三层防线配置步骤

第一步:开 Bot Fight Mode

步骤 1:开启 Bot Fight Mode

Cloudflare 后台 → 选中你的域名 → Security → Bots → 打开 Bot Fight Mode。

打开后,Cloudflare 会对识别为自动化的流量发起 JS 挑战(用计算量校验),正常浏览器无感、脚本型爬虫会被拖慢甚至拦下。注意这是免费版的「一刀切」版本:它不能排除特定 UA、也不能只对某些路径生效——精细控制要靠下一层 WAF 规则。

第二步:建 WAF 自定义规则拦扫描

步骤 2:WAF 自定义规则

Security → WAF → Custom rules → Create rule。免费档条数有限,所以规则要「一箭多雕」——用 or 把多个高频攻击路径合并进一条:

(http.request.uri.path contains "/xmlrpc.php")
or (http.request.uri.path contains "/wp-login.php" and http.request.method eq "POST")
or (http.request.uri.path contains "/.env")
or (http.request.uri.path contains "/.git")
or (http.request.uri.path contains "/wp-config.php")

动作选 Block。这一条就能把绝大多数自动化扫描挡在源站之外——它们本来也不会带来任何真实用户。

第三步:建 Rate Limiting 限流

步骤 3:Rate Limiting 规则

Security → WAF → Rate limiting rules → Create rule。免费档只给 1 条,所以要花在刀刃上,我选了登录页:

  • If incoming requests match:http.request.uri.path eq "/wp-login.php"
  • When rate exceeds:10 requests per 10 seconds
  • Then take action:Block,Duration 设 10 minutes
  • Counting characteristics:按 IP 计数

含义是「同一 IP 每 10 秒超过 10 次登录请求就封它 10 分钟」。正常人手速远达不到这个阈值,脚本撞库则一撞就中。

第四步:验收,并给自己人开白名单

步骤 4:验收与白名单

# 模拟高频请求:连续打 20 次登录页
$ for i in $(seq 1 20); do \
    curl -s -o /dev/null -w '%{http_code}\n' https://example.com/wp-login.php; \
  done | sort | uniq -c
# 期望:前几次 200,之后出现 429 / 403

看到状态码从 200 翻到 429(或 403)就说明限流生效了。别忘了给白名单:你自己的办公 IP、以及监控探针的 IP,要在 Rate Limiting 规则的 Bypass 或在 WAF 规则里用 ip.src ne <你的IP> 排除,否则你会把自己也封在门外——这事我干过一次,登录后台时被自己的规则挡了十分钟。

三个真会踩的坑

  1. Bot Fight Mode 可能误伤 API 客户端和部分合法爬虫。 它的判定是「自动化特征」,而你的监控脚本、Webhook 回调在它眼里也是自动化。如果你的站点有对外 API 或需要被第三方服务回调,先小范围试,或把 API 路径在 WAF 里显式 Skip 掉 Bot Fight。免费版没有 Super Bot Fight Mode 的排除能力,这是它最大的限制。
  2. 共享出口 IP 会被连带限流。 按 IP 计数的规则,对同一公司 NAT 出口、同一运营商大内网出口的用户不友好——一个同事触发阈值,整个出口都被封。内部 / 办公场景建议对登录接口改按 http.request.uri.path + IP 组合、或把已知办公段加白。
  3. 只挡 Cloudflare 不代表源站安全。 如果源站公网 IP 可直连,攻击者绕过域名就能跳过全部三层。正确姿势是源站防火墙只放行 Cloudflare 回源 IP 段,或用 Cloudflare Tunnel 让源站不监听公网——这一点和 UFW + Docker 那篇讲的暴露面收敛是同一个道理。

Cloudflare 防刷常见问题(2026)

Q:免费套餐的 WAF 和 Rate Limiting 够用吗?
A:对个人站和小站完全够。免费档 WAF 自定义规则和 Rate Limiting 规则条数有限(以后台实况为准),但配得好,一套「拦扫描路径 + 限登录频次」的组合能挡掉绝大多数自动化攻击。付费档的价值主要在规则数量与更细的计数维度。

Q:为什么开了 Bot Fight Mode,日志里还有扫描?
A:Bot Fight Mode 只挡「被识别为自动化」的流量,低速率、模拟真人 UA 的扫描仍可能漏过。它是第一道粗筛,不是终点——漏网的要靠 WAF 规则按路径精准拦。三层叠起来才是完整防线。

Q:限流阈值设多少合适?
A:按「正常用户不可能达到」的原则定。登录页我设 10 次/10 秒,搜索页设 30 次/分钟。先宽后紧:上线时先只记录不拦截(Log 模式)跑两天,看真实用户峰值,再收紧到比峰值高一档。

Q:Rate Limiting 和 Nginx 的 limit_req 有什么区别?
A:位置不同。Cloudflare 在边缘拦,恶意请求根本到不了你的服务器,省带宽也省 CPU;Nginx 在本机拦,请求已经消耗了网络和 TLS 握手成本。边缘优先,Nginx 那层作为兜底(万一源站 IP 泄露)。

Q:怎么判断某次封禁是不是误伤了正常用户?
A:Security → Events 里按动作类型筛选,能看到被 Block/Challenge 的请求详情(IP、UA、路径、触发规则)和 Cloudflare 的威胁评分。发现正常用户被误伤,就调阈值或加白名单——别关掉整条规则。

一句总结

防刷不是靠单点拦截,而是用免费的三层把攻击成本堆高、把误伤面压小:Bot Fight 做粗筛、WAF 规则按路径精准拦、Rate Limiting 卡住频次。配完一定要用 curl 循环从外部打一遍验证,再把自己的 IP 加白——没验证过的规则,和没配一样。

相关阅读

上一篇 给 Claude Code 接入 MCP 服务器:让 AI 编辑器真正长出「手脚」(2026)