Network Load Balancer (NLB) のレイヤー 4 リスナーを使用すると、バックエンドサーバーはクライアント IP アドレスを取得できます。ほとんどの場合、サーバーグループでクライアント IP 保持を有効にすれば十分です。ただし、IPv6 クライアントが IPv4 サービスにアクセスする場合、NLB インスタンスが TCPSSL リスナーを使用する場合、または NLB インスタンスが IP タイプのサーバーグループに関連付けられている場合は、NLB リスナーとバックエンドサーバーの両方で Proxy Protocol を有効にする必要があります。
クライアント IP アドレスの取得方法

クライアント IP 保持の使用
NLB インスタンスのサーバーグループを作成する際に、[クライアントアドレスの保持] を有効にできます。この機能を有効にすると、バックエンドサーバーは実際のクライアント IP アドレスを送信元 IP アドレスとして受信します。
特定のシナリオでは、クライアント IP 保持は利用できず、代わりに Proxy Protocol を使用する必要があります。詳細については、「Proxy Protocol の使用」をご参照ください。
Proxy Protocol の使用
Proxy Protocol は、クライアントの元の接続情報をプロキシサーバーからバックエンドサーバーに伝達するためのプロトコルです。
Proxy Protocol を使用しない場合、プロキシサーバーはリクエストヘッダー内のクライアントの送信元 IP アドレスとポートを自身のアドレスとポートに置き換えるため、バックエンドサーバーは元の接続情報を確認できません。
Proxy Protocol を使用すると、プロキシサーバーは専用のヘッダーに元の接続情報を付加します。バックエンドサーバーはこのヘッダーを解析して、クライアントの送信元 IP アドレス、送信元ポート、およびトランスポートプロトコルを取得します。
これにより、バックエンドサーバー上での正確なログ記録、アクセス制御、およびトラフィックモニタリングが可能になります。
-
重要:Proxy Protocol は、プロキシサーバー (この場合は NLB リスナー) とバックエンドサーバーの両方でサポートされている必要があります。この機能を有効にしてもバックエンドサーバーが Proxy Protocol ヘッダーを解析できない場合、リクエストの解析が失敗し、サービス可用性に影響を与える可能性があります。
-
NLB リスナーは Proxy Protocol を使用して、送信元 IP アドレス、宛先 IP アドレス、送信元ポート、宛先ポートなどの元の接続情報を TCP または UDP データヘッダーに追加します。このプロセスでは、既存のデータが破棄されたり上書きされたりすることはありません。
-
NLB は Proxy Protocol v2 のみをサポートします。Proxy Protocol v2 は TCP や UDP などの複数のトランスポートプロトコルをサポートします。詳細については、「The PROXY protocol」をご参照ください。
以下のシナリオでは、NLB リスナーとバックエンドサーバーの両方で Proxy Protocol を有効にする必要があります。
-
IPv6 クライアントがバックエンドサーバー上の IPv4 サービスにアクセスする場合
-
NLB インスタンスが TCPSSL リスナーを使用する場合 (TCPSSL リスナーは、クライアント IP 保持が有効になっているサーバーグループに関連付けることはできません)
-
NLB インスタンスが IP タイプのサーバーグループに関連付けられている場合 (IP タイプのサーバーグループはクライアント IP 保持をサポートしていません)
手順
クライアント IP 保持
前提条件
-
NLB サーバーグループを作成し、そこにバックエンドサーバーを追加済みであること。ここでは、ECS タイプのサーバーグループを例として使用します。バックエンドプロトコルは TCP、バックエンドサーバーとして ECS インスタンスが使用され、バックエンドサーバー上のアプリケーションはポート 80 を使用します。詳細については、「NLB のサーバーグループ」をご参照ください。
-
NLB インスタンスを作成し、そこにリスナーを追加済みであること。ここでは、ポート 80 の TCP リスナーを例として使用します。詳細については、「NLB インスタンスの作成と管理」および「TCP リスナーの追加」をご参照ください。
ステップ 1: クライアント IP 保持の確認
-
Network Load Balancer コンソールにログインします。
-
上部メニューで、インスタンスがデプロイされているリージョンを選択します。
-
サーバーグループ ページで、対象のサーバーグループを見つけ、その ID をクリックします。
-
サーバーグループの詳細ページで、クライアントアドレスの保持 フィールドが 有効 に設定されていることを確認します。無効 になっている場合は、基本情報の変更 をクリックして機能を有効にします。
ステップ 2: クライアント IP 取得の検証
NGINX がバックエンドサーバーとして使用されている場合、NGINX のログを参照して、クライアント IP アドレスが取得されていることを確認できます。
次の例は、NGINX のデフォルトのログフィールド設定を示しています。
http {
# デフォルト設定
log_format main '$remote_addr- $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#...
}
NGINX ログファイルのデフォルトパスは /var/log/nginx/access.log です。
各ログエントリの最初の IP アドレスがクライアント IP アドレスです。
140.205.1xxx -- [xxx] xxx xxx xxx xxx xxx xxx
xxx xxx xxx xxx xxx xxx xxx xxx xxx xxx
140.205.xx.29 -- [27/xxx] xxx xxx xxx xxx xxx xxx 527 xxx
xxx xxx xxx xxx xxx xxx xxx xxx xxx
140.205.xx.29 -- [2xxx] xxx xxx 304 xxx xxx xxx xxx xxx
Proxy Protocol
前提条件
-
NLB サーバーグループを作成し、そこにバックエンドサーバーを追加済みであること。ここでは、ECS タイプのサーバーグループを例として使用します。バックエンドプロトコルは TCP、バックエンドサーバーとして ECS インスタンスが使用され、バックエンドサーバー上のアプリケーションはポート 80 を使用します。詳細については、「NLB のサーバーグループ」をご参照ください。
-
NLB インスタンスを作成し、そこにリスナーを追加済みであること。ここでは、ポート 80 の TCP リスナーを例として使用します。詳細については、「NLB インスタンスの作成と管理」をご参照ください。
説明-
Proxy Protocol を有効にする前に、バックエンドサーバーが Proxy Protocol v2 をサポートしていることを確認してください。そうでない場合、新しい接続は失敗します。
-
インスタンス上の複数のリスナーが同じサーバーグループに関連付けられている場合は、すべてのリスナーで Proxy Protocol を有効にする必要があります。
-
NGINX Plus R16 以降およびオープンソースの NGINX 1.13.11 以降は Proxy Protocol v2 をサポートしています。
-
ステップ 1: リスナーでの Proxy Protocol の有効化
-
Network Load Balancer コンソールにログインします。
-
上部メニューで、インスタンスがデプロイされているリージョンを選択します。
-
インスタンス ページで、対象のインスタンスを見つけ、その ID をクリックします。
-
インスタンスの詳細 ページで、リスナー タブをクリックし、対象のリスナーを見つけて、リスナー ID をクリックします。
-
リスナーの詳細 ページで、Proxy Protocol の有効化 フィールドが 有効 に設定されていることを確認します。有効になっていない場合は、リスナーの変更 をクリックして機能を有効にします。
ステップ 2: バックエンドサーバーでの Proxy Protocol の有効化
ここでは、CentOS 7.9 と NGINX 1.20.1 を例として使用します。ご使用の環境によって設定は異なる場合があります。
-
バックエンドサーバーにログインし、
nginx -tコマンドを実行して設定ファイルのパスを確認します。デフォルトのパスは通常/etc/nginx/nginx.confですが、実際のパスは異なる場合があります。 -
以下の例のように、設定ファイルを変更して保存し、Proxy Protocol を有効にします。
http { # クライアント IP アドレスを記録するため、$proxy_protocol_addr を設定します。 log_format main '$proxy_protocol_addr - $remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # ポート 80 のリッスン設定に proxy_protocol パラメーターを追加します。 server { listen 80 proxy_protocol; #... } } -
sudo nginx -s reloadコマンドを実行して NGINX 設定ファイルをリロードします。
ステップ 3: クライアント IP 取得の検証
NGINX がバックエンドサーバーとして使用されている場合、NGINX のログを参照して、クライアント IP アドレスが取得されていることを確認できます。
NGINX ログファイルのデフォルトパスは /var/log/nginx/access.log です。
各ログエントリにおいて、$proxy_protocol_addr 変数の IP アドレスがクライアント IP アドレスです。
140.205.1xxx -- [xxx]
xxx
140.205.xx.29 -- [27/xxx] xxx xxx xxx
xxx
140.205.xx.29 -- [2xxx] 304 xxx xxx xxx
xxx
Proxy Protocol v2 ヘッダーリファレンス
NGINX を使用しない場合は、以下の Proxy Protocol v2 ヘッダー構造と「The PROXY protocol」を参照して、カスタム解析を実装してください。詳細については、ご使用のサーバーの公式ドキュメントをご参照ください。
-
以下の図は、IPv4 クライアントアドレスを伝送する場合の Proxy Protocol v2 のバイナリヘッダー形式を示しています。

-
以下の図は、IPv6 クライアントアドレスを伝送する場合の Proxy Protocol v2 のバイナリヘッダー形式を示しています。

よくある質問
ACK 環境でのクライアント IP の取得
Container Service for Kubernetes (ACK) クラスターでロードバランサーを使用する場合、メソッドは同じですが、一部の操作の詳細が異なります。詳細については、「ネットワーク管理に関するよくある質問」をご参照ください。
関連ドキュメント
クライアント IP アドレスの取得方法は、ロードバランサーの種類によって異なります。
-
クラシックロードバランサー (CLB) インスタンスのレイヤー 4 リスナーを使用する場合、クライアント IP アドレスを直接取得するか、Proxy Protocol を有効にして取得できます。詳細については、「CLB インスタンスのレイヤー 4 リスナーを介したクライアント IP アドレスの取得」をご参照ください。
-
CLB インスタンスのレイヤー 7 リスナーを使用する場合、X-Forwarded-For ヘッダーからクライアント IP アドレスを取得できます。詳細については、「CLB インスタンスのレイヤー 7 リスナーを介したクライアント IP アドレスの取得」をご参照ください。
-
Application Load Balancer (ALB) インスタンスを使用する場合、X-Forwarded-For ヘッダーからクライアント IP アドレスを取得できます。詳細については、「ALB インスタンスを介したバックエンドサーバーでのクライアント IP アドレスの取得」をご参照ください。