nginx高可用架构中非法流量屏蔽需分层拦截、精准阻断、自动响应:聚焦登录等高危接口,用白名单+速率限制;以geo/map替代硬编码黑白名单提升性能;限流与连接控制双管齐下;通过独立日志+fail2ban实现分钟级自动封禁闭环。

在 Nginx 高可用架构中,非法流量屏蔽不能只靠“封一个 IP 就完事”,它必须和负载均衡、限流、日志联动形成闭环,否则容易误伤、漏防或拖垮节点。核心思路是:分层拦截(边缘识别)、精准阻断(不扰正常)、自动响应(减少人工)。
按路径和行为分级设防
高可用环境下,所有流量先经过 Nginx 网关层,应避免全局黑名单,而是聚焦高危入口:
- 登录、密码重置、API 认证等接口,用 白名单 + 速率限制组合:先 deny all,再 allow 内网段或可信代理出口 IP;同时配置
limit_req_zone $binary_remote_addr zone=auth_limit:10m rate=8r/m,防止暴力试探 - /wp-admin、/admin、/phpmyadmin 等管理路径,直接 deny 已知扫描器 UA(如 sqlmap、dirbuster)、空 User-Agent、非标准 Accept 头,并记录到独立 access_log 方便 fail2ban 提取
- 静态资源(/static、/img、/css)不做限流,但可加 referer 校验或 token 防盗链,避免被刷带宽
用 geo/map 模块替代硬编码黑白名单
当 IP 规则超百条,传统 allow/deny 线性匹配会明显增加请求延迟,尤其在多 worker 进程下影响性能:
- 用
geo指令预加载黑名单:在 http 块中定义geo $bad_ip { default 0; include /etc/nginx/conf.d/badips.geo; },文件中每行写1.2.3.4 1; - 在 location 中通过
if ($bad_ip) { return 403; }快速拦截,比 deny 指令更轻量,且支持热更新(改完 geo 文件 reload 即可) - 对白名单也可同理,用
map $remote_addr $allowed { default 0; 10.10.0.0/16 1; },再配合if ($allowed = 0) { return 403; }
限流与连接控制双管齐下
单靠速率限制(limit_req)防不住慢速攻击或连接耗尽型 CC,需叠加并发控制:
- 定义连接数限制:在 http 块中加
limit_conn_zone $binary_remote_addr zone=conn_perip:10m; - 在 server 或 location 中启用:
limit_conn conn_perip 15;(普通用户一般 5–15 并发足够,爬虫常开上百连接) - 关键参数配合:设置
client_header_timeout 15s;和client_body_timeout 15s;,让 Slowloris 类攻击无法维持长连接 - 返回码统一为 429(Too Many Requests),前端可据此做友好提示或退避重试,而非默认 503
闭环响应:从日志到自动封禁
高可用系统不能依赖人工看日志封 IP,要打通“检测→决策→执行”链路:
- 为敏感路径单独配置 access_log,例如
access_log /var/log/nginx/auth.log main if=$is_auth_path;,其中set $is_auth_path 1;在对应 location 中设置 - 用 fail2ban 监控 auth.log,匹配 5 分钟内 10 次 401/403 的 IP,自动生成
deny指令写入 /etc/nginx/conf.d/auto-block.conf - 配合 systemd 服务脚本,在 fail2ban 封禁后自动执行
nginx -t && systemctl reload nginx,实现分钟级响应











