最简明有效的做法是在 location 块内按顺序配置 allow 放行内网 cidr 网段(如 127.0.0.0/8、10.0.0.0/8 等),末尾紧跟 deny all;代理环境需用 set_real_ip_from 和 real_ip_header 还原真实 ip。

直接在对应 location 块里写 allow 放行内网段、再加 deny all 拦住其余请求,是最简明有效的做法。关键不是规则多复杂,而是位置对、顺序对、网段写对。
必须写在 location 块内部
白名单控制只在 location、server、http 或 limit_except 块中生效,但实际生产中强烈建议只放在 location 里:
- 比如后台路径是
/admin/、/manage/或/api/v1/manager,就单独定义一个location块 - 用
^~ /admin/这类前缀匹配更稳妥,避免被正则规则覆盖 - 不要写在
http或server顶层——会误杀静态资源、健康检查等路径 - 绝对不要塞进
if块里——语法不报错,但完全不执行访问控制
按标准 CIDR 格式写内网网段,顺序不能颠倒
内网常用地址段要严格用 CIDR 表示,每条 allow 独占一行,deny all 必须放在最后且只能出现一次:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
-
allow 127.0.0.0/8;(本机回环) -
allow 10.0.0.0/8;(A 类私有网段) -
allow 172.16.0.0/12;(B 类,覆盖 172.16–31.x.x) -
allow 192.168.0.0/16;(C 类) - IPv6 示例:
allow 2001:db8::/32;(如环境启用 IPv6) - 后面紧跟
deny all;,之后不能再跟其他allow或deny
代理环境下必须还原真实 IP
如果前端有 SLB、CDN 或 Nginx 自身做反向代理,$remote_addr 默认是上一跳代理地址,不是用户真实 IP。此时需配合:
-
set_real_ip_from声明可信代理网段,例如set_real_ip_from 10.0.0.0/8; -
real_ip_header X-Forwarded-For;(或X-Real-IP,取决于上游传递的头字段) - 确保
ngx_http_realip_module已启用(Nginx 默认内置) - 验证方式:临时加
add_header X-Real-IP $remote_addr;,看响应头是否为真实内网 IP
补充建议:提升可用性与安全性
仅靠 IP 控制还不够稳健,可叠加以下措施:
- 加
error_page 403 /403.html;,返回友好提示页,避免暴露后端结构 - 预留健康检查 IP:如果负载均衡器用固定 IP(如
100.64.0.1)探活,记得把它加进allow列表 - 敏感后台建议叠加
auth_basic,形成双因子防护 - 大量或动态 IP 列表场景,改用
geo模块预定义变量,再结合if控制,更灵活可靠










