Назад | Перейти на главную страницу

Прозрачность IP NGINX в потоке SSL

Я настраиваю кластер серверов с 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 на балансировщике нагрузки.

Построил то, что сказал Штеффен Ульрих, за которым я следил 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.