nginx抵御慢连接攻击的核心是“快进快出”:收紧client_header_timeout(5–10秒)、client_body_timeout(15–20秒)、send_timeout(10秒)、keepalive_timeout(15–30秒)四类超时,配合reset_timedout_connection on强制rst释放、limit_conn限单ip并发、limit_req控请求速率,并关闭缓冲陷阱与漏洞风险。

Linux 下用 Nginx 抵御慢连接拒绝服务攻击,核心是让无效连接“快进快出”——不等它拖垮资源就主动切断。重点不在堵流量,而在控时长、限并发、早释放。
收紧三类超时时间,精准切断慢动作
慢攻击靠“拖”,防御就靠“掐点”。Nginx 的四个超时参数分别对应攻击的三个阶段:
-
client_header_timeout:专治 Slow Headers(只连不发头)。从收到第一个字节起计时,到完整请求头(含
\r\n\r\n)收完为止。建议设为 5–10 秒;内网可信环境可压至 3 秒;含大量 Cookie 的场景先实测 P99 耗时再加缓冲。 -
client_body_timeout:专治 Slow Body(慢传体)。只看两次数据到达的空闲间隔,不看总上传时间。普通接口设 15–20 秒;大文件上传系统可放宽至 300 秒,但必须搭配
client_max_body_size硬限制。 - send_timeout:专治 Slow Read(慢读响应)。控制 Nginx 往客户端发响应的空闲间隔。建议 10 秒,避免被低速窗口卡住连接。
-
keepalive_timeout:缩短长连接空闲保持时间。默认 65–75 秒太长,建议调至 15–30 秒,配合
reset_timedout_connection on强制发 RST 包快速释放 socket,减少 TIME_WAIT 滞留。
限制单 IP 并发与请求速率,守住资源底线
光靠超时还不够,得防“一人开百连”。在 http 块中定义并启用限流规则:
- 用
limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m定义连接限制区域,再在server或location中启用limit_conn conn_per_ip 20,限制单 IP 最多 20 个并发连接。 - 用
limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=5r/s定义请求频率限制,再配limit_req zone=req_per_ip burst=10 nodelay,允许短时突发但不排队延迟,适合登录页或 API。 - HTTPS 流量建议单独设限,在
listen 443 ssl的server块中加limit_conn ssl_conn 15,避免 TLS 握手阶段被 Flood。
关闭缓冲陷阱,防止请求体被滥用
proxy_request_buffering on(默认开启)能缓解 Slow Body 攻击,但它必须和超时、大小限制配合才有效:
- 确保
client_body_timeout已设(如 15s),否则攻击者仍可缓慢填满缓冲区; - 设
client_max_body_size 100M防止恶意声明超大 Content-Length; - 调小
client_body_buffer_size 128k控制内存占用,超出部分写磁盘,避免 OOM; - Kubernetes Ingress 中禁用 buffering(
proxy-request-buffering: "off")是高危操作,会让 Slow Body 直接穿透到后端,除非后端已自行实现读取超时。
规避正则与漏洞,消除隐藏风险点
慢攻击常借道其他弱点放大效果:
- 禁用贪婪正则:用
[a-zA-Z0-9_-]+替代.+,所有匹配必须加锚点(如~ ^/api/v\d+/user$); - 静态路径优先用前缀匹配(
location /static/ { }),不用正则; - 修复已知高危漏洞:CVE-2026-42945(rewrite 堆溢出)需升级至 Nginx 1.30.1 或 1.29.7+;
- 关闭冗余暴露:
server_tokens off,加安全头如X-Frame-Options SAMEORIGIN和X-Content-Type-Options nosniff。











