nginx 中为特定路径配置 ip 白名单需将 allow/deny 指令置于对应 location 块内,allow 必在 deny all 之前,且须通过 real_ip_module 还原真实客户端 ip;复杂场景推荐用 geo 模块或外部文件管理白名单。

在 Nginx 中为特定访问路径(比如 /admin、/api/v1/ 或 /backup/)配置 IP 白名单,核心是把 allow 和 deny all 指令精准写在对应的 location 块内,顺序不能颠倒,且需确保识别的是真实客户端 IP。
白名单必须写在 location 块里
规则只对匹配的路径生效,不能放在 http 或 server 顶层。例如限制后台路径,就写在 location /admin/ { ... } 中:
- 支持单 IP:
allow 192.168.5.10; - 支持 IPv4 网段:
allow 10.0.0.0/8; - 支持 IPv6:
allow 2001:db8::/32; - 允许多个来源?直接分行追加多条
allow即可
顺序决定权限逻辑
Nginx 按行从上到下匹配,命中即终止。白名单本质是“先放行、再兜底拒绝”:
- 所有
allow必须写在deny all;之前 -
deny all;必须是该location中最后一条访问控制指令 - 漏掉
deny all;,未匹配的请求会默认放行,白名单失效
注意真实 IP 的还原问题
如果请求经过 CDN、SLB 或反向代理,$remote_addr 是代理节点 IP,不是用户真实 IP:
- 启用
real_ip_module,在http或server块中配置set_real_ip_from指定可信代理地址 - 设置
real_ip_header X-Forwarded-For;或X-Real-IP(取决于代理实际传递的头部) - 确认代理确实携带了这些头部,否则还原无效
复杂场景推荐用 geo 模块管理
当白名单 IP 较多、需跨多个 location 复用,或要脚本自动更新时,硬编码 allow/deny 易出错:
- 在
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;,便于自动化维护











