应对慢速ssl攻击需缩短无效连接生命周期并限制ip并发连接数:设置ssl_handshake_timeout 5s、client_header_timeout 8s、keepalive_timeout 25s、reset_timedout_connection on;用limit_conn_zone和limit_conn按ip限流;收紧client_max_body_size、header/body超时等参数。

要应对慢速 SSL 攻击(如 Slow-SSL、SSL DoS),核心是缩短无效连接生命周期 + 控制每个 IP 的并发连接数。Nginx 本身不解析加密内容,所以防御必须落在 TLS 握手阶段和连接管理层面,不能依赖应用层逻辑。
关键超时参数设置
这些指令应放在 http 块中,全局生效,优先级高、见效快:
- ssl_handshake_timeout 5s:仅 Nginx 1.19.0+ 支持。强制 TLS 握手必须在 5 秒内完成,直接拦截畸形 ClientHello 或故意拖慢握手的客户端。
-
client_header_timeout 8s:SSL 连接建立后,客户端需在 8 秒内发完完整 HTTP 请求头(含
\r\n\r\n)。防“建连不发头”类 Slowloris 变种。 - keepalive_timeout 25s:长连接空闲超过 25 秒即断开。比默认 75 秒更激进,减少 TIME_WAIT 积压,避免连接池被耗尽。
- reset_timedout_connection on:超时后发送 RST 而非 FIN,更快释放内核 socket 状态,缓解连接表压力。
按 IP 限制并发 SSL 连接数
单靠超时不够,攻击者可高频发起新握手。需用 limit_conn 做硬性约束:
- 先定义共享内存区:
limit_conn_zone $binary_remote_addr zone=ssl_conn:10m(10MB 内存可存储约 16 万个 IP 状态)。 - 在 server 块中启用:
limit_conn ssl_conn 20,表示每个客户端 IP 最多维持 20 个并发 SSL 连接。 - 若需更严格保护敏感路径(如登录、支付接口),可在 location 块内叠加更小值,例如
limit_conn ssl_conn 5。
配合缓冲区与请求体控制
慢速攻击常伴随大而碎的请求体或超长请求头,需同步收紧边界:
- client_max_body_size 10m:拒绝超过 10MB 的请求体,防恶意上传耗尽磁盘或内存。
- client_header_buffer_size 4k 和 large_client_header_buffers 4 8k:适应含大量 Cookie 或 JWT 的合法请求,同时避免因 header 过大导致 400 错误或内存滥用。
- client_body_timeout 10s:接收请求体时,两次数据到达间隔不得超过 10 秒。防 Content-Length 很大但逐字节发送的攻击。
验证与调优建议
上线前建议做三件事:
- 用
log_format记录$request_time和$upstream_response_time,观察真实业务下头部/体接收 P99 耗时,再微调 timeout 值。 - 用
ab或weighttp模拟慢速连接,验证 408 是否及时返回、连接是否真正释放(ss -tan | grep :443 | wc -l观察 ESTABLISHED 数量变化)。 - 监控 Nginx error.log 中
client timed out while reading client request headers类日志频率,若突增且非攻击时段,说明 timeout 设得太紧,需回调。











