文档首页> Linux命令> 如何给Nginx配置访问IP白名单

如何给Nginx配置访问IP白名单

发布时间:2026-03-15 00:21       

在 Nginx 中配置 IP 白名单是提升网站安全性的常用手段,它可以精确控制哪些客户端 IP 地址能够访问特定的资源,比如管理后台、API 接口或敏感目录。通过简单的 allow 和 deny 指令,我们就能实现基于 IP 的访问控制,且无需修改应用程序代码。下面我将从原理到实践,手把手教你如何配置,并附上详细的分析说明表。


一、工作原理 📡

Nginx 的 ngx_http_access_module 模块提供了 allow 和 deny 指令,它们按照配置顺序依次检查客户端的 IP 地址。一旦匹配到某个规则,就立即执行相应的操作(允许或拒绝),后续规则不再生效。因此,规则的顺序至关重要——通常我们先将允许的 IP 写在前面,最后用 deny all 拒绝其他所有请求。

例如:

allow 192.168.1.100;
allow 10.0.0.0/24;
deny all;
​

上述配置会先允许单个 IP 192.168.1.100 和整个 10.0.0.0/24 网段访问,然后拒绝来自其他任何 IP 的请求。


二、配置步骤详解 🛠️

1. 确认模块是否可用

Nginx 默认编译了 ngx_http_access_module,通常无需额外安装。你可以通过 nginx -V 2>&1 | grep http_access_module 快速验证。

2. 编辑 Nginx 配置文件

根据你的需求,将白名单规则放置在合适的配置块中:

  • http 块:全局生效,影响所有虚拟主机。
  • server 块:仅影响该站点。
  • location 块:只对特定 URI 生效。

示例场景:只允许公司内网 IP 访问 /admin 路径。

打开站点配置文件(如 /etc/nginx/conf.d/example.com.conf),在 server 块内添加:

server {
    listen 80;
    server_name example.com;

    location /admin {
        allow 192.168.1.0/24;   # 允许内网网段
        allow 10.10.10.10;      # 允许特定管理机
        deny all;               # 拒绝其他所有
        # 其他配置...
    }

    location / {
        # 公开访问区域,不设白名单
    }
}
​

3. 保存配置并测试语法

nginx -t
​

若输出 syntax is ok 和 test is successful,说明配置无误。

4. 重新加载 Nginx 使配置生效

nginx -s reload
​

三、高级用法:使用 geo 模块管理白名单 📋

当白名单列表较长或需要动态更新时,建议使用 geo 模块定义变量,使配置更清晰。geo 模块可以根据客户端 IP 设置变量值,然后在 allow/deny 或 if 语句中引用。

示例:创建一个名为 $white_list 的变量,只有白名单内的 IP 才允许访问。

geo $white_list {
    default 0;
    192.168.1.0/24 1;
    10.10.10.10    1;
    203.0.113.5    1;
}

server {
    location /admin {
        if ($white_list) {
            set $pass 1;  # 仅作演示,实际可用 allow/deny
        }
        # 配合 access 模块更简单:
        allow 192.168.1.0/24;   # 保留直接 allow
        # 但若用 geo 变量,可以这样:
        # if ($white_list = 0) { return 403; }
    }
}
​

更常见的做法是结合 map 或直接在 allow 中写网段,geo 的优势在于可以将 IP 列表集中管理,便于维护。


四、分析说明表:指令与配置位置

指令/位置 作用说明 示例 注意事项
allow 允许指定的 IP 或网段访问 allow 192.168.1.0/24; 必须与 deny 配合使用,通常放在前面。
deny 拒绝指定的 IP 或网段访问 deny 10.0.0.1; 若单独使用 deny all,需配合前面的 allow
http块 全局生效,所有站点继承 放在 http{} 内 影响所有虚拟主机,慎用。
server块 仅影响该虚拟主机 放在 server{} 内 适合为不同站点设置不同策略。
location块 仅对特定 URI 生效 放在 location /admin {} 内 最灵活,可精确控制目录或接口。
geo模块 根据 IP 设置变量,用于动态决策 geo $limited { default 1; 127.0.0.1 0; } 需要编译进 Nginx,通常已默认包含。

五、常见问题与排查 🔍

❓ 为什么配置了 allow 但仍然被拒绝?

  • 规则顺序错误:如果 deny all 写在 allow 之前,所有请求都会被拒绝。务必先写 allow 后写 deny。
  • 代理/负载均衡:如果 Nginx 前端有 CDN 或反向代理(如蓝易云 CDN),Nginx 收到的真实客户端 IP 可能是代理的 IP,而非