插件窝 干货文章 Nginx反向代理中基于白名单的访问控制配置

Nginx反向代理中基于白名单的访问控制配置

Nginx proxy 名单 http 301    来源:    2025-04-20

Nginx反向代理中基于白名单的访问控制配置

在Nginx中配置基于白名单的访问控制是保护后端服务安全的有效方法。以下是几种实现方式:

1. 使用allow/deny指令

location / {
    # 默认拒绝所有访问
    deny all;

    # 允许特定IP或IP段
    allow 192.168.1.100;
    allow 10.0.0.0/24;
    allow 172.16.0.0/16;

    # 反向代理配置
    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}

2. 使用geo模块动态管理白名单

# 在http块中定义geo映射
http {
    geo $whitelist {
        default 0;
        192.168.1.100 1;
        10.0.0.0/24 1;
        172.16.0.0/16 1;
    }

    server {
        location / {
            # 检查IP是否在白名单中
            if ($whitelist = 0) {
                return 403;
            }

            proxy_pass http://backend_server;
            # 其他proxy设置...
        }
    }
}

3. 使用map模块结合变量

http {
    map $remote_addr $allowed_ip {
        default 0;
        "192.168.1.100" 1;
        "10.0.0.1" 1;
        "172.16.0.5" 1;
    }

    server {
        location / {
            if ($allowed_ip = 0) {
                return 403;
            }

            proxy_pass http://backend_server;
            # 其他proxy设置...
        }
    }
}

4. 使用include分离白名单配置

创建单独的白名单文件 /etc/nginx/whitelist.conf:

allow 192.168.1.100;
allow 10.0.0.0/24;
allow 172.16.0.0/16;
deny all;

然后在Nginx配置中引用:

location / {
    include /etc/nginx/whitelist.conf;

    proxy_pass http://backend_server;
    # 其他proxy设置...
}

5. 结合HTTP基本认证

location / {
    satisfy any;  # 满足任一条件即可

    # IP白名单
    allow 192.168.1.100;
    deny all;

    # HTTP基本认证
    auth_basic "Restricted Area";
    auth_basic_user_file /etc/nginx/.htpasswd;

    proxy_pass http://backend_server;
    # 其他proxy设置...
}

最佳实践建议

  1. 定期审查白名单:确保只包含必要的IP地址
  2. 使用CIDR表示法:简化IP范围管理
  3. 考虑动态更新:对于频繁变化的IP,可以考虑使用Lua脚本或API动态更新
  4. 日志记录:记录被拒绝的访问尝试以便审计
  5. 多层级保护:结合防火墙等其他安全措施
# 示例:记录被拒绝的访问
map $remote_addr $loggable {
    default 1;
    192.168.1.100 0;
    10.0.0.0/24 0;
}

access_log /var/log/nginx/denied.log combined if=$loggable;

配置完成后,记得测试并重新加载Nginx配置:

sudo nginx -t && sudo nginx -s reload