要真正防范恶意请求通过请求头阻塞 nginx,必须协同配置 client_header_buffer_size 与 large_client_header_buffers(如 4k + 4 8k),禁用 underscores_in_headers,设置 client_header_timeout 5s 和 http2_max_header_size 等防护参数,并通过 error_log 监控验证效果。

要真正防范恶意请求通过请求头阻塞 Nginx,不能只调大 client_header_buffer_size——它只是两级缓冲机制的第一道门禁,单独调整既无效,还可能放大攻击面。
两级缓冲必须协同生效
nginx 解析请求头时按行分配内存:
– client_header_buffer_size 是每个连接最先分配的小块内存(默认 1KB),用于存请求行和前几行常规头;
– 当某一行(如整条 Cookie: 或 Authorization:)超出该大小,才会尝试启用 large_client_header_buffers 中的备用缓冲区。
但若后者的单 buffer 大小 ≤ 前者,扩容逻辑直接跳过,立刻返回 400 错误。
- 推荐组合:设
client_header_buffer_size 4k,配套large_client_header_buffers 4 8k(单 buffer ≥ 前者) - 严禁设成
64k或1m:攻击者可构造单行超长头反复建连,快速耗尽 worker 堆内存 - 配置必须放在
http { }或server { }块顶层,location 内无效
防慢速头攻击的关键超时控制
光调缓冲区毫无意义——攻击者可以逐字节发送请求头,拖住连接不释放,占满 worker 连接槽位。
-
client_header_timeout 5s:从读取第一个字节起,5 秒内必须完成整个请求头接收,超时即断连 - 配合
reset_timedout_connection on:对空闲超时连接立即发 RST,快速释放缓冲与连接资源 - 避免设为默认 60s 或盲目拉长,否则等于给慢速攻击留出完整窗口
堵住绕过与歧义解析路径
下划线、畸形字段名、超长 URI 都是常见绕过点,需一并收紧:
-
underscores_in_headers off:禁用X_Api_Key类写法,防止绕过鉴权或触发框架歧义解析 - 对 URI 超长风险路径,用
if ($request_uri ~ "^.{8192,}") { return 414; }提前拦截,不进缓冲分配流程 - HTTP/2 场景必须额外加
http2_max_header_size 32k和http2_max_field_size 4k,否则前述配置不生效
验证与可观测性不可少
错误日志不是辅助手段,而是判断问题根源的第一依据:
- 开启
error_log /var/log/nginx/error.log warn;,盯住client sent too large header或request header or cookie too large - 执行
nginx -t确保语法正确,且client_header_buffer_size ≤ large_client_header_buffers的第二个值 - 重载后用真实长头请求测试(如带 3KB JWT 的 curl),观察是否仍报 400 或进入 access log











