nginx 通过“识别+拦截+限流”三步联动防御ip攻击:用 deny 或 geo 模块精准封禁恶意ip;用 limit_req 对登录等关键路径限流;用 limit_conn 控制并发连接;配合日志记录、隐藏服务器指纹和自定义错误页实现闭环防护。

防止特定 IP 对关键资源的攻击,核心是“识别+拦截+限流”三步联动,而不是只靠单一手段。Nginx 提供了灵活、轻量、生效快的原生能力,无需额外组件即可构建有效防线。
精准识别并封禁恶意 IP
直接阻断已确认的攻击源是最快速有效的手段:
- 在
server或location块中使用deny指令,例如:deny 192.168.5.100;deny 203.12.45.0/24; - 若需管理大量黑名单,建议用
geo模块集中定义:
在http块中添加:geo $blocked_ip { default 0; 192.168.10.5 1; 203.22.11.0/22 1; }
再在关键 location 中加入:if ($blocked_ip) { return 403; } - 注意:封禁规则需放在
allow/deny链的末尾,且deny all应置于最后,否则可能误拦合法请求
对登录、API 等关键路径做请求限流
封禁只能应对已知 IP,而限流能防御未知或轮换 IP 的暴力尝试:
- 在
http块定义限流区域,例如针对登录接口:limit_req_zone $binary_remote_addr zone=login_limit:10m rate=3r/m;
(每 IP 每分钟最多 3 次请求) - 在
location /login中启用:limit_req zone=login_limit burst=2 nodelay;
超出即返回 503,不排队、不延迟 - 对后台管理路径(如
/admin、/api/v1/user)也应单独配置更严策略,比如rate=1r/m
限制并发连接,防资源耗尽
高频请求未必压垮 CPU,但大量短连接会迅速占满 socket 和内存:
- 定义连接数限制区域:
limit_conn_zone $binary_remote_addr zone=conn_limit:10m; - 在关键 location 中限制单 IP 并发数:
limit_conn conn_limit 3;
特别适用于后台登录页、文件上传入口等易被滥用的端点 - 可叠加全局连接限制:
limit_conn_zone $server_name zone=server_conn:10m;limit_conn server_conn 1000;(整台服务器最大连接数)
配合响应头与日志增强防御闭环
光拦截不够,还要便于追踪和二次分析:
- 记录被限流或拒绝的请求:
确保log_format包含$status和$request_time,并在 access log 中保留 503/403 状态码 - 隐藏服务器指纹:
server_tokens off;+more_clear_headers "Server";(需 headers-more 模块),避免暴露版本信息给扫描器 - 对关键路径返回明确但无泄露的提示:
用error_page 503 /rate-limited.html;替代默认错误页,不暴露后端结构











