最有效的防超限手段是在nginx入口层用client_max_body_size硬拦截,请求头解析后即判413,不占后端连接、不写临时文件;需配合缓冲区控制、超时约束和路径分级才能真正阻断载荷型dos攻击。

直接在 Nginx 入口层用 client_max_body_size 做硬拦截,是最有效的防超限手段——它在请求头解析完成后、开始读取请求体前就判定并返回 413,不占后端连接、不写临时文件、不触发代理转发。但单靠这一个参数远远不够,必须配合缓冲区控制、超时约束和路径分级,才能真正阻断载荷型拒绝服务攻击。
精准设置请求体上限,卡死恶意上传入口
该指令决定 Nginx 是否允许接收某次请求的 body 数据,超限立即返回 413 Request Entity Too Large,不进后端、不占 worker 内存、不生成临时文件。
- 默认值为 1m,对 API 表单足够,但远低于分片上传或大附件场景需求
- 严禁设为 0,等于主动关闭第一道防护
- 单位要写对:支持 m、k、g(大小写不敏感),如
500m、2G;500MB或500Mb易因拼写失效 - 必须写在最匹配的
location块里——只在http或server块设置,而上传路径(如/api/upload)落在独立location中且未覆盖,实际仍沿用默认 1MB
同步调优缓冲与超时,防慢速构造绕过检测
攻击者可能用低速、分段方式发送超大 body,绕过 size 检查却持续占用连接与内存资源。仅设大小限制,相当于只装了门禁没关闸机。
-
client_body_buffer_size 2k–8k:控制单次接收 body 的内存缓冲区大小;太小导致频繁磁盘 IO,太大削弱防护效果 -
client_body_timeout 10s:从收到请求头后开始计时,body 数据中断超时即断连,防 slowloris 类攻击 - 若作反向代理,需在对应 location 中显式关闭:
proxy_buffering off;和proxy_request_buffering off;,避免 body 被双重缓存放大内存压力
按路径分级收口,缩小高危面暴露范围
不是所有接口都需要接收大 body。把上传权限收敛到少数明确路径,其他路径一律收紧,能大幅压缩攻击面。
- 只允许
/upload或/api/v1/files接收较大 body:location /upload { client_max_body_size 50m; } - 登录、查询、状态类接口统一限制在 1–4KB:
location ~ ^/(login|search|status) { client_max_body_size 2k; } - 对明确禁止上传的路径(如
/api/login),可设为极小值:client_max_body_size 1k; - 配合
limit_req对上传路径进一步限频,防批量构造大 body 请求
协同防御头部与日志,堵住绕过通道
攻击者常配合超长 header(如伪造巨量 Cookie)、嵌套 X-Forwarded-For 等手法,绕过单纯 body 限制,耗尽每个连接的预分配内存。
-
client_header_buffer_size 1k;+large_client_header_buffers 4 4k;:总上限 16KB,超限返回 400,不进内存池 - 开启详细日志记录超限请求:
log_format limit_log '$remote_addr - $request_length $status $body_bytes_sent';,便于溯源分析 - 用
systemd MemoryLimit=1G绑定 worker 进程内存上限,防止单个异常请求拖垮整机











