Nginx 中需在 location /admin 块内按序配置 allow 白名单(支持 IPv4/IPv6)后接 deny all,若经代理则须用 real_ip_module 还原真实 IP;复杂场景推荐用 geo 模块定义 $is_admin_allowed 变量并配合 if 判断。

要在 Nginx 中对特定路径(比如 /admin)实现严格的 IP 白名单控制,核心是“只放行指定来源,其余一律拒绝”,且必须在请求进入该路径时立即生效。这不是全局限制,也不依赖后端逻辑,而是在 Nginx 的 HTTP 请求处理阶段完成判断,零延迟拦截。
白名单必须放在 location 块内,顺序不能错
规则只对匹配的路径生效,所以必须写在对应 location /admin/ 或 location ^~ /admin 块中。关键点在于:allow 必须逐条写在 deny all 之前,Nginx 按顺序匹配,遇到第一条满足条件即终止。
- 正确写法:先列所有允许的 IP 或网段,最后一行写
deny all; - 错误写法:把
deny all;放在中间或开头,会导致后续 allow 不生效 - 支持 IPv4 和 IPv6,例如:
allow 192.168.20.0/24;、allow 2001:db8::/32;
允许多个网段或单 IP,直接分行写即可
不需要额外语法或分隔符,每条 allow 独立一行。Nginx 会依次比对客户端真实 IP 是否落在任一范围内。
- 示例:只允许公司内网和运维跳板机访问后台
allow 10.1.0.0/16;allow 172.16.5.10;allow 2001:db8:1::/64;deny all;
注意真实客户端 IP 的还原问题
如果前端有 CDN、反向代理或负载均衡,$remote_addr 默认是代理节点的 IP,白名单会失效。必须配合 real_ip_module 还原真实源 IP:
- 在 http 或 server 块中配置
set_real_ip_from指定可信代理地址 - 设置
real_ip_header X-Forwarded-For;或X-Real-IP - 确保代理在转发请求时确实携带了这些头部
推荐用 geo 模块管理复杂白名单
当允许的 IP 超过 10 个,或需要跨多个 location 复用时,硬编码 allow/deny 易出错、难维护。改用 geo 在 http 块中预定义变量更清晰:
- 在 http 块顶部添加:
geo $is_admin_allowed { default 0; 192.168.10.0/24 1; 203.0.113.42 1; }- 在 location 中判断:
if ($is_admin_allowed = 0) { return 403; } - 支持
include外部文件,如include /etc/nginx/ip_whitelist.map;,便于脚本自动更新


















