Skip to content

Nginx IP 访问控制

在 Nginx 中,可以通过 allowdeny 指令轻松实现对特定 IP 或 IP 段的访问控制(黑白名单)。


🛠️ 基本语法

  • allow address | CIDR | unix: | all;:允许访问。
  • deny address | CIDR | unix: | all;:拒绝访问。

匹配规则:Nginx 会按照配置文件中的顺序 从上到下 依次检查。一旦匹配成功,就会停止检查并执行相应的操作。


📝 配置示例

1. 阻止特定 IP 访问

如果您发现某个 IP 恶意请求,可以将其加入黑名单:

nginx
server {
    listen 80;
    server_name localhost;

    location / {
        # 拒绝特定 IP
        deny 192.168.0.63;
        deny 123.45.67.89;

        # 允许其他所有 IP
        allow all;

        root /usr/share/nginx/html;
        index index.html;
    }
}

2. 仅允许特定 IP/网段访问(白名单)

常用于内部管理后台或 API 接口:

nginx
location /admin/ {
    # 只允许公司内部网段访问
    allow 192.168.1.0/24;
    allow 10.0.0.0/8;
    
    # 拒绝除此之外的所有访问
    deny all;
}

🏗️ 作用域

allowdeny 指令可以放置在以下块中:

  1. http: 全局生效,影响所有虚拟主机。
  2. server: 仅对当前虚拟主机生效。
  3. location: 仅对匹配到的 URL 路径生效。

📂 使用外部文件管理 IP 列表

当黑名单 IP 非常多时,直接写在主配置文件中会显得混乱且难以维护。可以使用 include 指令导入外部文件。

  1. 创建一个文件 /etc/nginx/block_ips.conf:

    nginx
    deny 192.168.1.1;
    deny 192.168.1.2;
    # ... 更多 IP
  2. nginx.conf 中引入:

    nginx
    http {
        include block_ips.conf;
        # ...
    }

⚠️ 注意事项

  1. 顺序非常重要
    • 错误示例:
      nginx
      allow all;
      deny 192.168.1.1; # 这行永远不会被执行,因为上面已经 allow all 了
  2. 反向代理下的真实 IP: 如果 Nginx 位于负载均衡器(如 SLB、CDN)之后,$remote_addr 可能是代理服务器的 IP。此时需要配合 ngx_http_realip_module 模块来获取真实的客户端 IP。

🔗 参考资料

Released under the MIT License.