Cloudflare WAF 规则实战配置指南:网站安全防护升级

适用场景

本教程适用于已接入 Cloudflare CDN 的网站站长和安全运维人员。Cloudflare WAF(Web Application Firewall)提供托管规则集、自定义规则和速率限制三大核心能力,可有效拦截 SQL 注入、XSS 跨站脚本、文件包含、恶意爬虫等常见 Web 攻击。无论你的网站源站是 Nginx、Apache 还是 WordPress,均可通过本教程快速配置 WAF 规则,实现主动防御。

前置条件

  • 拥有 Cloudflare 账号,域名已接入 Cloudflare(DNS 状态为 Proxied/橙色云朵)
  • Cloudflare 套餐:Free 版支持核心 WAF 规则,Pro 及以上支持自定义规则和速率限制
  • 已登录 Cloudflare Dashboard
  • 建议先开启Under Attack Mode(攻击模式)了解基础防御能力

原理说明

Cloudflare WAF 工作在全球边缘网络(Anycast),在请求到达你的源站之前进行过滤。核心机制:

  • 托管规则集(Managed Rulesets):Cloudflare 安全团队维护的预置规则库,基于 OWASP ModSecurity Core Rule Set(CRS)并持续更新,一键开启即可拦截已知漏洞攻击
  • 自定义规则(Custom Rules):支持灵活的条件逻辑(AND/OR 组合),根据请求特征(IP 国家、URI 路径、User-Agent、请求方法、Cookie 等)执行允许、阻拦、质询(JS Challenge/Captcha)等动作
  • 速率限制(Rate Limiting):针对匹配条件的流量设定阈值,在指定时间窗口内超过上限则触发限制动作,有效防御 HTTP 洪水攻击和 CC 攻击
  • 核心优势:所有规则在边缘节点执行,恶意流量在到达源站之前即被过滤,不消耗源站资源

操作步骤

步骤 1:开启托管 WAF 规则集

  1. 登录 Cloudflare Dashboard,进入你的域名
  2. 点击左侧菜单 Security → WAF
  3. Managed Rules 标签页中,点击 Deploy Cloudflare Managed Ruleset
  4. 设置规则集动作为 Block(拦截),敏感度选择 High(高敏感度)
  5. 点击 Deploy 部署

推荐在 Paranoia Level 中选择 Level 2(平衡安全性和误报率),可拦截约 90% 的常见攻击。

步骤 2:添加自定义规则 — 拦截非中国地区访问

如果站点主要面向国内用户,可限制仅允许中国地区访问:

  1. 在 WAF 页面进入 Custom Rules 标签页
  2. 点击 Create Rule,按以下配置:
规则名称:Block Non-CN Traffic
字段(Field):IP Country
运算符(Operator):is not equal
值(Value):CN
动作(Action):Managed Challenge(JS Challenge)
或选择 Block(严格模式)

步骤 3:添加自定义规则 — 保护 WordPress 后台

规则名称:Protect WP-Admin
字段(Field):URI Path
运算符(Operator):contains
值(Value):/wp-login.php
逻辑运算符(AND Logic):
  字段:IP Country
  运算符:is not equal
  值:CN
动作:Block
备注:仅允许国内 IP 访问登录页面

步骤 4:添加自定义规则 — 拦截已知恶意 Bot

规则名称:Block Malicious Bots
表达式(Expression Builder):
  (user_agent contains "SemrushBot") OR
  (user_agent contains "AhrefsBot") OR
  (user_agent contains "MJ12bot") OR
  (user_agent contains "python-requests") OR
  (user_agent contains "curl") AND NOT
  (ip.src in {你的服务器出口IP})
动作:Block

步骤 5:配置速率限制(Rate Limiting)

  1. 在 WAF 页面进入 Rate Limiting 标签页
  2. 点击 Create Rate Limit,按以下配置:
规则名称:Protect Login Endpoint
目标 URI:/wp-login.php
请求阈值:20 次/分钟
时间窗口:1 分钟
触发条件:同 IP 对 /wp-login.php 的请求
动作:Block for 10 minutes
高级选项:

步骤 6:开启 WAF 日志分析

在 WAF 页面进入 Security Events 标签:
# 查看被拦截的请求详情
# 筛选条件示例:
# - Action: Block
# - Rule ID: 具体规则 ID
# - Source: Managed/Custom

# 定期(建议每周)检查误报事件
# 发现误报时将该条件加入 WAF Skip 规则

配置验证

验证 1:模拟攻击测试

# 测试 SQL 注入(应被 WAF 拦截)
curl -s "https://你的域名/?id=1' OR '1'='1" -I
# 期望返回 403 Forbidden

# 测试 XSS(应被 WAF 拦截)
curl -s "https://你的域名/?q=<script>alert(1)</script>" -I
# 期望返回 403 Forbidden

# 从非中国 IP 访问(使用海外代理后测试)
curl -s "https://你的域名/wp-login.php" -I
# 期望返回 403 或 JS Challenge 页面

验证 2:检查 Security Events 日志

# 登录 Cloudflare Dashboard → Security → Events
# 确认以下信息:
# - SQL 注入测试请求出现在事件列表中
# - 事件标注了匹配的具体规则 ID
# - 动作显示 Block(而非 Pass)

常见问题(FAQ)

Q1:开启 WAF 后正常用户被误拦截怎么办?

第一步,在 Security Events 中找到被误拦截的真实用户请求,记录其 IP、Country、URI 和 User-Agent 特征。第二步,创建一条 Skip 规则(在 Custom Rules 中选择动作 Skip),根据误报特征放行:例如 Skip: WAF Managed Rules。第三步,如误报由托管规则引起,可进入 Managed Rules 将该条规则动作从 Block 改为 Log(仅记录不拦截),同时向 Cloudflare 报告误报以帮助改进规则库。

Q2:Free 套餐的功能有限,如何最大化防御效果?

Cloudflare Free 版虽然不支持自定义规则的 Block 动作,但可以通过以下方式弥补:① 开启 Under Attack Mode(Security → Settings),对访客自动呈现 JS Challenge 质询页面;② 使用 IP Access Rules(Security → IP Access Rules)手动封锁已知恶意 IP 段和国家;③ 结合 Page Rules(Rules → Page Rules)对指定路径(如 /wp-login.php)设置 Security Level: I’m Under Attack!;④ 在源站 Nginx 层面配合 limit_req 模块做二次限速;⑤ 升级到 Pro 套餐(月费 $20),成本可控且防御效果显著提升。

总结

Cloudflare WAF 提供了从托管规则到自定义规则的 Web 应用防火墙体系,能够有效抵御 SQL 注入、XSS、恶意爬虫和 CC 攻击。本文从托管规则开启、自定义规则配置到速率限制,覆盖了常用的安全防护场景。建议将 WAF 规则纳入定期安全审计范围,每周检查 Security Events,根据攻击趋势及时更新规则,形成持续改进的安全运营闭环。