最稳妥的做法是在 location / 块中用 allow + deny all 配置白名单,需结合 set_real_ip_from 处理代理 ip,并用 geo + if 适配真实客户端 ip,同时务必加入健康检查源 ip 以避免服务下线。

直接在 Virtual Host(即 server 块)中配置白名单,只允许特定办公网段访问,最稳妥的做法是用 allow + deny all 组合,并确保规则放在 location / 或顶层 server 块内——但必须注意作用域和代理影响。
把白名单规则写进 server 块的 location / 中
这是最常用也最安全的位置。不建议直接写在 server 块顶层(无 location 包裹),因为 Nginx 的访问控制指令只在 http/server/location 三级生效,且需明确作用路径。
- 编辑你的虚拟主机配置文件,例如
/etc/nginx/conf.d/test.zhiexa.com.conf - 在
server { ... }内添加或确认存在location / { }块 - 在里面写入办公网段(比如 192.168.5.0/24)和可能需要的其他地址:
location / {
allow 192.168.5.0/24;
allow 10.10.20.0/24; # 另一个办公子网
allow 127.0.0.1; # 本地调试必需
deny all;
}保存后运行 nginx -t && nginx -s reload 生效。
处理真实客户端 IP 被代理覆盖的问题
如果测试站前端有 SLB、CDN 或反向代理(如 Nginx 自身做前置代理),$remote_addr 拿到的是代理 IP,不是用户真实 IP。此时白名单会失效。
- 确认你信任的代理地址(比如阿里云 SLB 的内网出口 IP 段:100.64.0.0/10)
- 在
http或server块开头加这两行:
set_real_ip_from 100.64.0.0/10; real_ip_header X-Forwarded-For;
然后把所有 allow 规则基于 $realip_remote_addr 判断——但注意:allow/deny 指令本身不支持变量,所以实际仍要靠 geo + if 方案(见下一点)。
用 geo + if 实现更灵活的办公网段判断
当需要兼容代理、或未来要扩展策略(比如不同网段返回不同页面),推荐用 geo 指令预定义变量:
- 在
http块顶部添加:
geo $office_ip {
default 0;
192.168.5.0/24 1;
10.10.20.0/24 1;
127.0.0.1 1;
}- 回到
server块的location /中写:
if ($office_ip = 0) {
return 403;
}这个方案自动适配 set_real_ip_from 后的 $realip_remote_addr,只要你在 geo 定义里用的是 $realip_remote_addr(默认是 $remote_addr,需显式改写)。
别忘了健康检查和运维探针
很多团队配置完白名单后,服务突然“不可用”,其实是负载均衡器的健康检查请求被拦了。
- 查 access.log,过滤 403 请求,看来源 IP 是什么(常见如 100.64.0.1、172.16.0.1 等)
- 把健康检查源 IP 加进白名单,例如:
allow 100.64.0.1; allow 172.16.0.0/16;
否则 Nginx 返回 403,SLB 或 Kubernetes Ingress 会判定后端异常,导致整个服务下线。











