视频CDN在分发海量点播与直播内容时,普遍采用HTTP/2以提升连接复用率与传输效率。然而该协议的多路复用、流依赖与优先级机制,也被攻击者转化为低成本的拒绝服务手段。依赖攻击与流重置攻击正是其中典型,它们不需要发动T级流量,仅用少量连接即可让边缘节点或源站CPU、内存及连接池资源被无效消耗,最终导致正常用户无法加载视频切片。

HTTP/2依赖攻击与流重置攻击的底层原理
在HTTP/2中,一个TCP连接可承载多个流,流之间通过DEPENDENCY字段构成依赖树,并带有权重值用于调度优先级。依赖攻击指客户端伪造流之间的依赖关系,例如将毫无意义的探测流标记为关键视频分片流的父节点,并赋予极高权重。CDN边缘或源站调度器在不知情的情况下,会优先调度这些垃圾流,导致真实分片流被阻塞,形成资源错配型拒绝服务。
流重置攻击则围绕RST_STREAM帧展开。正常场景中,客户端中断下载会发送该帧通知服务端终止流。攻击者可在一个连接内以极高频率建立流并立即重置,使服务端不断执行流的创建、登记、销毁逻辑。由于HTTP/2的连接级流量控制与流状态机较复杂,频繁重置会触发额外的内存回收与锁竞争,单连接即可拖垮Worker线程。
这两种攻击常结合使用:先通过依赖攻击扰乱调度顺序,再以流重置制造资源抖动,使传统基于QPS的清洗设备完全失效,因为从表面请求数看并无异常峰值。视频CDN由于分片小、并发高,对此类协议层攻击尤为敏感。
传统限流手段为何难以防御此类攻击
多数视频CDN在边缘部署了基于IP的QPS限流与带宽限流。但依赖攻击与流重置攻击的请求速率可以做得极低,例如每秒仅十余个流操作,却能造成持续的优先级混乱。由于限流阈值若设得过低会误杀正常慢速客户端,运维往往不敢收紧,攻击于是得以长期潜伏。
另一个常见误区是只限制并发连接数,未限制单连接内的并发流数与帧发送速率。HTTP/2允许客户端在一个连接中声明上百个流,攻击者可利用这一点,在单连接内构造依赖树并周期重置,使单IP看不出异样,但单连接已经让服务端流表爆满。传统四层防护无法解析帧,自然也无从干预。
此外,不少CDN开启了服务端推送以提升性能,这恰恰放大了依赖攻击面。推送功能依赖优先级树,攻击者诱导推送后立刻重置,源站不仅要处理推送逻辑,还要回收推送资源。因此在视频场景,不加鉴别地开启推送弊大于利。
视频CDN边缘与源站的具体防御配置
在NGINX中,可通过http2_max_concurrent_streams限制单连接并发流数,并关闭推送来缩小攻击面。以下配置将并发流控制在较低水平,并禁用服务端推送:
http {
server {
listen 443 ssl http2;
# 限制单连接并发流,降低流表膨胀风险
http2_max_concurrent_streams 32;
# 关闭服务端推送,避免依赖树被滥用
http2_push_preload off;
location / {
proxy_pass https://origin_video_backend;
}
}
}
对于使用envoy的CDN节点,可在协议选项里设置max_concurrent_streams以及initial_stream_window_size,并结合过滤器限制单位时间内的RST_STREAM帧数量。以下片段展示在envoy.yaml中约束重置行为的思路:
listeners:
- name: video_listener
filter_chains:
- filters:
- name: envoy.filters.network.http_connection_manager
typed_config:
"@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
http2_protocol_options:
max_concurrent_streams: 64
# 通过过载管理器限制异常帧
stream_idle_timeout: 30s
在应用层,视频CDN应增加七层指纹识别:统计单连接内流重置率、依赖树深度、父节点权重分布。若某连接重置率超过阈值且依赖树呈现异常链式结构,则主动断连并记录IP。同时可对视频分片请求做优先级锁定,忽略客户端声明的依赖,由服务端按分片序号调度,从根源消除依赖攻击影响。
防御体系的运营与效果验证
部署上述策略后,需通过模拟器验证。可使用专门的压力工具构造依赖树攻击与高频重置,观察边缘节点CPU与源站带宽是否平稳。运营上建议将帧速率、重置计数纳入监控大盘,一旦单连接重置帧超千次每分钟即告警。
同时应保持协议栈版本更新,因为HTTP/2实现中的流状态机漏洞会被持续披露。视频CDN厂商还可在边缘做协议合规校验,丢弃包含非法依赖指针的帧,从解析层阻断攻击载荷,保障海量终端流畅播放。