NGINX SSL 流上的 IP 透明度

NGINX SSL 流上的 IP 透明度

我正在设置一个服务器集群,使用 NGINX 作为负载均衡器。所有请求都通过 HTTPS 进行,因此负载均衡器使用流(SSL 直通)将请求直接传递到集群。

我需要终端服务器查看客户端 IP 而不是负载均衡器 IP。

我的 nginx.conf

## Misc other config stuff

stream {
  map $ssl_preread_server_name $backend_cluster_map {
    site.a cluster_1;
    site.b cluster_2;
    default cluster_1;
  }

  upstream cluster_1 {
    server 10.0.0.202:443;
    server 10.0.0.203:443;
  }

  upstream cluster_2 {
    server 10.0.0.204:443;
    server 10.0.0.205:443;
  }

  server {
    listen 443;
    proxy_pass $backend_cluster_map;
    ssl_preread on;
  }
}

我尝试更改服务器块以包含proxy_set_header转发 IP,但这没有通过 nginx 测试,并指出proxy_set_header directive is not allowed here

server {
  listen 443;
  proxy_protocol on;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Fowarded-Proto https;
  proxy_set_header X-Fowarded-For $remote_addr;
  proxy_set_header X-Fowarded-Host $remote_addr;
  proxy_pass $backend_cluster_map;
  ssl_preread on;
}

我想这与无法更改 SSL 请求有关。还有其他选择吗?我尝试不在负载均衡器上终止 SSL。

答案1

根据斯特芬·乌尔里希 (Steffen Ullrich) 的说法,我遵循https://www.nginx.com/resources/admin-guide/proxy-protocol/

在终端服务器上我添加了

server {
  listen 443 ssl proxy_protocol;
  ...
  set_real_ip_from 10.0.0.201;
  real_ip_header proxy_protocol;
  proxy_set_header X-Real-IP $proxy_protocol_addr;
  proxy_set_header X-Fowarded-For $proxy_protocol_addr;
  ...
}

并在负载均衡器上

server {
  listen 443;
  proxy_protocol on; # Make sure this is enabled
  proxy_pass $backend_cluster_map;
  ...
}

现在应用程序看到的是客户端 IP 地址,而不是具有 SSL 直通的负载均衡器的 IP 地址。

相关内容