最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Nginx 中如何在 nginx.conf 中配置防范慢攻击的超时参数
时间:2026-08-22 20:39:49 编辑:袖梨 来源:一聚教程网
防范慢速攻击的关键是快速识别并切断异常连接,需在http块统一配置client_header_timeout(公网7s/内网3–5s)、client_body_timeout与send_timeout(各10s)、keepalive_timeout(5–8s)等超时参数,并启用reset_timedout_connection、limit_conn、ssl_handshake_timeout等配套措施。
防范慢速攻击的关键不是让 Nginx 等得更久,而是让它在不同阶段快速识别“只连不发、发得极慢、发不完”的异常连接,并立即切断。所有防护参数必须放在 http { } 块中(全局生效),部分可细化到 server 或 location,但超时类指令优先在 http 层统一设防。
第一道闸门:限制请求头接收时间
client_header_timeout 是防御 Slowloris 的核心——从客户端发第一个字节起计时,到完整收到 rnrn 为止。超时即返回 408,不进后端、不占 upstream 资源。
- 公网 Web/API 入口:设为 7s,兼顾跨境延迟与拦截窗口
- 内网服务(如 K8s Ingress 后置):可压至 3–5s
- 含 JWT、多段 Cookie 或 SSO 头的鉴权网关:先用
log_format记录$request_time,观察 P99 头部接收耗时,再加 2–3 秒缓冲,上限不超过 15s
卡住请求体与响应发送的空闲间隔
client_body_timeout 和 send_timeout 不看总耗时,只盯“两次数据到达之间停了多久”。攻击者靠低速率+长空闲维持连接,这两个参数就是精准计时器。
-
client_body_timeout 10s:POST/PUT 请求体上传时,两次 TCP 包间隔超过 10 秒就断连 -
send_timeout 10s:Nginx 往客户端发响应时,两次写操作间隔超 10 秒即中断(流式响应如 SSE 可调高至 300s,并配proxy_buffering off) - 文件上传类服务:可放宽
client_body_timeout至 300s,但必须同步设client_max_body_size 100m防恶意大声明
清掉僵尸长连接
keepalive_timeout 控制空闲长连接存活时间。默认 75 秒极易堆积大量 TIME_WAIT,填满连接表。
- 对外服务建议设为 5–8s
- 必须搭配
reset_timedout_connection on;:超时后直接发 RST 包,跳过四次挥手,立刻释放 socket 和文件句柄 - 若使用 upstream,还需同步设
proxy_read_timeout 15–30s,防止后端响应慢拖住上游连接
配套加固动作不能少
单设超时效果有限,必须形成闭环:
-
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),避免因缓冲不足触发重试延长等待 -
ssl_handshake_timeout 5s;(Nginx 1.19.0+):强制 TLS 握手在 5 秒内完成,拦截畸形或拖慢握手的客户端