Cloudflare 免费版 WAF 规则如何配置拦截恶意爬虫?

文章导读
Cloudflare 免费版可以通过自定义 WAF 规则拦截特征明显的恶意爬虫,但无法使用高级的 Bot Fight Mode,适合预算有限且流量特征明显的站点。
📋 目录
  1. A 快速处理思路
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 参考来源
A A

Cloudflare 免费版可以通过自定义 WAF 规则拦截特征明显的恶意爬虫,但无法使用高级的 Bot Fight Mode,适合预算有限且流量特征明显的站点。

先说结论:免费版能挡基础脚本爬虫,但挡不住高度仿真的浏览器自动化流量,配置时需避免误伤搜索引擎。

  • 先判断:确认攻击流量是简单脚本还是模拟浏览器,免费版对后者效果有限。
  • 优先做:利用自定义 WAF 规则过滤异常 User-Agent 和高频 IP,注意表达式需忽略大小写。
  • 再验证:通过安全事件日志和真实请求测试确认规则是否生效。
  • 防误封:配置前务必先将管理 IP 加入白名单。

快速处理思路

由于 Cloudflare 配置主要在网页控制台完成,不涉及服务器命令,以下是核心操作路径:

  1. 登录 Cloudflare Dashboard,进入目标域名。
  2. 点击左侧菜单 Security(安全) > WAF
  3. Custom rules(自定义规则)标签页点击 Create rule
  4. 设置匹配字段(如 User-Agent)和动作(Block 或 Challenge)。
  5. 保存后观察 Security Events(安全事件)日志。

为什么会这样

WAF(Web Application Firewall)工作在 HTTP 应用层,通过分析请求头、IP 信誉和频率来判断是否拦截。Cloudflare 免费版提供基础的自定义规则功能,但将高级的 bot 评分(如 cf.bot_management.score)和精细化速率限制通常保留给付费计划。这意味着免费版主要依赖静态特征(如关键字匹配)而非行为分析。对于简单的 Python 脚本、curl 请求或已知恶意 ASN,免费版规则足够有效;但对于模拟正常浏览器行为的自动化工具,免费版缺乏深度指纹识别能力。

分步处理

以下是在 Cloudflare 控制台配置拦截规则的具体步骤,操作前请确保你已将该域名的 DNS 接入 Cloudflare 并启用了代理(橙色云朵)。

1. 进入 WAF 配置页

在域名概览页,左侧导航栏找到 Security,点击 WAF。确保你处于 Custom rules 标签页。注意免费版可创建的自定义规则数量有限,请优先保留给高优先级规则。

2. 配置 IP 白名单(防误封)

在开启拦截规则前,务必先将自己和团队的固定 IP 加入白名单,避免规则生效后无法访问控制台或网站。

Cloudflare 免费版 WAF 规则如何配置拦截恶意爬虫?

操作路径:Security > WAF > Tools > IP Access Rules。点击 Add rule,输入你的公网 IP,动作选择 Allow,然后保存。

3. 创建拦截规则

点击 Create rule,命名规则(例如 block-bad-bots)。在表达式构建器中,可以选择 Build expression 可视化配置或 Edit expression 直接编写。

推荐的基础拦截表达式示例(可视化操作):

  • Field:User Agent
  • Operator:contains
  • Value:python, curl, wget, scrapy

若直接编写表达式,参考如下(注意使用 lower() 函数忽略大小写,防止 Python-Requests 等绕过):

lower(http.user_agent) contains "python" or lower(http.user_agent) contains "curl" or lower(http.user_agent) contains "wget"

配置完成后,将 Choose action 设置为 Block。如果不确定是否误杀,可先设为 Managed Challenge 观察。

Cloudflare 免费版 WAF 规则如何配置拦截恶意爬虫?

4. 设置优先级与部署

确保规则状态为 Enabled。如果有多个规则,注意优先级顺序,更具体的规则应放在前面。点击 Deploy 保存。

5. 回滚提醒

如果发现正常用户无法访问,立即回到 WAF 页面将该规则状态改为 Disabled 或删除。建议在业务低峰期进行配置变更。

怎么验证是否生效

配置完成后,不要立即假设已生效,需通过以下方式确认:

1. 查看安全事件日志

进入 Security > Events。使用过滤器选择刚才创建的规则名称。如果看到被拦截的记录,且动作显示为 Block,说明规则已命中。注意免费版日志保留时间较短,需及时查看。

2. 本地模拟测试

在本地终端使用被拦截的 User-Agent 发起请求,预期应收到 403 状态码:

curl -A "python-requests/2.28" https://yourdomain.com

如果返回 403 Forbidden 或出现 Cloudflare 拦截页面,则配置生效。若返回 200 OK,则检查规则表达式是否书写正确或 DNS 是否已代理。

常见坑

  • 误伤搜索引擎:不要简单拦截所有空 User-Agent 或包含 bot 字段的请求,Googlebot 和 Bingbot 也可能包含 bot 字样。建议通过 IP 段 whitelist 放行主流搜索引擎。
  • 封禁自己 IP:配置规则前,先将自己和管理团队的 IP 加入 Security > WAF > Tools > IP Access Rules 列表,避免被锁在门外。
  • 规则数量限制:免费版自定义规则数量有限,不要为每个细微特征创建单独规则,尽量合并条件到一个规则中以节省配额。
  • 大小写绕过:Cloudflare WAF 表达式默认区分大小写,务必使用 lower() 函数处理 User-Agent,否则 Python 可能绕过 python 的拦截规则。
  • 挑战循环:如果动作设为 Challenge,部分老旧浏览器或特定网络环境可能无法完成 JS 挑战,导致正常用户流失,生产环境建议先观察日志再切换为 Block。

参考来源

  • Cloudflare Plans, "Free Plan Features", https://www.cloudflare.com/plans/
  • Cloudflare Documentation, "WAF custom rules", https://developers.cloudflare.com/waf/
  • Cloudflare Documentation, "Security Events", https://developers.cloudflare.com/security-center/security-events/