CDN 回源带宽突增 5 倍,如何区分是缓存失效还是攻击

解读

面试官把“回源带宽 5 倍突增”抛出来,核心想验证三件事:

  1. 你是否能在分钟级把“业务正常变化”与“异常流量”分开;
  2. 你是否熟悉国内 CDN 的日志字段、监控体系与应急流程;
  3. 你能否用数据说话,给出可落地的止血+根因定位方案,而不是拍脑袋“像是攻击”。

知识点

  1. 国内 CDN 日志关键字段:hit/miss、cache-key、upstream_addr、request_time、status、body_bytes_sent、User-Agent、X-Forwarded-For、Referer、qiniu-swift-trace(七牛)、X-Tencent-Ua(腾讯)、Ali-Swift-Log-Time(阿里)。
  2. 缓存失效模式:
    a. 主动刷新(控制台/API 批量刷新目录/URL)——日志里会出现大量 200+miss,但 URI 集中、QPS 曲线与刷新任务时间窗完全对齐;
    b. TTL 到期——缓存键离散、回源 URI 分布与昨日同一时段高度相似,QPS 无突刺;
    c. 新内容上线——URI 前缀集中、回源响应 200+miss,但 User-Agent 含“spider”或内部发布系统特征。
  3. 攻击模式:
    a. 随机 URI 攻击——URI 熵值高、miss 率≈100%、qps 突刺、body_bytes_sent 接近 404/403 响应大小;
    b. 回源 POST 洪水——method=POST、miss 率 100%、upstream_time 极短(源站直接拒绝);
    c. 恶意 Range——大量 Range: bytes=0-、416 状态、upstream 带宽被放大。
  4. 国内云厂商配套:阿里云“实时监控”+“运营报表”、腾讯云“CDN 带宽/回源带宽对比”、百度云“热点统计”均支持 1 min 粒度;日志服务(SLS、CLS、BLS)可秒级拉取;边缘脚本(EdgeRoutine、ES)可注入自定义 header 做染色。
  5. 指标换算:回源带宽 = ∑(body_bytes_sent) × 8 / 时间窗;命中率 = (总下行流量-回源流量)/总下行流量;熵值 H=-ΣPi·log2Pi,Pi 为 URI 出现频率,H>18 可判为高离散。
  6. 应急合规:国内需同步备案给运营商及网信办,攻击流量>1 Gbps 需 30 min 内上报,必要时启用“黑洞”或“近源清洗”。

答案

回答采用“1-5-10”节奏:1 min 止血、5 min 定界、10 min 定位。

  1. 1 min 止血
    ① 打开 CDN 控制台,把“回源带宽”与“总下行带宽”叠加,若命中率从 95% 跌到 20%,先切到“备用源站+回源鉴权”模式,避免主源被打瘫;
    ② 若 URI 熵值>18 且 404 占比>60%,立即在边缘下发 403 规则:User-Agent 为空或 wget|curl|python 且 URI 长度>200 字符,直接拒绝,降低 80% 回源量。

  2. 5 min 定界
    拉取最近 30 min 日志样本 500 万条,跑三段 SQL:
    a. select uri, count() c, sum(body_bytes_sent) b group by uri order by c desc limit 100;
    b. select cache_status, count(
    ) c, sum(body_bytes_sent) b group by cache_status;
    c. select status, count(*) c group by status。
    结果解读:

    • 若 Top100 URI 覆盖 70% 回源流量且 cache_status=miss,TTL 到期或内容刷新;
    • 若 Top100 URI 覆盖<5% 且 404/403>60%,随机 URI 攻击;
    • 若 POST 占比>30% 且 502/504 突增,回源 POST 洪水。
  3. 10 min 定位
    ① 缓存失效:把 URI 按前缀聚类,发现 /live/2024* 占 80%,与运营确认“刚推全站静态化”,属于主动刷新,正常;
    ② 攻击:把 X-Forwarded-For 去重,发现 200 万独立 IP,90% 为境外秒拨代理,再对 query 参数做 n-gram 相似度,发现 99% 带 ?v=随机8位,判定为随机 URI 攻击;
    ③ 输出结论:回源带宽 5 倍突增,命中率为 18%,404 占比 72%,URI 熵值 21,属于随机 URI 攻击,非缓存失效。

  4. 后续动作

    • 开启 CDN“近源清洗”阈值 2 Gbps,IP 信誉库联动,境外匿名代理 1 min 内拉黑;
    • 源站 Nginx 加一层 lua,对无 Referer 且 URI 长度>150 的请求返回 444,减少日志写盘;
    • 复盘:把命中率、熵值、404 占比固化成 1 min 告警,命中率<50% 且熵值>18 直接电话告警,15 min 内完成封禁。

拓展思考

  1. 如果攻击者改用“真实热点文件+随机查询串”导致命中率正常,但回源带宽仍高,如何识别?
    答:对同一 cache-key 做 body_bytes_sent 累加,发现响应体大小波动>30%,即可判定“缓存击穿”而非真正命中;再对比源站响应时间,若 upstream_time 突增,说明后端在动态计算,需把查询串加入 cache-key 或启用 ignore-args 白名单。

  2. 国内大型电商 6·18 零点回源带宽瞬间翻 8 倍,如何提前演练?
    答:性能测试侧提前 2 周用压测平台模拟“缓存雪崩”:把 70% 热门商品 TTL 调到 1 s,制造 0 点集体失效,观察回源带宽、源站连接数、Redis 慢查询;同时把 CDN 预热接口接入发布流水线,确保大促前 30 min 完成 100% 预热,命中率回升至 98% 以上。

  3. 若源站为多云 K8s Ingress,回源带宽高导致跨云流量费暴增,如何成本优化?
    答:在 CDN 边缘用 EdgeRoutine 做二级缓存:对体积>1 MB 文件切片缓存 206 响应,切片粒度 1 MB,回源 Range 请求直接命中边缘 SSD;同时把回源链路接入云厂商“CDT 统一流量包”,利用夜间闲时带宽抵扣,成本可降 40%。