适用场景
本教程适用于已接入 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 规则集
- 登录 Cloudflare Dashboard,进入你的域名
- 点击左侧菜单 Security → WAF
- 在 Managed Rules 标签页中,点击 Deploy Cloudflare Managed Ruleset
- 设置规则集动作为 Block(拦截),敏感度选择 High(高敏感度)
- 点击 Deploy 部署
推荐在 Paranoia Level 中选择 Level 2(平衡安全性和误报率),可拦截约 90% 的常见攻击。
步骤 2:添加自定义规则 — 拦截非中国地区访问
如果站点主要面向国内用户,可限制仅允许中国地区访问:
- 在 WAF 页面进入 Custom Rules 标签页
- 点击 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)
- 在 WAF 页面进入 Rate Limiting 标签页
- 点击 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,根据攻击趋势及时更新规则,形成持续改进的安全运营闭环。