nginx可通过allow/deny指令在location块中实现基于ip的接口级访问控制,需按序配置白名单并以deny all结尾,配合real_ip模块获取真实ip,支持静态规则、map动态映射及auth_request外部鉴权。

可以通过 Nginx 的 allow/deny 指令结合 location 块,对特定接口路径做基于 IP 的访问控制。核心是把权限判断逻辑前置到反向代理层,避免请求到达后端服务。
配置基础 IP 白名单
在对应接口的 location 块中,使用 allow 明确放行可信 IP 或网段,再用 deny all 拒绝其余所有请求:
-
allow 192.168.1.100;—— 放行单个 IPv4 地址 -
allow 2001:db8::/32;—— 放行 IPv6 网段 -
allow 10.0.0.0/8;—— 放行私有 IPv4 网段 -
deny all;—— 必须放在所有allow之后,否则无效
注意:Nginx 按顺序匹配,第一条匹配即生效;若使用 CDN 或负载均衡,$remote_addr 是上游地址,需配合 real_ip 模块读取 X-Forwarded-For 中的真实客户端 IP。
按接口路径精细化控制
不同后端接口可设置不同白名单策略。例如管理类接口只允许运维网段,数据导出接口限制为 BI 工具服务器:
location /api/v1/admin/ { allow 172.16.20.0/24; deny all; proxy_pass http://backend; }location /api/v1/export/ { allow 10.5.100.50; allow 10.5.100.51; deny all; proxy_pass http://backend; }
确保 location 匹配足够精确(如用 ^~ 前缀避免正则干扰),且不与其他泛匹配规则冲突。
结合变量与 map 实现动态控制
当白名单频繁变动时,避免每次改配置 reload,可用 map 指令将 IP 映射为开关变量:
- 在
http块定义:map $remote_addr $is_allowed {<br> default 0;<br> 192.168.5.10 1;<br> 203.0.113.25 1;<br>} - 在
location中判断:if ($is_allowed = 0) { return 403; }
(注意:仅限简单判断,避免在 if 中使用 proxy_pass)
更稳妥的方式是用 auth_request 模块对接一个轻量鉴权服务,实现可热更新的名单管理。
补充安全与调试要点
单纯 IP 名单不能替代身份认证,应作为纵深防御的一环:
- 开启
log_format记录被拒绝的 IP 和路径,便于审计:log_format blocked '$remote_addr - $request_uri $status'; access_log /var/log/nginx/blocked.log blocked; - 测试时用
curl -H "X-Real-IP: 192.168.1.100"模拟真实来源(需已配置 real_ip) - 避免在
server级直接写deny all,防止误锁整个站点
实际部署前务必在测试环境验证匹配逻辑,并保留应急绕过机制(如临时注释 deny 规则)。











