插件窝 干货文章 Nginx怎么通过geo模块设置白名单

Nginx怎么通过geo模块设置白名单

Nginx whitelist 名单 配置 205    来源:    2025-04-21

使用Nginx的geo模块设置IP白名单

Nginx的geo模块允许你基于客户端IP地址创建变量,非常适合用来实现IP白名单功能。以下是详细配置方法:

基本配置方法

  1. 在Nginx配置文件中(通常在http块中)添加geo模块配置:
http {
    # 定义白名单IP
    geo $whitelist {
        default 0;
        192.168.1.0/24 1;  # 允许整个192.168.1.x网段
        10.0.0.1 1;        # 允许单个IP
        203.0.113.42 1;    # 另一个允许的IP
    }

    server {
        listen 80;
        server_name example.com;

        # 使用白名单
        if ($whitelist = 0) {
            return 403;  # 拒绝非白名单IP
        }

        # 其他配置...
    }
}

更优化的配置方式

为了避免使用if指令(Nginx官方不推荐过多使用if),可以采用map模块:

http {
    # 定义白名单IP
    geo $whitelist {
        default 0;
        192.168.1.0/24 1;
        10.0.0.1 1;
    }

    # 将白名单映射为变量
    map $whitelist $access {
        0 "deny";
        1 "allow";
    }

    server {
        listen 80;
        server_name example.com;

        location / {
            # 使用allow/deny指令
            allow 127.0.0.1;  # 总是允许本地访问
            deny all;         # 默认拒绝所有
            allow_unroutable_bogus;  # 防止某些特殊情况

            # 根据geo结果决定是否允许
            eval $access;

            # 其他配置...
        }
    }
}

从文件加载白名单IP

对于大量IP地址,可以将它们存储在单独的文件中:

  1. 创建IP列表文件/etc/nginx/whitelist.conf
192.168.1.0/24 1;
10.0.0.1 1;
203.0.113.42 1;
  1. 在Nginx配置中引用:
http {
    geo $whitelist {
        default 0;
        include /etc/nginx/whitelist.conf;
    }
    # 其余配置...
}

注意事项

  1. 修改配置后记得测试并重载Nginx:
sudo nginx -t && sudo nginx -s reload
  1. 对于IPv6地址,需要单独添加:
geo $whitelist {
    ::1 1;  # IPv6本地地址
    2001:db8::/32 1;
}
  1. 在生产环境中,建议将频繁变动的IP白名单放在单独文件中,便于维护。

  2. 对于高安全性要求的场景,可以考虑结合其他认证方式,如HTTP基本认证。

通过以上方法,你可以灵活地控制哪些IP地址可以访问你的Nginx服务。