一聚教程网:一个值得你收藏的教程网站

热门教程

Nginx 中 Server 配置如何配置 client_header_timeout 防范慢头攻击

时间:2026-08-24 11:40:49 编辑:袖梨 来源:一聚教程网

client_header_timeout是防范Slowloris类慢速头部攻击最直接有效的配置,从首字节起计时至rnrn结束,超时返回408并秒级断连;公网设7秒、网关10–15秒、内网3–5秒,须配套reset_timedout_connection on、limit_conn和缓冲区调优。

client_header_timeout 是 Nginx 防范 Slowloris 类慢速头部攻击最直接有效的配置项,它从客户端发来第一个 HTTP 字节起计时,到完整收到 rnrn(空行)为止;超时即返回 408 并立即断连,不进 upstream、不占后端资源、不触发业务逻辑。

在 server 块中直接设置 timeout 值

该参数支持在 httpserverlocation 块中配置。推荐优先放在 server 块内,实现按服务粒度差异化防护:

  1. 公网 Web 页面或标准 API 接口:设为 7s
  2. 含 JWT Token、多段 Cookie 或 SSO 鉴权头的网关服务:设为 10–15s,但需先观察真实流量的 P99 头部接收耗时再加缓冲
  3. 内网反代或 Kubernetes Ingress 后置服务:可设为 3–5s,链路稳定且无中间设备干扰

必须配套的三项关键配置

单设 client_header_timeout 效果有限,需与以下配置协同生效,形成事件循环级闭环防护:

  1. reset_timedout_connection on;:超时后主动发送 RST 包中断连接,跳过四次挥手,秒级释放 socket 句柄和内核连接槽位,避免 TIME_WAIT 滞留
  2. limit_conn_zone $binary_remote_addr zone=perip:10m;limit_conn perip 10;:限制单 IP 初始并发连接数,防攻击者用多个地址绕过 timeout 机制
  3. client_header_buffer_size 4k;large_client_header_buffers 4 16k;:确保能容纳合法大 header(如长 Token、多段 Cookie),避免因缓冲不足触发重试或异常等待,反而延长连接占用时间

验证是否真正生效

不能仅靠 nginx -s reload 成功就认为配置起效,需实测模拟慢速行为:

  1. 用 curl 模拟慢速头部发送:curl -X GET http://your-domain.com/ --limit-rate 10 -m 30(限速 10 字节/秒,总超时 30 秒)
  2. 观察是否在设定值(如 7 秒)内返回 408 Request Timeout,并检查 error log 是否出现 client timed out 日志
  3. 在 access log 中加入 $request_time$status,筛选出 status=408request_time 接近 timeout 值的请求,确认是头部阶段被拦截

明确它防什么、不防什么

这个参数只控制请求头接收阶段,有明确边界:

  1. ✅ 防“建了连、发 GET /、就停住”,或每 10–30 秒补一个字段的 Slowloris 类攻击
  2. ❌ 不防请求体(body)传输慢 → 应由 client_body_timeout 控制
  3. ❌ 不防客户端缓慢读响应 → 属 send_timeout 范畴
  4. ❌ 不防 TLS 握手慢 → 必须用 ssl_handshake_timeout
  5. ❌ 不校验 header 内容是否含恶意字段 → 属 WAF 或应用层职责

热门栏目