Cloudflare R2 配置 CDN + 防恶意刷指南

💰 为什么需要防刷

R2 免费额度:每月 10GB 存储 + A 类操作 100 万次(写/更新)+ B 类操作 1000 万次(读/列出)。

一旦被恶意刷流量或请求,超出部分会产生费用。最危险的是 B 类操作(读请求),攻击者成本低但能快速消耗你的免费额度。

⚠️ R2 要钱的是操作次数,不是流量 — 减少 B 类操作(读请求)是省钱的关键。


🔗 第一步:绑定自定义域名

🚫 绝对不要把 R2 存储桶的默认 .r2.dev 域名直接公开!

默认域名无法走 CDN 缓存,也无法使用 Cloudflare 的安全功能。

操作步骤

  1. 进入 Cloudflare 控制台 → R2 → 选择你的存储桶
  2. 点击 设置公共访问连接域名
  3. 输入自定义域名(例如 cdn.yourdomain.com
  4. 在 DNS 面板添加 CNAME 记录 指向 R2 分配的地址

DNS 配置示例

记录类型:CNAME
名称:cdn
目标:<你的存储桶>.r2.dev
代理状态:☁️ 橙色云(开启代理)

自定义域名的好处

  • 开启 CDN 缓存,命中缓存的请求不消耗 R2 额度
  • 可以使用 WAF 规则进行安全防护
  • 可以使用 速率限制功能
  • 域名可控,随时切换后端

🛡️ 第二步:配置 Cache Rules 缓存规则

缓存是防刷的第一道防线。 命中缓存的请求在 Cloudflare 边缘节点直接返回,根本不会打到 R2,不消耗任何 B 类操作额度。

操作步骤

  1. 进入 Cloudflare 控制台 → 规则Cache Rules
  2. 点击 创建规则

推荐配置

规则名称: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 的请求频率,防止被脚本批量刷。

操作步骤

  1. 进入 Cloudflare 控制台 → 安全WAF速率限制规则
  2. 点击 创建规则

推荐配置

规则名称: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

最佳实践

  1. 先用 Log 模式观察:首次配置时选择 Log,运行 3-7 天
  2. 分析日志:看正常用户的最大请求频率是多少
  3. 设置合理阈值:在正常峰值基础上 +50% 作为阈值
  4. 逐步收紧:先 Managed Challenge,确认没问题再改 Block

⚡ 例如你的网站每天正常访问量约 1000 次,平均每分钟不到 1 次,设置每分钟 60 次已经非常宽松。


🔌 第四步:配置防盗链(Referer 限制)

只允许你的网站引用资源,其他网站直接访问会被拦截。

操作步骤

  1. 进入 Cloudflare 控制台 → 安全WAF自定义规则
  2. 点击 创建规则

推荐配置

规则名称: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 加强。

操作步骤

  1. 进入 Cloudflare 控制台 → 安全设置

推荐开关

☑️ Bot Fight Mode(机器人战斗模式)
   → 自动拦截已知爬虫和恶意机器人
 
☑️ Security Level(安全等级)→ High
   → 对可疑请求显示验证码
 
☑️ WAF 核心规则集 → 开启
   → 拦截常见攻击(SQL 注入、XSS 等)

⚠️ Bot Fight Mode 可能会误伤部分合法工具(如监测脚本),如果发现问题可降为 Essentially Off


📊 第六步:监控与告警

随时掌握额度使用情况,避免超量后才发现。

操作步骤

  1. 进入 Cloudflare 控制台 → R2使用情况

关键监控指标

指标说明危险信号
Class A 操作Put/Post/Delete 等写操作免费额度使用 > 80%
Class B 操作Get/Head/List 等读操作⚠️ 免费额度使用 > 80%
存储用量当前数据总量接近 10GB 上限
数据传输出站流量异常突增

配置告警

  1. 进入 通知通知目的地 → 添加邮箱 / Webhook / Slack
  2. 进入 通知告警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 的请求量大幅减少 📉

六个要点

  1. 🚫 永远不要公开使用默认 .r2.dev 域名 — 绕过 CDN 且无法用 WAF 规则
  2. 🆓 缓存是免费的 — Cache Rules 是防刷性价比最高的方式,零成本减少 R2 请求
  3. 🔢 R2 要钱的是操作次数,不是流量 — 减少 B 类操作(读请求)是关键
  4. 🧅 多层防护叠加 — CDN 缓存 + 速率限制 + 防盗链,防御纵深才有安全感
  5. 👀 先监控,后限制 — 先用 Log 模式观察正常流量,再上调限制阈值
  6. 🚨 遇到大量恶意刷流量时的应急步骤
① 立即修改 DNS 解析至 127.0.0.1(临时下线)
② 在 WAF 中封禁攻击来源 IP 段
③ 开启 Security Level → I'm Under Attack
④ 升级 Cache Rules 减少回源
⑤ 考虑使用 Cloudflare Workers 做请求验证

🔗 参考链接