防范slowloris攻击的核心是nginx在tls握手完成后、http处理开始前,通过client_header_timeout(公网7秒、内网3–5秒、鉴权网关≤15秒)卡死慢发请求头,并配套reset_timedout_connection on、limit_conn及缓冲区调优实现闭环防护。

防范 Slowloris 慢速攻击,核心不是加防火墙或升级硬件,而是让 Nginx 在连接生命周期的每个关键阶段主动识别并切断“只连不发、发得极慢、发不完”的异常连接。安全超时配置是成本最低、见效最快的防线,重点在于分阶段收紧、协同生效,而非单点调大或调小。
client_header_timeout:卡死慢发请求头
这是第一道硬闸。Slowloris 最典型的手法是建好 TCP 连接后,只发 GET / 就停住,或每隔 10–30 秒补一个 User-Agent: 字段,永远不发送结尾的 \r\n\r\n。Nginx 默认等 60 秒,攻击者用几十个连接就能拖满一个 worker 的连接槽位。
- 公网 Web 页面或 REST API 接口:设为 7 秒。覆盖主流浏览器、SDK 及跨境/CDN 抖动,又能拦截常见扫描节奏
- 内网服务(如 Kubernetes Ingress 后置、Service Mesh 边车):可压至 3–5 秒,链路稳定无 NAT 干扰
- 含大量 Cookie、JWT 或 SSO 头的鉴权网关:先开启日志记录
$request_time和$status,观察真实 P99 头部接收耗时,再加 2–3 秒缓冲,上限不超过 15 秒
client_body_timeout 与 send_timeout:堵住慢传体和慢读响应
前者防攻击者声明 Content-Length: 10MB 却每分钟只送 1 字节;后者防客户端不读响应、只挂连接(Slow Read)。这两个参数管的是“空闲间隔”,不是总耗时。
-
client_body_timeout:常规接口建议 5–10 秒;文件上传可放宽至 300 秒,但必须配合client_max_body_size限制大小(如20M) -
send_timeout:普通接口设 8–12 秒;SSE 或流式响应需调高至 60–300 秒,并关闭proxy_buffering
keepalive_timeout + reset_timedout_connection:快速清理僵尸连接
默认 75 秒的长连接空闲时间,在攻击下会堆积大量 TIME_WAIT 状态,挤占可用 socket。单设 timeout 不够,必须强制复位。
- 对外 HTTP/HTTPS 服务:设
keepalive_timeout为 5–8 秒 - 必须开启
reset_timedout_connection on;:超时后直接发 RST 包中断连接,跳过四次挥手,立即释放 socket 和文件句柄 - 若启用了 HTTPS,可略宽一点(如 5–8 秒),以包容 TLS 握手延迟
配套必须启用的三项加固
仅调超时参数效果有限,必须与以下配置咬合形成闭环:
-
reset_timedout_connection on;:确保超时后真正释放资源,而非等待 FIN 握手 -
limit_conn_zone $binary_remote_addr zone=perip:10m;+limit_conn perip 10;:限制单 IP 初始并发连接数,防多地址绕过 -
client_header_buffer_size 4k;+large_client_header_buffers 4 16k;:确保能容纳合法大 header(如长 Token、多段 Cookie),避免因缓冲不足触发重试或 400 错误











