插件窝 干货文章 Nginx反向代理中基于网段的访问控制

Nginx反向代理中基于网段的访问控制

网段 反向 Nginx proxy 113    来源:    2025-04-20

Nginx反向代理中的基于网段访问控制

在Nginx反向代理配置中,基于网段的访问控制是一种常见的安全措施,可以限制只有特定IP范围的客户端能够访问后端服务。以下是实现这一功能的几种方法:

1. 使用allowdeny指令

location / {
    # 允许192.168.1.0/24网段访问
    allow 192.168.1.0/24;

    # 允许10.0.0.0/8网段访问
    allow 10.0.0.0/8;

    # 拒绝所有其他IP
    deny all;

    proxy_pass http://backend_server;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}

2. 使用geo模块实现更复杂的控制

geo $acl {
    default         0;
    192.168.1.0/24  1;
    10.0.0.0/8      1;
    172.16.0.0/12   1;
}

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

        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

3. 结合map模块实现动态控制

map $remote_addr $allowed_ip {
    default 0;

    # 允许的IP网段
    "~^192\.168\.1\." 1;
    "~^10\."         1;
    "~^172\.(1[6-9]|2[0-9]|3[0-1])\." 1;
}

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

        proxy_pass http://backend_server;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

4. 在反向代理层和上游服务层同时控制

# 反向代理层控制
location /api/ {
    allow 192.168.1.0/24;
    deny all;

    proxy_pass http://api_server;
}

# 上游服务配置(在api_server的配置中)
location / {
    allow 10.0.0.0/8;
    allow 192.168.1.0/24;
    deny all;
}

最佳实践建议

  1. 多层防护:在网络防火墙、反向代理和应用层都实施访问控制
  2. 日志记录:记录被拒绝的访问尝试以便审计

    log_format acl_log '$remote_addr - $remote_user [$time_local] '
                      '"$request" $status $body_bytes_sent '
                      '"$http_referer" "$http_user_agent" $acl_status';
    
    access_log /var/log/nginx/acl.log acl_log;
    
  3. 定期审查:定期审查允许的IP网段列表,移除不再需要的访问权限
  4. 性能考虑:对于大型IP列表,考虑使用ngx_http_geoip_module或外部数据库

注意事项

  • 确保Nginx能够获取真实的客户端IP(特别是在使用CDN或负载均衡器时)
  • 对于IPv6地址,使用相应的CIDR表示法(如2001:db8::/32
  • 测试配置变更时保持一个管理IP不受限制

通过合理配置基于网段的访问控制,可以显著增强Nginx反向代理环境的安全性。