Cloudflare R2 配置 CDN + 防恶意刷指南
💰 为什么需要防刷
R2 免费额度:每月 10GB 存储 + A 类操作 100 万次(写/更新)+ B 类操作 1000 万次(读/列出)。
一旦被恶意刷流量或请求,超出部分会产生费用。最危险的是 B 类操作(读请求),攻击者成本低但能快速消耗你的免费额度。
⚠️ R2 要钱的是操作次数,不是流量 — 减少 B 类操作(读请求)是省钱的关键。
🔗 第一步:绑定自定义域名
🚫 绝对不要把 R2 存储桶的默认
.r2.dev域名直接公开!默认域名无法走 CDN 缓存,也无法使用 Cloudflare 的安全功能。
操作步骤
- 进入 Cloudflare 控制台 → R2 → 选择你的存储桶
- 点击 设置 → 公共访问 → 连接域名
- 输入自定义域名(例如
cdn.yourdomain.com) - 在 DNS 面板添加 CNAME 记录 指向 R2 分配的地址
DNS 配置示例
记录类型:CNAME
名称:cdn
目标:<你的存储桶>.r2.dev
代理状态:☁️ 橙色云(开启代理)✅ 自定义域名的好处:
- 开启 CDN 缓存,命中缓存的请求不消耗 R2 额度
- 可以使用 WAF 规则进行安全防护
- 可以使用 速率限制功能
- 域名可控,随时切换后端
🛡️ 第二步:配置 Cache Rules 缓存规则
缓存是防刷的第一道防线。 命中缓存的请求在 Cloudflare 边缘节点直接返回,根本不会打到 R2,不消耗任何 B 类操作额度。
操作步骤
- 进入 Cloudflare 控制台 → 规则 → Cache Rules
- 点击 创建规则
推荐配置
规则名称:r2-cache-all
🎯 匹配条件:
Field: Hostname
Operator: equals
Value: cdn.yourdomain.com
⚙️ 缓存设置:
Eligible for Cache: ✅ Yes(有资格缓存)
Edge TTL: Override → 7 天
Browser TTL: Respect origin(沿用源站)不同类型内容的缓存建议
| 内容类型 | 建议 TTL | 说明 |
|---|---|---|
| 🖼️ 图片(jpg/png/webp) | 30 天 | 基本不变 |
| 📦 备份文件(zip/tar) | 365 天 | 几乎不改 |
| 📄 静态文档(pdf/html) | 7 天 | 偶尔更新 |
| 🎬 视频(mp4) | 30 天 | 体积大,缓存收益高 |
| ⚙️ API 返回(json) | 0 或短时间 | 动态内容不缓存 |
💡 缓存时间越长,R2 的读取压力越小。 静态资源建议 7-30 天。
⚡ 第三步:配置 Rate Limiting 速率限制
限制单个 IP 的请求频率,防止被脚本批量刷。
操作步骤
- 进入 Cloudflare 控制台 → 安全 → WAF → 速率限制规则
- 点击 创建规则
推荐配置
规则名称:r2-rate-limit
🎯 匹配条件:
Field: Hostname
Operator: equals
Value: cdn.yourdomain.com
📊 速率条件:
Requests: 60
Time period: 10 seconds
Method: Any
🚨 操作:
Action: Block(拦截)或 Managed Challenge(验证码)
Duration: 10 minutes最佳实践
- 先用 Log 模式观察:首次配置时选择
Log,运行 3-7 天 - 分析日志:看正常用户的最大请求频率是多少
- 设置合理阈值:在正常峰值基础上 +50% 作为阈值
- 逐步收紧:先
Managed Challenge,确认没问题再改Block
⚡ 例如你的网站每天正常访问量约 1000 次,平均每分钟不到 1 次,设置每分钟 60 次已经非常宽松。
🔌 第四步:配置防盗链(Referer 限制)
只允许你的网站引用资源,其他网站直接访问会被拦截。
操作步骤
- 进入 Cloudflare 控制台 → 安全 → WAF → 自定义规则
- 点击 创建规则
推荐配置
规则名称:r2-referer-block
🎯 条件表达式:
(hostname eq "cdn.yourdomain.com") and
(not http.referer contains "yourdomain.com") and
(not http.referer eq "")
🚨 操作:Block两种策略对比
| 策略 | 规则 | 效果 |
|---|---|---|
| 🔓 宽松 | 放行空 Referer | 用户直接复制链接可访问,但盗链被拦 |
| 🔒 严格 | 拦截空 Referer | 只有你的页面能加载资源,最安全 |
⚠️ Referer 可以被伪造,这不是绝对防御,但能挡住大部分爬虫和盗链。
💡 建议先用宽松策略,观察一段时间后再决定是否收紧。
🛑 第五步:配置高级 DDoS 防护
Cloudflare 免费版自带基础 DDoS 防护,可以针对 R2 加强。
操作步骤
- 进入 Cloudflare 控制台 → 安全 → 设置
推荐开关
☑️ Bot Fight Mode(机器人战斗模式)
→ 自动拦截已知爬虫和恶意机器人
☑️ Security Level(安全等级)→ High
→ 对可疑请求显示验证码
☑️ WAF 核心规则集 → 开启
→ 拦截常见攻击(SQL 注入、XSS 等)⚠️ Bot Fight Mode 可能会误伤部分合法工具(如监测脚本),如果发现问题可降为
Essentially Off。
📊 第六步:监控与告警
随时掌握额度使用情况,避免超量后才发现。
操作步骤
- 进入 Cloudflare 控制台 → R2 → 使用情况
关键监控指标
| 指标 | 说明 | 危险信号 |
|---|---|---|
| Class A 操作 | Put/Post/Delete 等写操作 | 免费额度使用 > 80% |
| Class B 操作 | Get/Head/List 等读操作 | ⚠️ 免费额度使用 > 80% |
| 存储用量 | 当前数据总量 | 接近 10GB 上限 |
| 数据传输 | 出站流量 | 异常突增 |
配置告警
- 进入 通知 → 通知目的地 → 添加邮箱 / Webhook / Slack
- 进入 通知 → 告警 → Usage-Based Billing
推荐的告警规则:
📌 规则 1:Class A 操作达到 80% 免费额度
📌 规则 2:Class B 操作达到 80% 免费额度
📌 规则 3:日请求量突然增长 300%
📌 规则 4:存储用量超过 8GB📋 安全配置检查清单
级别说明:
🔴 必须 — 不配会被刷
🟡 建议 — 强烈推荐配置
🟢 可选 — 锦上添花| # | 配置项 | 优先级 | 耗时 |
|---|---|---|---|
| 1 | 🔗 绑定自定义域名(弃用 .r2.dev) | 🔴 必须 | 5 分钟 |
| 2 | 🛡️ Cache Rules 缓存规则 | 🔴 必须 | 3 分钟 |
| 3 | ⚡ Rate Limiting 速率限制 | 🟡 建议 | 5 分钟 |
| 4 | 🔌 Referer 防盗链 | 🟡 建议 | 3 分钟 |
| 5 | 🛑 Bot Fight Mode + WAF | 🟢 可选 | 2 分钟 |
| 6 | 📊 用量监控和告警 | 🟡 建议 | 5 分钟 |
⏱️ 最低配置 8 分钟(步骤 1 + 2),就能挡住 90% 的恶意刷量。
💡 防刷核心理念
三层防御纵深
第一层:CDN 缓存 🛡️
↓ 缓存命中 → 边缘直接返回(零 R2 消耗)
↓ 缓存未命中 → 回源到 R2
第二层:速率限制 + 防盗链 ⚡
↓ 过滤异常请求、阻止盗链
第三层:WAF + Bot Detection 🚨
↓ 拦截恶意爬虫和 DDoS 攻击
最终:到达 R2 的请求量大幅减少 📉六个要点
- 🚫 永远不要公开使用默认
.r2.dev域名 — 绕过 CDN 且无法用 WAF 规则 - 🆓 缓存是免费的 — Cache Rules 是防刷性价比最高的方式,零成本减少 R2 请求
- 🔢 R2 要钱的是操作次数,不是流量 — 减少 B 类操作(读请求)是关键
- 🧅 多层防护叠加 — CDN 缓存 + 速率限制 + 防盗链,防御纵深才有安全感
- 👀 先监控,后限制 — 先用 Log 模式观察正常流量,再上调限制阈值
- 🚨 遇到大量恶意刷流量时的应急步骤:
① 立即修改 DNS 解析至 127.0.0.1(临时下线)
② 在 WAF 中封禁攻击来源 IP 段
③ 开启 Security Level → I'm Under Attack
④ 升级 Cache Rules 减少回源
⑤ 考虑使用 Cloudflare Workers 做请求验证