防御HTTP Flood攻击需前置部署连接数与请求速率限制:用limit_conn按IP限并发连接防耗尽,limit_req基于漏桶算法控请求频次,并分层叠加全局、接口级及动态IP策略,同时注意CDN透传真实IP和NAT环境适配。

防御 HTTP Flood 攻击,关键在于在流量触达后端应用前就建立可量化的资源约束。连接数限制与请求速率限制不是锦上添花的配置,而是必须前置部署的基础防线——它们不依赖行为识别或AI模型,响应快、开销低、规则明确,能直接阻断大多数自动化攻击的初始冲击。
按IP控制并发连接数,防连接池耗尽
HTTP Flood 常伴随大量短连接或慢速长连接(如 Slowloris 变种),目标是挤占服务器可用连接槽位。Nginx 的 limit_conn 模块可对每个客户端 IP 强制设限,确保单个源无法垄断连接资源。
- 在 http 块中定义连接限制区域:limit_conn_zone $binary_remote_addr zone=conn_perip:10m;(10MB 内存约支持 16 万个独立 IP 状态)
- 在 server 或 location 块中启用限制:limit_conn conn_perip 50;(即每个 IP 最多保持 50 个并发连接)
- 配合 keepalive_timeout 15; 缩短空闲连接存活时间,加速连接回收
基于漏桶算法做请求速率控制
仅控连接数不足以应对高频短请求(例如每秒数百次 /api/search 调用)。需叠加 limit_req 实施请求频次管理,其底层采用漏桶算法,平滑处理突发流量而非简单丢弃。
- 定义限流区域:limit_req_zone $binary_remote_addr zone=req_perip:10m rate=8r/s;(每秒 8 个请求为基准速率)
- 应用限流并允许合理突发:limit_req zone=req_perip burst=24 nodelay;(队列最多缓存 24 个请求,到达即处理,不延迟)
- 对高风险路径单独限流更有效,例如:limit_req_zone $uri zone=api_limit:10m rate=3r/s; 专用于 /api/ 开头的接口
组合策略提升实际防护效果
单一维度限流易被绕过。真实环境中建议分层叠加,兼顾精度与弹性:
- 全局基础限流:防止整体资源过载,如 rate=5r/s + burst=10
- 接口级强化限流:对登录、搜索、下单等资源密集型路径,单独配置更严策略,如 rate=1r/s + burst=3
- 异常 IP 动态升级:配合日志分析脚本,将连续触发限流的 IP 自动加入 deny 列表,或交由 fail2ban 处理
注意与后端协同,避免误伤正常用户
限流策略生效位置越靠前越好,但也要防止把合法流量挡在外面:
- 若使用 CDN 或 WAF,确保它们已透传真实客户端 IP(如通过 X-Forwarded-For 或 CF-Connecting-IP),否则 Nginx 会把所有请求视为同一 IP
- 移动端或 NAT 环境下,多个用户可能共享一个出口 IP,此时不宜将单 IP 限值设得过低(如低于 10)
- 对登录成功后的会话请求,可通过 Cookie 或 Token 标识可信用户,跳过部分限流逻辑(需自定义变量配合 map 指令)










