系列:Cloudflare 实战
难度:⭐⭐☆☆☆ 不需要写代码,复制表达式粘贴即可
预计时间:20 分钟
适合谁:有网站、想加固安全防护,但不想花钱买安全产品的人
先说清楚:免费版能做什么?
很多人以为 Cloudflare 的安全功能要付费才能用,其实不是。
免费版已经自带:
- DDoS 防护:自动,无需配置
- 托管规则集:基础版,拦截 SQL 注入、XSS 等常见攻击
- Bot Fight Mode:自动识别并对抗恶意机器人
- 自定义规则:每个域名 5 条,这是本文的重点
5 条规则听起来不多,但用对了能覆盖绝大多数攻击场景。本文的目标就是教你把这 5 条用到极致。
规则优先级说明
Cloudflare WAF 的规则按顺序执行,从上到下,第一条匹配就执行对应动作,不再往下看。
所以规则顺序很重要:
规则1(最高优先级)→规则2→规则3→规则4→规则5(最低优先级)
通用原则:
- 放行规则放最前:先把合法爬虫、自己的 IP 放行,后面的规则才不会误伤
- 封锁规则放后面:在确认不会误伤之后再封
- 宽松动作(质询)优先于严格动作(封锁):质询让真实用户有机会过关,封锁直接拒绝
5 条规则的最优分配方案
根据实际防护效果和误伤率,推荐以下分配:
下面逐条说明,每条都给出可直接复制的表达式。
规则 1:放行合法爬虫和白名单 IP(优先级最高)
为什么最先放行?
后面几条规则会覆盖面较广,如果不提前放行 Googlebot、Bingbot 等合法爬虫,它们可能被误拦截,导致网站搜索引擎收录受影响。
进入 WAF 自定义规则:
控制台 → 点击你的域名 → 左侧「安全性」→「自定义规则」→「创建规则」
规则名: 放行合法爬虫和白名单
表达式(复制后粘贴到「编辑表达式」输入框):
(cf.client.bot)or(ip.src in{你的IP地址})
把 你的IP地址 换成你自己的公网 IP(可以在 https://ip.sb 查看)。如果有多个 IP 用空格分隔:
(cf.client.bot)or(ip.src in{1.2.3.45.6.7.8})
动作:跳过(Skip)→ 跳过所有剩余自定义规则
cf.client.bot 是 Cloudflare 内置字段,会识别 Googlebot、Bingbot、Applebot 等经过验证的合法爬虫,自动放行,不需要手动列举。
规则 2:拦截空 UA 和异常 HTTP 版本
场景:绝大多数正常用户(浏览器、App)都会发送 User-Agent 头,HTTP 版本也是标准的 HTTP/1.1、HTTP/2、HTTP/3。没有 UA 或使用异常 HTTP 版本的请求,几乎都是扫描器或低级攻击工具。
规则名: 拦截异常请求特征
表达式:
(not http.user_agent contains "Mozilla"andnot cf.client.bot)or(not http.request.version in{"HTTP/1.1""HTTP/2""HTTP/3"})
动作:托管质询(Managed Challenge)
为什么用「托管质询」而不是「封锁」? 托管质询会弹出一个无感的 JavaScript 质询(大多数真实用户 0.5 秒内自动通过),机器人无法通过。封锁则直接返回 403,真实用户也会被挡。对于不确定的流量,质询比封锁更安全。
规则 3:保护后台登录页
场景: /wp-admin、 /admin、 /login 这些路径每天都有大量暴力破解尝试,用质询来过滤机器人。
规则名: 保护后台登录页
WordPress 站点:
(http.request.uri.path contains "/wp-admin")or(http.request.uri.path contains "/wp-login.php")or(http.request.uri.path contains "/xmlrpc.php")
通用后台(按实际路径修改):
(http.request.uri.path contains "/admin")or(http.request.uri.path contains "/login")or(http.request.uri.path contains "/dashboard")
动作:托管质询
xmlrpc.php 是 WordPress 的一个远程调用接口,经常被用来发起暴力破解,建议直接封锁:
(http.request.uri.path eq "/xmlrpc.php")
动作选封锁,除非你确实有程序在使用这个接口。
规则 4:封锁已知恶意爬虫 User-Agent
场景:有一批工具(安全扫描器、内容窃取爬虫、漏洞探测工具)的 User-Agent 特征比较固定,直接封锁。
规则名: 封锁恶意爬虫UA
表达式:
(http.user_agent contains "python-requests")or(http.user_agent contains "Go-http-client")or(http.user_agent contains "curl")or(http.user_agent contains "wget")or(http.user_agent contains "Scrapy")or(http.user_agent contains "zgrab")or(http.user_agent contains "Nmap")or(http.user_agent contains "sqlmap")or(http.user_agent contains "nikto")or(http.user_agent contains "masscan")or(http.user_agent contains "semrushbot")or(http.user_agent contains "AhrefsBot")or(http.user_agent contains "MJ12bot")or(http.user_agent contains "DotBot")
动作:封锁(Block)
注意: curl 和 python-requests 在合法的 API 调用场景中也会出现。如果你的网站有需要用这些工具访问的 API,要么把这条规则里的对应 UA 去掉,要么在规则 1 里先把对应 IP 白名单放行。
规则 5:地区过滤
这条规则根据你的网站目标用户来决定怎么配,有三种常见场景:
场景 A:网站主要面向中国大陆用户(封锁其他地区)
(not ip.geoip.country in{"CN""HK""TW""MO"})
动作:托管质询
不建议直接封锁,否则自己出国时也访问不了后台。用质询,真实用户能过,机器人不能。
场景 B:网站面向全球,但要封掉 Tor 网络
(ip.src.is_in_european_union or cf.edge.server_ip.is_in_european_union)and(ip.geoip.asnum in{})
更简单的方法:直接在「安全性」→「设置」里,把「Onion Routing(洋葱路由)」关掉。通过 Tor 访问你网站的,大概率不是正常用户。
场景 C:封锁高风险地区(高攻击来源)
(ip.geoip.country in{"RU""KP""IR"})
动作:托管质询或封锁
这个配置比较激进,会误伤正常来访用户。建议先用质询观察一段时间,再决定是否升级为封锁。
额外配置:不需要用规则配额的安全设置
除了 5 条自定义规则,以下配置不占用规则配额,建议全部开启:
Bot Fight Mode(自动机器人对抗)
位置:「安全性」→「Bot」→ 开启「Bot Fight Mode」
这个功能会自动识别和质询已知的恶意机器人,覆盖大量不需要自定义规则的场景。
安全级别调整
位置:「安全性」→「设置」→「安全级别」
「I'm Under Attack!」 非常时用:被大规模 DDoS 攻击时临时开启,可以立刻缓解压力。但它会让所有访客(包括正常用户)等待 5 秒,不适合长期开启。
关闭 Tor / 洋葱路由访问
位置:「安全性」→「设置」→「Onion Routing」→ 关闭
通过 Tor 访问的流量成分复杂,除非你有明确需求,否则建议直接关闭。
如何查看拦截效果
配置规则后,在「安全性」→「事件」可以看到所有被拦截的请求,包括:
- 触发的规则名
- 来源 IP 和国家
- 请求的 URL
- 执行的动作(质询/封锁)
这个日志非常有用:
- 如果看到大量正常请求被误拦截,说明规则过严,需要调整
- 如果看到某类攻击特征,可以针对性增加规则
- 日志保留 72 小时(免费版),付费版更长
配置后的观察建议:新规则上线后头 24 小时多看几次事件日志,确认没有误拦截真实用户,再放心让规则长期运行。
完整的 5 条规则速查
常见问题
Q:规则配额用完了怎么办?
A:升级到 Pro 计划($20/月)可以获得更多规则配额。或者把多个条件合并到一条规则里,用 or 连接,节省配额。比如规则 3 和规则 4 如果影响不重叠,可以合并成一条。
Q:被托管质询的用户会不会觉得体验差?
A:Cloudflare 的托管质询分两种:对于大多数现代浏览器,会在后台自动完成 JavaScript 质询,用户几乎感觉不到(不超过 0.5 秒)。只有极少数情况下才会弹出需要点击的验证码。所以托管质询对真实用户的影响非常小。
Q:封锁了某个国家,搜索引擎爬虫会受影响吗?
A:规则 1 里已经用 cf.client.bot 提前放行了合法爬虫,所以 Googlebot 等会优先走规则 1,不受后面地区过滤的影响。规则顺序非常重要,不能调换。
Q:攻击者伪造 User-Agent 怎么办?
A:确实,伪造 UA 是常见手法,规则 4 对此有局限。但大部分低级扫描工具懒得伪造,能挡住一大批。更高级的攻击者,靠 Bot Fight Mode 和 Cloudflare 的行为分析来对抗。5 条规则做不到 100% 防护,目标是用最低成本挡住大多数攻击。
Q:发现某个 IP 一直在攻击,能直接封掉吗?
A:可以,在「安全性」→「WAF」→「工具」→「IP 访问规则」里,直接填 IP 或 IP 段,选封锁动作。这个操作不占用 5 条自定义规则的配额,可以单独使用。
小结
5 条规则的最优配置:
- 放行规则最前:合法爬虫 + 自己的 IP,防止误伤
- 异常请求特征质询:空 UA、异常 HTTP 版本,低成本挡扫描器
- 后台路径质询:
/wp-admin、 /login,挡暴力破解 - 恶意 UA 封锁:sqlmap、nikto 等已知工具,直接封
- 地区过滤质询:按实际用户分布配置,减少攻击面
配合「Bot Fight Mode」和适当的安全级别,这套组合能覆盖绝大多数日常攻击场景,而且完全免费。
下一篇:《Cloudflare Email Routing 实战:5 分钟搭建免费品牌域名邮箱》
系列目录:持续更新,欢迎关注公众号。
参考链接
- Cloudflare WAF 自定义规则文档:https://developers.cloudflare.com/waf/custom-rules/
- WAF 表达式字段参考:https://developers.cloudflare.com/ruleset-engine/rules-language/fields/
- Bot Fight Mode 说明:https://developers.cloudflare.com/bots/get-started/free/
- IP 访问规则:https://developers.cloudflare.com/waf/tools/ip-access-rules/
- Cloudflare 安全事件日志:https://developers.cloudflare.com/waf/analytics/
- WAF 规则动作说明:https://developers.cloudflare.com/waf/custom-rules/create-dashboard/
阅读原文:原文链接
该文章在 2026/4/21 10:13:33 编辑过