Global Accelerator (GA) は、クライアントIPアドレス保存機能を提供します。 この機能を有効にすると、バックエンドサーバーに保存されているクライアントIPアドレスを表示できます。 このトピックでは、さまざまなシナリオでクライアントIPアドレスの保存を有効にし、バックエンドサーバーで保存されているクライアントIPアドレスを表示する方法について説明します。
前提条件
Global Acceleratorインスタンスのリスナーが作成されます。 詳細については、「インテリジェントルーティングリスナーの追加と管理」をご参照ください。
背景情報
デフォルトでは、GAがバックエンドサーバーにリクエストを転送した後、バックエンドサーバーは、バックエンドサーバーが属するエンドポイントグループのIPアドレスのみを取得できます。 バックエンドサーバーは、リクエストを送信するクライアントのIPアドレスを取得できません。 バックエンドサーバーでクライアントのIPアドレスを取得する場合は、GAインスタンスのクライアントIPアドレスの保存を有効にする必要があります。 GAインスタンスがクライアントIPアドレスの保存をサポートするかどうかは、GAインスタンスのリスナーが使用するプロトコルによって異なります。
HTTPおよびHTTPS: クライアントIPアドレスの保存をサポートします。 クライアントのIPアドレスは、
X-Forwarded-For
HTTPヘッダーに保持されます。 バックエンドサーバーは、X-Forwarded-For
HTTPヘッダーからクライアントのIPアドレスを取得します。UDP: クライアントIPアドレスの保存をサポートしていません。
TCP: クライアントIPアドレスの保存をサポートします。 バックエンドサーバーがクライアントIPアドレスを取得できるように、バックエンドサービスのタイプに基づいてバックエンドサーバーの設定を変更する必要がある場合があります。 次の表に、バックエンドサーバーの設定方法を示します。
バックエンドサービスの場所
バックエンドサービスの種類
クライアントIPアドレスの保存
バックエンドサーバーの設定を変更するかどうか
説明
Alibaba Cloud
Alibaba CloudパブリックIPアドレス
関連付けられたインスタンスに基づいて:
VPCのElastic Compute Service (ECS) インスタンス: サポート
Network Load Balancer (NLB) インスタンス: サポート
Application Load Balancer (ALB) インスタンス: サポートされていません
内部対応のClassic Load Balancer (CLB) インスタンス: サポート
インターネットNATゲートウェイ: サポート
ECSインスタンスに関連付けられている: 不要
NLBインスタンスに関連付けられている: 必須
内部対応のCLBインスタンスに関連付けられている: 不要
インターネットNATゲートウェイに関連付けられている:
10月2022日より前に作成された既存のNAT Gateway: 必須
10月2022日以降に作成されたNAT Gateway: 不要
必須: クライアントIPアドレスの保存を有効にすると、GAはプロキシプロトコルを使用してクライアントIPアドレスを保存します。 したがって、バックエンドサーバーはプロキシプロトコルをサポートする必要があります。
重要バックエンドサーバーがプロキシプロトコルをサポートしていない場合、バックエンドサーバーはリクエスト内のプロキシプロトコルヘッダーを解析できません。
不要: クライアントIPアドレスの保存を有効にすると、バックエンドサーバーはクライアントIPアドレスを取得できます。 バックエンドサーバーの設定を変更する必要はありません。
ECS
対応
ECSインスタンスはVPCにデプロイされている必要があり、セキュリティグループルールはすべてのクライアントIPアドレスがECSインスタンスにアクセスできるように設定されています。
不要
ENI
対応
セキュリティグループルールは、すべてのクライアントIPアドレスがelastic network interface (ENI) にアクセスできるように設定されています。
OSS
非対応
vSwitch
既定ではサポートされていません。
この機能を使用する場合は、アカウントマネージャーに連絡してください。
CLB
対応
セキュリティグループルールは、すべてのクライアントIPアドレスがCLBバックエンドサーバーにアクセスできるように設定されています。
次のシナリオでは、バックエンドサーバーはクライアントIPアドレスを取得できません。
CLBインスタンスのバックエンドサーバーは、クラシックネットワークにデプロイされたECSインスタンスです。
CLBインスタンスのリスナーにはHTTPまたはHTTPSが使用されます。
ALB
非対応
NLB
対応
必須/任意
サードパーティのクラウド
カスタムIPアドレス
対応
必須/任意
カスタムドメイン名
対応
Proxy Protocolは、TCPパケットにProxy protocolヘッダーを追加し、リクエストにクライアントIPアドレスを含めることができるインターネットプロトコルです。
プロキシプロトコルが使用されている場合、バックエンドサーバーは、サーバーが完全で有効なプロキシプロトコルヘッダーを受信した後にのみデータを処理します。 したがって、リスナーは、Proxy Protocolヘッダーを含むリクエストとProxy Protocolヘッダーを含まないリクエストを同じバックエンドサーバーポートに転送することはできません。 バックエンドサーバーに到着した最初のデータパケットがプロキシプロトコル形式に準拠していない場合、バックエンドサーバーはクライアントへの接続を閉じます。
HTTPまたはHTTPSリスナーを使用してリクエストを配信する場合、クライアントIPアドレスの保存を有効にする
デフォルトでは、HTTPまたはHTTPSリスナーに対してクライアントIPアドレスの保存が有効になっています。 バックエンドサーバーは、X-Forwarded-For
HTTPヘッダーからクライアントIPアドレスを取得できます。
クライアントIPアドレスの保存を有効にします。
デフォルトでは、クライアントIPアドレスの保存はHTTPおよびHTTPSリスナーに対して有効になっています。 GAは、リクエストをバックエンドサーバーに転送する前に、クライアントのIPアドレスを
X-Forwarded-For
HTTPヘッダーに保持します。 バックエンドサーバーがリクエストを受信すると、X-Forwarded-For
HTTPヘッダーからクライアントIPアドレスを取得できます。クライアントのIPアドレスを取得します。
次の例は、
X-Forwarded-For
HTTPヘッダーの形式を示しています。 第1のIPアドレスは、クライアントのIPアドレスである。X-Forwarded-For: client IP address, IP address of Proxy Server 1, IP address of Proxy Server 2,...
TCPリスナーを使用してAlibaba Cloud上のバックエンドサーバーにリクエストを配信する場合、クライアントIPアドレスの保存を有効にする
GAインスタンスがTCPリスナーを使用し、バックエンドサーバーがAlibaba Cloudにデプロイされている場合、追加の変更を加えることなくクライアントIPアドレスの保存を有効にできます。
クライアントIPアドレスの保存を有効にします。
GAコンソール にログインします。
インスタンスページで、管理するGAインスタンスを見つけて、リスナーの設定で、アクション列を作成します。
リスナータブで、変更するリスナーを見つけて、変更で、アクション列を作成します。
では、リスナーとプロトコルの設定ステップ、次へをクリックします
では、エンドポイントグループの設定ステップ、選択保存からクライアントIPの保持ドロップダウンリストをクリックし、次へをクリックします
バックエンドサービスがAlibaba Cloudにデプロイされている場合、クライアントIPの取得はデフォルトでクライアントIPの自動取得に設定されます。
クライアントIPの自動取得: IPv4クライアントはバックエンドサービスの場合にアクセスします。このオプションを選択することを推奨します。 このモードでは、クライアントIPアドレスが自動的に取得されます。 バックエンドサービスを設定する必要はありません。 バックエンドサービスがAlibaba Cloudにデプロイされていない場合、このオプションは選択できません。
プロキシプロトコル: バックエンドサービスにIPv6クライアントがアクセスする場合、このオプションを選択することを推奨します。 このモードでは、バックエンドサーバーがプロキシプロトコルをサポートしている場合にのみ、クライアントIPアドレスを取得できます。
詳細については、このトピックの「背景情報」セクションをご参照ください。
では、確認ステップ、設定を確認し、送信をクリックします
クライアントのIPアドレスを取得します。
この例では、Linuxを実行するECSインスタンスで保存されているクライアントIPアドレスを表示する方法を示します。
Linuxを実行しているECSインスタンスにログインします。
次のコマンドを実行して、HTTPリクエストをキャプチャします。
tcpdump tcp port [Listening port] -n -X -s 0
キャプチャしたリクエストのクライアントIPアドレスを確認します。
結果は、クライアントIPアドレスが保持され、バックエンドサーバーで表示できることを示しています。
クライアントIPアドレスの保存が無効になっている場合、バックエンドサーバーが属するエンドポイントグループのIPアドレスのみを表示できます。
TCPリスナーを使用してAlibaba Cloud外部のバックエンドサーバーにリクエストを配信する場合、クライアントIPアドレスの保存を有効にする
Alibaba Cloudの外部にデプロイされたバックエンドサーバーに関連付けられているTCPリスナーのクライアントIPアドレスの保存を有効にするには、バックエンドサーバーがプロキシプロトコルをサポートしていることを確認します。 このセクションでは、NGINXサーバーを例として使用して、プロキシプロトコルヘッダーを解析し、クライアントIPアドレスを取得する方法を説明します。
クライアントIPアドレスの保存を有効にします。
GAコンソール にログインします。
インスタンスページで、管理するGAインスタンスを見つけて、リスナーの設定で、アクション列を作成します。
リスナータブで、変更するリスナーを見つけて、変更で、アクション列を作成します。
では、リスナーとプロトコルの設定ステップ、次へをクリックします
では、エンドポイントグループの設定ステップ、選択保存からクライアントIPの保持ドロップダウンリストをクリックし、次へをクリックします
バックエンドサービスがAlibaba Cloudにデプロイされていない場合、クライアントIPの取得はデフォルトでプロキシプロトコルに設定されます。
クライアントIPの自動取得: IPv4クライアントはバックエンドサービスの場合にアクセスします。このオプションを選択することを推奨します。 このモードでは、クライアントIPアドレスが自動的に取得されます。 バックエンドサービスを設定する必要はありません。 バックエンドサービスがAlibaba Cloudにデプロイされていない場合、このオプションは選択できません。
プロキシプロトコル: バックエンドサービスにIPv6クライアントがアクセスする場合、このオプションを選択することを推奨します。 このモードでは、バックエンドサーバーがプロキシプロトコルをサポートしている場合にのみ、クライアントIPアドレスを取得できます。
詳細については、このトピックの「背景情報」セクションをご参照ください。
では、確認ステップ、設定を確認し、送信.
プロキシプロトコルヘッダーを受け入れるようにNGINXサーバーを設定します。
NGINXの
http{}
およびstream{}
モジュールは、Proxy Protocolヘッダーを受け入れることができます。http{}
またはstream{}
モジュールでプロキシプロトコルヘッダーを受け入れるポートを指定できます。http { #... server { listen 8080 proxy_protocol; # Accept and parse the Proxy Protocol header on port 8080. #... } } stream { #... server { listen 1235 proxy_protocol; # Accept and parse the Proxy Protocol header on port 1235. #... } }
クライアントのIPアドレスを取得します。
指定されたポートでリクエストを受信すると、NGINXはリクエスト内のProxy Protocolヘッダーを解析し、クライアントIPアドレスをproxy_protocol_addr変数に保持します。 したがって、次のいずれかの方法を使用して、クライアントのIPアドレスを取得できます。
HTTPリクエストを受信した場合は、次のHTTPリクエストヘッダーにクライアントIPアドレスを保持できます。
http { proxy_set_header X-Real-IP $proxy_protocol_addr; proxy_set_header X-Forwarded-$proxy_protocol_addr; }
バックエンドサーバーは、
X-Forwarded-For HTTP
ヘッダーからクライアントIPアドレスを取得できます。 HTTPヘッダーの最初のIPアドレスは、クライアントのIPアドレスです。X-Forwarded-For: client IP address, IP address of Proxy Server 1, IP address of Proxy Server 2,...
HTTPリクエストまたはTCPリクエストを受信した場合、クライアントIPアドレスをフローログに保持できます。 バックエンドサーバーは、フローログからクライアントIPアドレスを取得できます。
http{}
またはstream{}
モジュールのlog_formatを変更して、フローログにクライアントIPアドレスを保持します。http { #... log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ' ##Add the proxy_protocol_addr variable to log_format in the http{} module. The client IP address is preserved in the proxy in the proxy_protocol_addr variable. '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent"'; } #... stream { #... log_format basic '$proxy_protocol_addr - [$time_local] ' ##Add the proxy_protocol_addr variable to log_format in the stream{} module. The client IP address is preserved in the proxy_protocol_addr variable. '$protocol $status $bytes_sent $bytes_received ' '$session_time'; }
次のコマンドを実行してフローログを照会し、クライアントIPアドレスを取得します。
次のコードブロックは、プロキシプロトコルを使用してクライアントIPアドレスを保持する方法の完全な例です。
worker_processes 4; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; log_format main '$proxy_protocol_addr $remote_addr - $remote_user [$time_local] "$request" '##Add the proxy_protocol_addr variable to log_format in the http{} module. The client IP address is preserved in the proxy_protocol_addr variable. '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; sendfile on; keepalive_timeout 65; upstream backend { server 192.XX.XX.36:8080; server 192.XX.XX.37:8080; keepalive 2000; } server { listen 80 proxy_protocol; ## Accept and parse the Proxy Protocol header on port 80. server_name example.com; proxy_set_header X-Real-IP $proxy_protocol_addr; ## Preserve the client IP address in the HTTP header field before the request is sent to a backend server. proxy_set_header X-Forwarded-For $proxy_protocol_addr; access_log /var/log/nginx/access.log main; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Connection ""; } } } stream { log_format tcp_basic '$proxy_protocol_addr - [$time_local] ' ##Add the proxy_protocol_addr variable to log_format in the stream{} module. The client IP address is preserved in the proxy_protocol_addr variable. '$protocol $status $bytes_sent $bytes_received ' '$session_time'; upstream stream_backend { server 192.XX.XX.36:2003; server 192.XX.XX.37:2003; } server { listen 1234 proxy_protocol; ## Accept and parse the Proxy Protocol header on port 1234. access_log /var/log/nginx/access_tcp.log tcp_basic; proxy_pass stream_backend; } }
フローログを照会します。 フローログの最初のIPアドレスは、クライアントのIPアドレスです。