HTTP/2快速重置攻击是利用HEADERS帧与RST_STREAM帧高频交替触发服务端高开销清理逻辑的协议级DoS攻击,核心特征为单连接内毫秒级发起并取消流,不依赖ICMP,需通过帧级检测、连接状态联动及限流策略综合防御。

“连续 Ping”不是标准术语,实际指代的是 HTTP/2 Rapid Reset(快速重置)攻击,即利用 HEADERS + RST_STREAM 帧组合高频发起、立即中止流的 DoS 行为。它不依赖 ICMP,而是滥用 HTTP/2 多路复用机制,因此传统基于 ping 或 ICMP 的事件过滤器完全无效。加固重点应落在协议层帧行为识别与连接状态联动上,而非网络层误判。
聚焦 HTTP/2 帧级异常模式
真实攻击流量特征是单个 TCP 连接内高频交替出现 HEADERS 帧(含合法路径与伪 headers)和紧随其后的 RST_STREAM 帧(错误码 0x8),中间无 DATA 或 response frames。普通业务请求不会在流开启后毫秒级触发取消。
- 在 WAF 或 NGINX access_log 中启用
$http2、$status、$request_length、$body_bytes_sent,筛选出status=000(连接中断未响应)且body_bytes_sent=0、request_length 的高频请求 - 使用 Wireshark 或 tcpdump 抓包时,过滤表达式为
http2.type == 1 and http2.type == 3(HEADERS + RST_STREAM 同连接内共存),再按 stream ID 分组统计每秒重置次数 - Suricata 规则示例:
alert http any any -> any any (msg:"HTTP/2 Rapid Reset Flood"; http2_stream_id; content:"|00 00 00 03 00 00 00 00|"; depth:8; within:8; threshold: type both, track by_src, ip 192.168.0.0/16, seconds 10, hitcount 50; sid:1000001; rev:1;)
绑定连接生命周期做动态限流
单纯封 IP 效果差——攻击者可用海量 TLS 指纹+ALPN 变体绕过。必须将“重置行为”与底层连接状态关联,识别恶意连接而非单次请求。
- NGINX 中启用
http2_max_concurrent_streams 10;(默认 128,降为 10 可显著抬高攻击成本) - 配合
limit_conn_zone $binary_remote_addr ipv4:10m;和limit_conn ipv4 5;,限制每个客户端 IPv4 地址最多维持 5 个 HTTP/2 连接 - 关键:添加
limit_req zone=http2_reset burst=3 nodelay;,该 zone 应基于自定义变量捕获 RST_STREAM 频次,例如通过 Lua 模块统计每连接每秒 RST 数量并注入变量
关闭非必要 HTTP/2 特性降低攻击面
多数业务并不需要完整 HTTP/2 功能。禁用高风险子特性比等待补丁更可控。
- 禁用服务端推送(Server Push):
http2_push off;—— Jetty、Netty 等均默认开启,但极易被用于构造虚假依赖流 - 禁用动态头部压缩中的敏感字段缓存:
http2_hpack_table_size 0;(NGINX 1.25.3+ 支持),避免攻击者利用 HPACK 解压逻辑缺陷触发崩溃 - 对内网 API 网关场景,直接关闭 HTTP/2:
listen 8443 ssl;(移除http2),强制回退至 HTTP/1.1 —— CVE-2023-44487 与 CVE-2025-23419 均不适用
验证是否真正缓解而非掩盖现象
很多配置看似生效,实则只是把 CPU 压力从 worker 进程转移到 accept 队列或 SSL 握手层。需交叉验证三类指标:
- NGINX
stub_status中 Active connections 数稳定,但 Reading 值持续 > 90% —— 说明连接卡在帧解析,未真正释放 - 系统级
ss -i查看连接的retrans和unacked字段突增,表明 RST 帧未被及时处理,堆积在 TCP 层 - 用
openssl s_client -alpn h2手动建连后发送 HEADERS+RST 测试,观察curl -v --http2是否返回Empty reply from server而非超时 —— 若仍返回空响应,说明攻击链路未切断

















