web-dev-qa-db-ja.com

SSLストリームでのNGINXIPの透明性

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を転送しようとしましたが、proxy_set_header directive is not allowed hereと記載されたnginxテストに合格しませんでした。

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を終了しないようにしています。

2
Jed Hodson

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;
  ...
}

また、アプリケーションは、SSLパススルーを使用するロードバランサーではなく、クライアントIPアドレスを認識します。

3
Jed Hodson