ALB がリクエストを転送する際、バックエンドサーバーで認識されるソース IP アドレスは ALB インスタンスの IP アドレスです。ALB は HTTP ヘッダーの X-Forwarded-For フィールドにリアルクライアント IP を追加できます。バックエンドサーバー側で簡単な設定を行うことで、この情報を取得できます。
X-Forwarded-For フィールドの形式は次のとおりです:
X-Forwarded-For: <リアルクライアント IP, プロキシサーバー 1-IP, プロキシサーバー 2-IP, ...>
手順
ステップ 1: X-Forwarded-For のリスナー設定の確認
-
ALB コンソールにログオンし、対象のインスタンス ID をクリックすると、インスタンスの詳細 ページが表示されます。
-
リスナー タブで、ターゲットリスナーの ID をクリックします。リスナーの詳細 ページの 基本情報 セクションで、HTTP ヘッダーの追加 が
X-Forwarded-Forを含むように設定されていることを確認します。このオプションはデフォルトで有効になっています。有効になっていない場合は、基本情報 セクションで リスナーの変更 をクリックし、詳細設定 セクションで有効にします。
ステップ 2: バックエンドサーバーの設定
Nginx サーバー
このトピックでは、Alibaba Cloud Linux 3.2104 および nginx/1.20.1 を実行する Nginx サーバーを例に説明します。実際の設定は環境によって異なる場合があります。
Nginx は http_realip_module モジュールを使用して X-Forwarded-For ヘッダーを解析し、リアルクライアント IP を取得します。
-
モジュールがインストールされていることを確認します: サーバーで
nginx -V 2>&1 | grep --color=auto http_realip_moduleコマンドを実行します。出力に--with-http_realip_moduleが含まれている場合、モジュールはインストールされています。
主要な Linux ディストリビューションでは、
yumやaptなどのパッケージマネージャーを使用してインストールした Nginx には、通常このモジュールがデフォルトで含まれています。モジュールがインストールされていない場合は、パッケージマネージャーを使用して Nginx をインストールまたはアップグレードすることを推奨します。 -
Nginx 設定ファイルの変更:
sudo nginx -tを実行して、設定ファイルのパスを見つけます。デフォルトのパスは、通常/etc/nginx/nginx.confです。http { # ログフォーマットに $http_x_forwarded_for を追加し、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"'; # アクセスログが上記のフォーマットを使用するように設定します。 access_log /var/log/nginx/access.log main; # ... } -
設定の再読み込み:
sudo nginx -tを実行して設定構文を確認します。 構文が正しい場合は、sudo nginx -s reloadを実行して変更を適用します。
Apache サーバー
このトピックでは、Alibaba Cloud Linux 3.2104 および Apache/2.4.37 を実行する Apache サーバーを例に説明します。実際の設定は環境によって異なる場合があります。
Apache は mod_remoteip モジュールを使用して X-Forwarded-For ヘッダーを解析し、リアルクライアント IP を取得します。
-
モジュールのインストール確認:サーバーで
httpd -M | grep remoteip_moduleコマンドを実行します。 出力にremoteip_module (shared)が含まれている場合、モジュールはインストールされています。
主要な Linux ディストリビューションでは、
yumやaptなどのパッケージマネージャーを使用してインストールした Apache には、通常このモジュールがデフォルトで含まれています。モジュールがインストールされていない場合は、パッケージマネージャーを使用して Apache をインストールまたはアップグレードすることを推奨します。 -
Apache 設定ファイルの変更:
httpd -Vを実行して設定ファイルのパスを確認します。デフォルトのパスは通常/etc/httpd/conf/httpd.confです。# ... <IfModule log_config_module> # ... # ログフォーマットに %{X-Forwarded-For}i を追加し、X-Forwarded-For ヘッダーの値を記録します。 LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined # ... # アクセスログが上記のフォーマットを使用するように設定します。 CustomLog "logs/access_log" combined </IfModule> # ... -
設定の再読み込み:変更を適用するには、
sudo systemctl restart httpdを実行します。
IIS サーバー
このトピックでは、Windows Server 2022 21H2 および IIS 10.0 を実行する IIS サーバーを例に説明します。実際の設定は環境によって異なる場合があります。
-
IIS マネージャーの [Connections] ペインで対象のサーバーを選択します。メインペインで [Logging] をダブルクリックします。

-
[Log File] セクションで [Select Fields] をクリックします。

-
[W3C Logging Fields] ダイアログボックスで [Add Field] をクリックします。[Add Custom Field] ダイアログボックスでフィールド情報を設定し、[OK] をクリックします。
-
フィールド名:
X-Forwarded-Forを入力します。 -
ソースタイプ: デフォルト値 (
Request Header) のままにします。 -
ソース:
X-Forwarded-Forを入力します。

-
-
カスタムフィールドが追加されたことを確認し、[OK] をクリックします。

-
右側の [Actions] ペインで [Apply] をクリックして変更を保存します。

ステップ 3: クライアント IP 取得の確認
バックエンド Web サーバーのアクセスログで、リアルクライアント IP が取得されていることを確認します。
Nginx サーバー
Nginx アクセスログのデフォルトパスは /var/log/nginx/access.log です。
各ログエントリにおいて、$http_x_forwarded_for 変数の値がリアルクライアント IP です。

Apache サーバー
Apache アクセスログのデフォルトパスは /var/log/httpd/access_log です。
各ログエントリにおいて、%{X-Forwarded-For}i 変数の値がリアルクライアント IP です。

IIS サーバー
IIS アクセスログのデフォルトパスは %SystemDrive%\inetpub\logs\LogFiles です。
各ログエントリにおいて、最後の X-Forwarded-For フィールドの値がリアルクライアント IP です。

本番環境のベストプラクティス
-
X-Forwarded-For ヘッダーを検証してフィルタリングする: バックエンドサーバー上で X-Forwarded-For ヘッダーを検証してフィルタリングします。不適切な形式のエントリや信頼できない IP アドレスを含むエントリを拒否します。
-
セキュリティポリシーを使用する: ALB とバックエンドサーバー間でセキュリティグループまたはその他のサードパーティセキュリティポリシーを使用して、偽装された X-Forwarded-For ヘッダーを持つ悪意のあるリクエストを制限およびフィルタリングします。
-
TLS 暗号化: TLS 暗号化を使用して、X-Forwarded-For ヘッダーの送信を含むコンポーネント間の通信を保護します。これにより、中間者攻撃やデータ改ざんのリスクが軽減されます。
よくある質問
100 で始まる IP からの頻繁なアクセス
-
アップグレード済みの ALB インスタンスは、関連する vSwitch CIDR ブロックからのプライベート IP アドレス (ローカル IP) を使用してバックエンドサーバーと通信します。
-
アップグレードされていない ALB インスタンスは、バックエンドサーバーとの通信に、Alibaba Cloud が予約しているセキュリティリスクのないアドレス範囲
100.64.0.0/10を使用します。
ALB は、バックエンドサーバーへのリクエスト転送に加えて、継続的なヘルスチェックも実行します。アップグレードされていない ALB インスタンスを使用している場合、バックエンドサーバーのアクセスログには 100.64.0.0/10 範囲の IP アドレスからの多数のリクエストが記録されます。
ALB インスタンスとバックエンドサービス間の適切な接続を確保するために、バックエンド ECS インスタンス上の iptables またはその他のサードパーティセキュリティソフトウェアが ALB インスタンスの vSwitch CIDR ブロックまたは 100.64.0.0/10 アドレス範囲をブロックしていないことを確認してください。
WAF、CDN、または GA を使用したクライアント IP の取得
Web Application Firewall (WAF)、Content Delivery Network (CDN)、Global Accelerator (GA) などのサービスによってトラフィックが転送されてから ALB に到達する場合でも、X-Forwarded-For フィールドからリアルクライアント IP を取得できます。これらの製品はデフォルトでこのヘッダーを転送するため、追加の設定は不要です。
X-Forwarded-For の偽装を防ぐために、他の HTTP ヘッダーを使用してリアルクライアント IP を記録できます。
-
Alibaba Cloud CDN の
Ali-Cdn-Real-Ipヘッダーの使用。アーキテクチャは Client > CDN > WAF > ALB > ECS です。-
デフォルトでは、CDN はオリジンサーバーに転送されるリクエストに
Ali-Cdn-Real-Ipリクエストヘッダーを追加します。このヘッダーには、CDN の Point of Presence (POP) に接続したクライアントのリアル IP アドレスが格納されます。 -
WAF と統合する際は、クライアント IP 検出用のカスタムヘッダーとして
Ali-Cdn-Real-Ipを選択します。 -
バックエンド Nginx サーバー上で
$http_Ali_Cdn_Real_Ipログ変数を設定して、このフィールドからリアルクライアント IP を取得します。
-
-
ALB リスナーの転送ルールで ヘッダーの追加 アクションを使用すると、リクエストに HTTP ヘッダー (キーと値のペア) を追加できます。アーキテクチャはクライアント > GA > ALB > ECS です。
-
ALB リスナーの転送ルールで、転送操作 を ヘッダーの追加 に設定します。この例では、キーは
client-real-ipで、値はSystem-defined-Client IP Addressに設定されています。
-
リスナーについては、実際のクライアントソース IP を見つけるを有効にし、GA エンドポイントのパブリック Egress IP アドレスを信頼できる IP アドレスリストに追加します。
-
バックエンド Nginx サーバー上で
$http_client_real_ipログ変数を設定して、このフィールドからリアルクライアント IP を取得します。
-
ACK 環境でのクライアント IP の取得
詳細については、「AlbConfig を使用した ALB インスタンスの設定」をご参照ください。