必须在location块中配置allow/deny,先写allow网段(如10.20.0.0/16)、再以deny all结尾,代理环境下需用set_real_ip_from和real_ip_header还原真实IP。

要在 Nginx 中只让特定内网网段访问运维管理后台,核心是用 allow 和 deny all 构建白名单,但必须满足三个硬性条件:规则写在 location 块里、allow 在前 deny all 在后、代理环境下要还原真实 IP。漏掉任一环节,配置就形同虚设。
只在 location 块中配,不放 server 或 if 里
管理后台路径(比如 /admin/、/manage/、/api/v1/ops)必须单独定义 location 块,把控制逻辑锁死在这个范围内:
- ✅ 正确写法:
location /admin/ { allow 10.20.0.0/16; allow 172.16.100.0/24; deny all; } - ❌ 错误写法:把
allow/deny放在server块顶层——会误拦健康检查、静态资源等;更不能塞进if块里,Nginx 完全不认 - ⚠️ 注意:如果后台接口分散(如
/ops/status和/api/monitor),每个对应location都得单独配一遍
按标准 CIDR 写准运维网段,别漏掩码
允许的地址必须用合法 CIDR 格式,常见私有网段示例(请替换成你实际的运维网段):
-
allow 10.20.0.0/16;—— 办公网段(覆盖 10.20.0.0–10.20.255.255) -
allow 172.16.100.0/24;—— 运维跳板机所在子网 -
allow 192.168.5.10;—— 单台关键跳板机 IP(支持单 IP 写法) -
allow 127.0.0.1;—— 建议保留,方便本地调试 - 如启用 IPv6,可加:
allow 2001:db8::/32;
顺序不能错:allow 全部写完,再写 deny all
Nginx 是从上到下逐行匹配,命中即停。白名单逻辑完全依赖这个顺序:
- 每条
allow独占一行,多个网段并列写 -
deny all;必须是该location中最后一条访问控制指令 - 后面不能再跟任何
allow或deny,否则会被忽略 - 漏掉
deny all?所有未列明的 IP 默认放行,等于没设防
前端有代理时,必须还原真实客户端 IP
如果 Nginx 前面有 SLB、CDN、Traefik 或另一层 Nginx,$remote_addr 拿到的是代理 IP,不是运维人员的真实出口 IP:
- 确认上游透传了
X-Forwarded-For头(且内容可信,需代理层清洗) - 在对应
location或server块中加入: set_real_ip_from 10.0.0.0/8;(替换成你可信代理的网段,如172.20.0.0/16) real_ip_header X-Forwarded-For; - 之后
allow判的才是真实 IP,否则规则完全失准 - 验证方式:临时加
add_header X-Real-IP $remote_addr;,看响应头是否为预期内网 IP











