HTTP/2场景下防御慢连接攻击需强化Nginx全局控制策略:缩短keepalive_timeout、client_header_timeout和send_timeout,启用reset_timedout_connection;配合limit_conn与limit_req双重限流,并调优缓冲区及请求体处理参数。

HTTP/2 本身不直接提供“流控参数”来防御慢连接攻击,它内置的流控(Stream Flow Control)是为提升多路复用效率设计的,用于调节单个连接内各 stream 的数据传输速率,而非限制恶意客户端行为。真正起防护作用的是 Nginx 对连接生命周期、请求处理节奏和资源分配的全局控制策略——这些配置虽不专属于 HTTP/2,但在启用 HTTP/2 时必须同步强化,否则慢速攻击(如 Slow Read、Slow Headers)仍可绕过协议层优化,持续耗尽服务器连接与内存。
启用 HTTP/2 的前提配置
确保已正确开启 HTTP/2(需 TLS + OpenSSL 1.0.2+ / 1.1.1+),并在 server 块中声明:
- 监听 443 端口并启用 http2:
listen 443 ssl http2; - 配置有效证书(HTTP/2 在主流浏览器中强制要求 HTTPS)
- 禁用不安全的旧协议(如 SSLv3、TLSv1.0)以减少攻击面
针对 HTTP/2 场景强化慢连接防护
HTTP/2 允许单连接承载数百个 stream,攻击者可能滥用此特性发起大量低速 stream(如每秒只读 1 字节响应),导致连接长期挂起。需重点调整以下参数:
-
缩短连接级超时:
keepalive_timeout 15s;(默认 75s)——限制空闲连接存活时间,避免被 slow read 长期占用 -
收紧头部接收时限:
client_header_timeout 8s;(建议 5–10s)——对抗 slow headers,尤其在 HTTP/2 中 header 压缩(HPACK)不改变等待逻辑 -
严控响应发送超时:
send_timeout 10s;(建议 ≤15s)——对 slow read 最直接的约束,超时即断连 -
启用连接重置:
reset_timedout_connection on;——超时后发送 RST 而非 FIN,更快释放内核连接状态
限制单 IP 并发连接与请求速率
HTTP/2 下单 IP 可建极少连接但承载极多 stream,因此要兼顾连接数与请求率双重限制:
- 按 IP 限并发连接:
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;+limit_conn conn_per_ip 3;(例如最多 3 个 HTTP/2 连接) - 按 IP 限请求速率:
limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;+limit_req zone=req_per_ip burst=5 nodelay; - 对高频路径(如 API 接口)单独限流,避免静态资源被连带压制
调优缓冲区与请求体处理
防止 slow body 类攻击利用大 Content-Length 占用内存:
-
client_max_body_size 2M;—— 根据业务设合理上限,拒绝超大上传 -
client_body_timeout 12s;—— POST/PUT 请求体传输超时,比 HTTP/1.x 更需严格(因 HTTP/2 stream 可能复用) -
client_body_buffer_size 8k;+client_body_in_file_only clean;—— 小缓冲 + 自动落盘,避免内存堆积 -
large_client_header_buffers 2 4k;—— 防止 HPACK 解压后 header 膨胀耗尽 buffer


















