Cloudflare 免费版可以通过自定义 WAF 规则拦截特征明显的恶意爬虫,但无法使用高级的 Bot Fight Mode,适合预算有限且流量特征明显的站点。
先说结论:免费版能挡基础脚本爬虫,但挡不住高度仿真的浏览器自动化流量,配置时需避免误伤搜索引擎。
- 先判断:确认攻击流量是简单脚本还是模拟浏览器,免费版对后者效果有限。
- 优先做:利用自定义 WAF 规则过滤异常 User-Agent 和高频 IP,注意表达式需忽略大小写。
- 再验证:通过安全事件日志和真实请求测试确认规则是否生效。
- 防误封:配置前务必先将管理 IP 加入白名单。
快速处理思路
由于 Cloudflare 配置主要在网页控制台完成,不涉及服务器命令,以下是核心操作路径:
- 登录 Cloudflare Dashboard,进入目标域名。
- 点击左侧菜单 Security(安全) > WAF。
- 在 Custom rules(自定义规则)标签页点击 Create rule。
- 设置匹配字段(如 User-Agent)和动作(Block 或 Challenge)。
- 保存后观察 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 加入白名单,避免规则生效后无法访问控制台或网站。
操作路径: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 观察。
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/