Alibaba Cloud Global Accelerator (GA) を使用してアプリケーションを高速化する場合、クライアント IP 保持機能を有効にして、クライアントの送信元 IP アドレスを取得できます。レイヤー 7 リスナーの場合、HTTP リクエストヘッダーの X-Forwarded-For フィールドを使用して、クライアントの送信元 IP アドレスを取得できます。レイヤー 4 リスナーの場合、バックエンドサービスの種類に応じて、自動的に、または Proxy Protocol を使用して送信元 IP アドレスを取得できます。
クライアント IP の保持は、スマートルーティングリスナーのみがサポートしています。カスタムルーティングリスナーは、デフォルトではこの機能をサポートしていません。カスタムルーティングリスナーでクライアント IP の保持を有効にするには、アカウントマネージャーにお問い合わせください。
HTTP または HTTPS リスナー
メソッド
デフォルトで有効になっている [クライアント IP の保持] 機能を使用できます。
GA は、クライアントの送信元 IP アドレスを HTTP リクエストヘッダーの X-Forwarded-For フィールドに保存します。バックエンドサーバーを設定すると、サーバーはこのアドレスを取得できます。フィールドの最初の IP アドレスは、クライアントの送信元 IP アドレスです。
X-Forwarded-For: <クライアントの送信元 IP, プロキシサーバー 1 の IP, プロキシサーバー 2 の IP, ...>手順
このトピックでは、Alibaba Cloud Linux 3 と Nginx 1.20.1 を実行するバックエンドサーバーを例として使用します。設定は、使用する環境によって異なる場合があります。
NGINX サーバーでコマンド
nginx -V | grep http_realip_moduleを実行して、http_realip_module モジュールが NGINX サーバーにインストールされているかどうかを確認します。NGINX サーバーは、http_realip_module モジュールを使用して X-Forwarded-For の値を解析します。出力に
--with-http_realip_moduleが含まれている場合、http_realip_module が NGINX サーバーにインストールされていることを示し、次のステップに進むことができます。説明2011 年にリリースされた NGINX 1.0.4 以降は、http_realip_module モジュールをサポートしています。NGINX のバージョンが 1.0.4 より前の場合は、データをバックアップして新しいバージョンにアップグレードすることをお勧めします。
http_realip_module モジュールが NGINX サーバーにインストールされていない場合は、NGINX を再度コンパイルしてインストールし、http_realip_module をインストールします。YUM などのパッケージマネージャを使用して NGINX をインストールおよび管理することをお勧めします。パッケージマネージャはプロセスを簡素化します。
NGINX 設定ファイルを変更して保存します。次のコードブロックに例を示します。コマンド
nginx -tを実行して設定ファイルのパスをクエリします。デフォルトでは/etc/nginx/nginx.confです。パスは使用する環境によって異なる場合があります。http { # X-Forwarded-For の値を記録するために使用される変数 $http_x_forwarded_for を設定します。 log_format main '$remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; # ... }コマンド
sudo nginx -s reloadを実行して NGINX 設定ファイルを再読み込みします。クライアントの送信元 IP アドレスを取得します。
Nginx ログを確認して、クライアントの送信元 IP アドレスが取得されていることを確認します。
コマンド
tail -n <返すログエントリ数> <ログパス>を実行します。ログ出力で、$http_x_forwarded_for変数に対応するフィールドを表示します。最初の IP アドレスがクライアントの送信元 IP アドレスです。このトピックでは、Nginx ログファイルのデフォルトパス
/var/log/nginx/access.logを使用します。
説明Global Accelerator のヘルスチェックを有効にしている場合、複数のログエントリを表示するか、ヘルスチェック間隔を一時的に増やす必要がある場合があります。これにより、ヘルスチェックログがクライアントの送信元 IP アドレスを含むログエントリを上書きするのを防ぎます。
TCP リスナー
メソッド
[クライアント IP の保持] 機能を有効にします。次に、クライアントの送信元 IP アドレスを取得するメソッドを選択します。
サポートされているメソッドは、バックエンドサービスの種類によって異なります。
クライアント IP の自動取得: クライアントの送信元 IP アドレスは、バックエンドサーバーに直接転送されます。
Proxy Protocol: バックエンドサーバーは、クライアントの送信元 IP アドレスを取得するために Proxy Protocol をサポートする必要があります。
重要Proxy Protocol は、プロキシサーバーとバックエンドサーバーの両方がサポートしている場合にのみ機能します。バックエンドサーバーが Proxy Protocol ヘッダーを解析できない場合、この機能を有効にすると解析エラーが発生し、サービスの可用性に影響する可能性があります。
GA リスナーは、送信元 IP、宛先 IP、送信元ポート、宛先ポートなどの元の接続情報を転送するために Proxy Protocol をサポートしています。この情報は、既存のデータを破棄または上書きすることなく TCP データヘッダーに追加されます。
GA は Proxy Protocol v1 のみをサポートしています。Proxy Protocol v1 は TCP プロトコルのみをサポートしています。詳細については、「The PROXY protocol」をご参照ください。
Alibaba Cloud にデプロイされたバックエンドサービス
バックエンドサービスの種類 | クライアント IP 保持のサポート | メソッド | |
ECS | サポートされています。 ECS インスタンスは VPC (Virtual Private Cloud) 内にある必要があります。ECS インスタンスのセキュリティグループは、すべてのクライアント送信元 IP アドレスからのトラフィックを許可する必要があります。 |
| |
ALB | サポートされていません。 | 該当なし | |
NLB | サポートされています。 |
| |
CLB | サポートされています。 CLB バックエンドサーバーのセキュリティグループは、すべてのクライアント送信元 IP アドレスからのトラフィックを許可する必要があります。 次のシナリオでは、バックエンドサーバーはクライアントの送信元 IP アドレスを取得できないことに注意してください。
|
| |
OSS | サポートされていません。 | 該当なし | |
ENI | サポートされています。 ENI のセキュリティグループは、すべてのクライアント送信元 IP アドレスからのトラフィックを許可する必要があります。 |
| |
カスタムプライベート IP | サポートされています。 | Proxy Protocol | |
Alibaba Cloud パブリック IP アドレス 警告 エンドポイントが Alibaba Cloud パブリック IP アドレスであり、パブリック IP アドレスが元のインスタンスからデタッチされて別のインスタンスにアタッチされた場合、クライアント IP の保持が失敗し、トラフィックが中断される可能性があります。エンドポイントのクライアント IP 保持機能を復元するには、エンドポイントを削除して再作成するか、アカウントマネージャーに支援を依頼してください。 | VPC タイプの ECS インスタンスにアタッチ | サポートされています。 |
|
NLB インスタンスにアタッチ | サポートされています。 |
| |
ALB インスタンスにアタッチ | サポートされていません。 | 該当なし | |
プライベート CLB インスタンスにアタッチ | サポートされています。 |
| |
ENI にアタッチ | サポートされています。 |
| |
パブリック NAT ゲートウェイインスタンスにアタッチ | サポートされています。 | Proxy Protocol | |
Alibaba Cloud の外部にデプロイされたバックエンドサービス
バックエンドサービスの種類 | クライアント IP 保持のサポート | メソッド |
カスタムパブリック IP | サポートされています。 | Proxy Protocol |
カスタムドメイン名 | サポートされています。 |
クライアントが IPv6 アクセラレーション IP アドレスを使用して GA にアクセスする場合、または GA が IPv6 を介してバックエンドと通信する場合、クライアントの送信元 IP アドレスを取得するには Proxy Protocol を使用する必要があります。
手順
このトピックでは、Alibaba Cloud Linux 3 と Nginx 1.20.1 を実行するバックエンドサーバーを例として使用します。設定は、使用する環境によって異なる場合があります。
自動
クライアント IP の保持を有効にします。
Global Accelerator コンソールにログインします。
[インスタンス] ページで、対象の Global Accelerator インスタンスを見つけ、[アクション] 列の [リスナーの設定] をクリックします。
[リスナー] タブで、対象の TCP リスナーを見つけ、[アクション] 列の [リスナーの変更] をクリックします。
[リスナーとプロトコルの設定] ステップで、[次へ] をクリックします。
[エンドポイントグループの設定] ステップで、[クライアント IP の保持] リストから [保持] を選択し、[次へ] をクリックします。
バックエンドサービスが Alibaba Cloud にデプロイされている場合、[クライアントの送信元 IP を取得するメソッド] はデフォルトで [クライアント IP の自動取得] に設定されます。

[設定の確認] ステップで、設定を確認し、[送信] をクリックします。
Nginx サービス設定ファイルを表示します。
コマンド
nginx -tを実行して設定ファイルのパスを表示できます。デフォルトでは、パスは/etc/nginx/nginx.confです。実際のパスは環境によって異なる場合があります。説明バックエンドサービスが HTTP および HTTPS トラフィックのみを処理する必要がある場合は、Nginx サーバーが
http{}モジュールをサポートしていることを確認してください。バックエンドサービスが TCP トラフィックも処理する必要がある場合は、Nginx サーバーがstream{}モジュールをサポートしていることを確認してください。stream{}モジュールは NGINX 1.9.0 以降で追加されました。ただし、このモジュールはデフォルトではインストールされていません。stream{}モジュールをコンパイルしてインストールする必要があります。# HTTP トラフィックの処理 http { # デフォルト設定 log_format main '$remote_addr- $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; # リスナーポート 80 を例として使用 server { listen 80; #... } } # TCP トラフィックの処理 (必要に応じて追加) stream { log_format main_stream '$remote_addr - [$time_local] ' '"$protocol" $status $bytes_sent $bytes_received ' '"$session_time"'; access_log /var/log/nginx/stream_access.log main_stream; # リスナーポート 4000 を例として使用 server { listen 4000; #... } }クライアントの送信元 IP アドレスを取得します。
方法 1: Nginx ログを確認して、クライアントの送信元 IP アドレスが取得されていることを確認します。
コマンド
tail -n <返すログエントリ数> <ログパス>を実行します。ログ出力で、最初の IP アドレス ($remote_addr変数に対応するフィールド) を確認します。これがクライアントの送信元 IP アドレスです。HTTP トラフィックの場合:
このシナリオでは、ログファイルのパスは
/var/log/nginx/access.logです。
TCP トラフィックの場合:
このシナリオでは、ログファイルのパスは
/var/log/nginx/stream_access.logです。
方法 2: パケットをキャプチャして、クライアントの送信元 IP アドレスが取得されていることを確認します。
コマンド
tcpdump tcp port [リスナーポート] -n -X -s 0を実行して、キャプチャされたパケット内のクライアントの送信元 IP アドレスを表示します。
Proxy Protocol の使用
クライアント IP の保持を有効にします。
Global Accelerator コンソールにログインします。
[インスタンス] ページで、対象の Global Accelerator インスタンスを見つけ、[アクション] 列の [リスナーの設定] をクリックします。
[リスナー] タブで、対象の TCP リスナーを見つけ、[アクション] 列の [リスナーの変更] をクリックします。
[リスナーとプロトコルの設定] ステップで、[次へ] をクリックします。
[エンドポイントグループの設定] ステップで、[クライアント IP の保持] タブから [保持] を選択し、[次へ] をクリックします。
バックエンドサービスが Alibaba Cloud の外部にデプロイされている場合、[クライアントの送信元 IP を取得するメソッド] はデフォルトで [ProxyProtocol] に設定されます。

[設定の確認] ステップで、設定を確認し、[送信] をクリックします。
Nginx サービス設定ファイルを変更して保存します。
コマンド
nginx -tを実行して設定ファイルのパスを表示できます。デフォルトでは、パスは/etc/nginx/nginx.confです。実際のパスは環境によって異なる場合があります。説明バックエンドサービスが HTTP および HTTPS トラフィックのみを処理する必要がある場合は、Nginx サーバーが
http{}モジュールをサポートしていることを確認してください。バックエンドサービスが TCP トラフィックも処理する必要がある場合は、Nginx サーバーがstream{}モジュールをサポートしていることを確認してください。stream{}モジュールは NGINX 1.9.0 以降で追加されました。ただし、このモジュールはデフォルトではインストールされていません。stream{}モジュールをコンパイルしてインストールする必要があります。# HTTP トラフィックの処理 http { # 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"'; access_log /var/log/nginx/access.log main; # リスナーポート 80 を例として使用し、proxy_protocol の解析を有効にします。 server { listen 80 proxy_protocol; #... } } # TCP トラフィックの処理 (必要に応じて追加) stream { # stream{} モジュールのログフォーマットに、クライアントの送信元 IP アドレスを保存する $proxy_protocol_addr 変数を必ず追加してください。 log_format main_stream '$proxy_protocol_addr - $remote_addr - $protocol [$time_local] ' '$status $bytes_sent $bytes_received $session_time'; access_log /var/log/nginx/stream_access.log main_stream; # リスナーポート 12345 を例として使用し、proxy_protocol の解析を有効にします。 server { listen 12345 proxy_protocol; #... } }コマンド
sudo nginx -s reloadを実行して Nginx 設定ファイルを再読み込みします。クライアントの送信元 IP アドレスを取得します。
Nginx ログを確認して、クライアントの送信元 IP アドレスが取得されていることを確認します。
コマンド
tail -n <返すログエントリ数> <ログパス>を実行します。ログ出力で、$proxy_protocol_addr変数に対応する IP アドレスを確認します。これがクライアントの送信元 IP アドレスです。HTTP トラフィックの場合:
このシナリオでは、ログファイルのパスは
/var/log/nginx/access.logです。
TCP トラフィックの場合:
このシナリオでは、ログファイルのパスは
/var/log/nginx/stream_access.logです。
UDP リスナー
メソッド
[クライアント IP の保持] 機能を使用します。この機能を有効にすると、デフォルトでは [クライアント IP の自動取得] メソッドのみがサポートされます。GA は、クライアントの送信元 IP アドレスをバックエンドサーバーに直接転送します。
UDP リスナーに対して [クライアント IP の保持] を有効にする場合、次の制限が適用されます。
この機能は、従量課金 GA インスタンスでのみサポートされます。
お使いの従量課金 GA インスタンスが UDP リスナーの [クライアント送信元 IP の保持] をサポートしていない場合、インスタンスが古いバージョンである可能性があります。GA インスタンスをアップグレードするには、アカウントマネージャーにお問い合わせください。
[バックエンドサービスタイプ] は [ECS]、[ENI]、または [NLB] のみです。[NLB] タイプのバックエンドサービスの場合、[クライアント IP の保持] 機能はデフォルトで有効になっていません。この機能を使用するには、アカウントマネージャーにお問い合わせください。
IPv4 バックエンドサーバーは IPv4 クライアントの送信元 IP アドレスのみを取得でき、IPv6 バックエンドサーバーは IPv6 クライアントの送信元 IP アドレスのみを取得できます。
手順
このトピックでは、Alibaba Cloud Linux 3 と Nginx 1.20.1 を実行するバックエンドサーバーを例として使用します。設定は、使用する環境によって異なる場合があります。
クライアント IP の保持を有効にします。
Global Accelerator コンソールにログインします。
[インスタンス] ページで、対象の Global Accelerator インスタンスを見つけ、[アクション] 列の [リスナーの設定] をクリックします。
[リスナー] タブで、対象の UDP リスナーを見つけ、[アクション] 列の [リスナーの変更] をクリックします。
[リスナーとプロトコルの設定] ステップで、[次へ] をクリックします。
[エンドポイントグループの設定] ステップで、[クライアント IP の保持] タブから [保持] を選択し、[次へ] をクリックします。
この場合、[クライアントの送信元 IP を取得するメソッド] はデフォルトで [クライアント IP の自動取得] に設定されます。

[設定の確認] ステップで、設定を確認し、[送信] をクリックします。
Nginx サービス設定ファイルを表示します。
コマンド
nginx -tを実行して設定ファイルのパスを表示できます。デフォルトでは、パスは/etc/nginx/nginx.confです。実際のパスは環境によって異なる場合があります。説明UDP トラフィックを処理するには、バックエンドサービスの Nginx サーバーが
stream{}モジュールをサポートしている必要があります。stream{}モジュールは NGINX 1.9.0 以降で追加されました。ただし、このモジュールはデフォルトではインストールされていません。stream{}モジュールをコンパイルしてインストールする必要があります。#... # UDP トラフィックの処理 (このモジュールを必ず含めてください) stream { log_format main_stream '$remote_addr - [$time_local] ' '"$protocol" $status $bytes_sent $bytes_received ' '"$session_time"'; access_log /var/log/nginx/stream_access.log main_stream; # UDP リスナーポート 4000 を例として使用 server { listen 4000 udp; #... } }クライアントの送信元 IP アドレスを取得します。
方法 1: Nginx ログを確認して、クライアントの送信元 IP アドレスが取得されていることを確認します。
コマンド
tail -n <返すログエントリ数> <ログパス>を実行します。ログ出力で、最初の IP アドレス ($remote_addr変数に対応するフィールド) を確認します。これがクライアントの送信元 IP アドレスです。このシナリオでは、ログファイルのパスは
/var/log/nginx/stream_access.logです。
方法 2: パケットをキャプチャして、クライアントの送信元 IP アドレスが取得されていることを確認します。
コマンド
tcpdump udp port [リスナーポート] -n -X -s 0を実行して、キャプチャされたパケット内のクライアントの送信元 IP アドレスを表示します。
よくある質問
クライアント IP 保持機能を有効にしても機能しないのはなぜですか?
HTTP または HTTPS リスナーを使用し、バックエンドサーバーが
X-Forwarded-Forヘッダーを記録または処理できない場合、クライアント IP アドレスの保持は有効になりません。TCP リスナーを使用する場合:
バックエンドサービスが Alibaba Cloud にデプロイされているが、バックエンドサーバーが VPC (Virtual Private Cloud) にデプロイされていないか、Elastic IP アドレス (EIP) が VPC タイプのインスタンスに関連付けられていない場合、バックエンドサーバーはクライアント IP アドレスを保持できません。
バックエンドサービスが Alibaba Cloud の外部にデプロイされている場合、バックエンドサーバーはクライアント IP アドレスを保持できるように Proxy Protocol をサポートする必要があります。
これは、クライアント IP アドレスの保持を有効にした後、GA が Proxy Protocol を使用してクライアント IP アドレスを保持するためです。したがって、バックエンドサーバーが Proxy Protocol をサポートしていることを確認する必要があります。そうしないと、バックエンドサーバーは Proxy Protocol ヘッダーを解析できません。
クライアントが IPv6 アドレスを使用して IPv4 バックエンドサービスにアクセスする場合、バックエンドサーバーは Proxy Protocol をサポートする必要があります。そうしないと、バックエンドサーバーはクライアント IP アドレスを保持できません。
UDP リスナーを使用し、クライアントが IPv6 アドレスを使用して IPv4 バックエンドサービスにアクセスする場合、クライアント IP アドレスの保持は有効になりません。
クライアント IP アドレスの保持を無効にするにはどうすればよいですか?
HTTP リスナーと HTTPS リスナーの場合、クライアント IP アドレスの保持は自動的に有効になり、無効にすることはできません。
TCP および UDP リスナーの場合、GA コンソールでクライアント IP アドレスの保持を無効にできます。次の手順を実行します。
[インスタンス] ページで、管理する GA インスタンスを見つけ、[アクション] 列の [リスナーの設定] をクリックします。
[リスナー] タブで、管理するリスナーを見つけ、[アクション] 列の [リスナーの変更] をクリックします。
[リスナーとプロトコルの設定] ステップで、[次へ] をクリックします。
[エンドポイントグループの設定] ステップで、[クライアント IP の保持] を [保持しない] に設定し、[次へ] をクリックします。
[設定の確認] ステップで、情報を確認し、[送信] をクリックします。
GA が IPv6 クライアントから IPv4 サービスへのトラフィックを処理するときに、クライアントの送信元 IP アドレスを取得するにはどうすればよいですか?
HTTP および HTTPS リスナーは、
X-Forwarded-ForHTTP ヘッダーを使用して、IPv6 および IPv4 クライアントのクライアント IP アドレスを取得します。TCP リスナーは、Proxy Protocol を使用して IPv6 クライアントのクライアント IP アドレスを取得します。このメソッドでは、バックエンドサーバーが Proxy Protocol をサポートしている必要があります。そうしないと、アクセスが失敗する可能性があります。
UDP リスナーは、IPv6 クライアントのクライアント IP アドレスを取得できません。
リファレンス
コンソール操作
GA の アクセスログ 機能を使用して、クライアントの送信元 IP アドレスを取得することもできます。対象のエンドポイントグループのアクセスログを作成します。収集されたアクセスログは、エンドポイントグループがデプロイされているリージョンの Simple Log Service (SLS) の Logstore に配信されます。Logstore の [Raw Logs] タブで、アクセスリクエストログの [client_ip] フィールドでクライアントの送信元 IP アドレスを表示できます。
エンドポイントグループのバックエンドサービスの設定と注意事項の詳細については、「エンドポイントグループとエンドポイント」および「スマートルーティングリスナーのエンドポイントグループの追加と管理」をご参照ください。
API リファレンス
次の API 操作を呼び出すときに、EnableClientIPPreservation パラメーター (自動メソッド用) と EnableProxyProtocol パラメーター (Proxy Protocol メソッド用) を使用して、クライアントの送信元 IP アドレスの取得方法を設定できます。
CreateEndpointGroup - エンドポイントグループを作成します。
UpdateEndpointGroup - エンドポイントグループの設定を変更します。