CDN 回源带宽突增 5 倍,如何区分是缓存失效还是攻击
解读
面试官把“回源带宽 5 倍突增”抛出来,核心想验证三件事:
- 你是否能在分钟级把“业务正常变化”与“异常流量”分开;
- 你是否熟悉国内 CDN 的日志字段、监控体系与应急流程;
- 你能否用数据说话,给出可落地的止血+根因定位方案,而不是拍脑袋“像是攻击”。
知识点
- 国内 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(阿里)。
- 缓存失效模式:
a. 主动刷新(控制台/API 批量刷新目录/URL)——日志里会出现大量 200+miss,但 URI 集中、QPS 曲线与刷新任务时间窗完全对齐;
b. TTL 到期——缓存键离散、回源 URI 分布与昨日同一时段高度相似,QPS 无突刺;
c. 新内容上线——URI 前缀集中、回源响应 200+miss,但 User-Agent 含“spider”或内部发布系统特征。 - 攻击模式:
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 带宽被放大。 - 国内云厂商配套:阿里云“实时监控”+“运营报表”、腾讯云“CDN 带宽/回源带宽对比”、百度云“热点统计”均支持 1 min 粒度;日志服务(SLS、CLS、BLS)可秒级拉取;边缘脚本(EdgeRoutine、ES)可注入自定义 header 做染色。
- 指标换算:回源带宽 = ∑(body_bytes_sent) × 8 / 时间窗;命中率 = (总下行流量-回源流量)/总下行流量;熵值 H=-ΣPi·log2Pi,Pi 为 URI 出现频率,H>18 可判为高离散。
- 应急合规:国内需同步备案给运营商及网信办,攻击流量>1 Gbps 需 30 min 内上报,必要时启用“黑洞”或“近源清洗”。
答案
回答采用“1-5-10”节奏:1 min 止血、5 min 定界、10 min 定位。
-
1 min 止血
① 打开 CDN 控制台,把“回源带宽”与“总下行带宽”叠加,若命中率从 95% 跌到 20%,先切到“备用源站+回源鉴权”模式,避免主源被打瘫;
② 若 URI 熵值>18 且 404 占比>60%,立即在边缘下发 403 规则:User-Agent 为空或 wget|curl|python 且 URI 长度>200 字符,直接拒绝,降低 80% 回源量。 -
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 洪水。
-
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 攻击,非缓存失效。 -
后续动作
- 开启 CDN“近源清洗”阈值 2 Gbps,IP 信誉库联动,境外匿名代理 1 min 内拉黑;
- 源站 Nginx 加一层 lua,对无 Referer 且 URI 长度>150 的请求返回 444,减少日志写盘;
- 复盘:把命中率、熵值、404 占比固化成 1 min 告警,命中率<50% 且熵值>18 直接电话告警,15 min 内完成封禁。
拓展思考
-
如果攻击者改用“真实热点文件+随机查询串”导致命中率正常,但回源带宽仍高,如何识别?
答:对同一 cache-key 做 body_bytes_sent 累加,发现响应体大小波动>30%,即可判定“缓存击穿”而非真正命中;再对比源站响应时间,若 upstream_time 突增,说明后端在动态计算,需把查询串加入 cache-key 或启用 ignore-args 白名单。 -
国内大型电商 6·18 零点回源带宽瞬间翻 8 倍,如何提前演练?
答:性能测试侧提前 2 周用压测平台模拟“缓存雪崩”:把 70% 热门商品 TTL 调到 1 s,制造 0 点集体失效,观察回源带宽、源站连接数、Redis 慢查询;同时把 CDN 预热接口接入发布流水线,确保大促前 30 min 完成 100% 预热,命中率回升至 98% 以上。 -
若源站为多云 K8s Ingress,回源带宽高导致跨云流量费暴增,如何成本优化?
答:在 CDN 边缘用 EdgeRoutine 做二级缓存:对体积>1 MB 文件切片缓存 206 响应,切片粒度 1 MB,回源 Range 请求直接命中边缘 SSD;同时把回源链路接入云厂商“CDT 统一流量包”,利用夜间闲时带宽抵扣,成本可降 40%。