すべてのプロダクト
Search
ドキュメントセンター

Server Load Balancer:バックエンドサーバーでのクライアント IP の取得

最終更新日:Aug 22, 2026

Application Load Balancer (ALB) がリクエストを転送する際、バックエンドサーバーに表示される送信元 IP アドレスは ALB インスタンスの IP アドレスです。ALB は、実際のクライアント IP を HTTP ヘッダーの X-Forwarded-For フィールドに追加できます。この IP は、バックエンドサーバーで簡単な設定を行うことで取得できます。

X-Forwarded-For フィールドの形式は次のとおりです:

X-Forwarded-For: <実際のクライアント IP, プロキシサーバー 1 の IP, プロキシサーバー 2 の IP, ...>

手順

手順 1: リスナー設定の確認: X-Forwarded-For

  1. ALB コンソールにログインし、対象インスタンスの ID をクリックして インスタンスの詳細 ページに移動します。

  2. リスナー タブで、対象リスナーの ID をクリックします。リスナーの詳細 ページの 基本情報 セクションで、HTTP ヘッダーの追加 が X-Forwarded-For を含むように設定されていることを確認します。

    このオプションはデフォルトで有効になっています。有効になっていない場合は、基本情報 セクションの リスナーの変更 をクリックし、詳細設定 セクションで有効にしてください。

手順 2:バックエンドサーバーの設定

  • このトピックでは、バックエンドサーバーのアクセスログに (X-Forwarded-For フィールドを介して) 実際のクライアント IP を記録する方法について説明します。サーバーの接続層の変数 (Nginx の $remote_addr や Apache の %h など) は、ALB の転送 IP (ローカル IP) に設定されたままで、影響を受けません。

  • 接続層の変数を実際のクライアント IP に直接置き換えたい場合 (これにより、これらの変数に基づく既存のロギング、アクセス制御、その他のルールが変更なしで機能するようになります) は、「Nginx または Apache による実際のクライアント IP の直接取得 (接続層アドレスの置換)」をご参照ください。

Nginx サーバー

このトピックでは、Alibaba Cloud Linux 3.2104 および nginx/1.20.1 を実行している Nginx サーバーを例に説明します。実際の設定は、お使いの環境によって異なる場合があります。

Nginx は http_realip_module モジュールを使用して X-Forwarded-For ヘッダーを解析し、実際のクライアント IP を取得します。

  1. モジュールのインストールの確認:サーバーで nginx -V 2>&1 | grep --color=auto http_realip_module コマンドを実行します。出力に --with-http_realip_module が含まれている場合、モジュールはインストールされています。

    image

    主要な Linux ディストリビューションでは、yum や apt などのパッケージマネージャーを介してインストールされた Nginx には、通常、このモジュールがデフォルトで含まれています。モジュールがインストールされていない場合は、パッケージマネージャーを使用して Nginx をインストールまたはアップグレードすることを推奨します。
  2. Nginx 設定ファイルの変更:sudo 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"';    
        # アクセスログで上記のログ形式を使用します。
        access_log  /var/log/nginx/access.log  main;
        #  ...
    }
  3. 設定のリロード: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 を取得します。

  1. モジュールのインストールの確認:サーバーで httpd -M | grep remoteip_module コマンドを実行します。出力に remoteip_module (shared) が含まれている場合、モジュールはインストールされています。

    image

    主要な Linux ディストリビューションでは、yum や apt などのパッケージマネージャーを介してインストールされた Apache には、通常、このモジュールがデフォルトで含まれています。モジュールがインストールされていない場合は、パッケージマネージャーを使用して Apache をインストールまたはアップグレードすることを推奨します。
  2. Apache 設定ファイルの変更:httpd -V を実行して設定ファイルのパスを確認します。デフォルトのパスは通常 /etc/httpd/conf/httpd.conf です。

    # ...
    <IfModule log_config_module>
    # ...
    # X-Forwarded-For ヘッダーの値を記録するため、ログ形式に %{X-Forwarded-For}i を含めます。
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %{X-Forwarded-For}i" combined
    # ...
    # アクセスログで上記のログ形式を使用します。
    CustomLog "logs/access_log" combined
    </IfModule>
    # ...
  3. 設定のリロード:sudo systemctl restart httpd を実行して変更を適用します。

IIS サーバー

このトピックでは、Windows Server 2022 21H2 および IIS 10.0 を実行している IIS サーバーを例に説明します。実際の設定は、お使いの環境によって異なる場合があります。

  1. IIS マネージャーの [接続] ペインで、対象のサーバーを選択します。メインペインで、[ログ] をダブルクリックします。

    image

  2. [ログ ファイル] セクションで、[フィールドの選択] をクリックします。

    image

  3. [W3C ログ フィールド] ダイアログボックスで、[フィールドの追加] をクリックします。[カスタム フィールドの追加] ダイアログボックスで、フィールド情報を設定し、[OK] をクリックします。

    • [フィールド名]:X-Forwarded-For と入力します。

    • [ソースの種類]:デフォルト値の 要求ヘッダー のままにします。

    • [ソース]:X-Forwarded-For と入力します。

    image

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

    image

  5. 右側の [操作] ペインで、[適用] をクリックして変更を保存します。

    image

手順 3:クライアント IP 取得の確認

バックエンドの Web サーバーのアクセスログをチェックして、実際のクライアント IP を取得できていることを確認します。

Nginx サーバー

Nginx アクセスログのデフォルトパスは /var/log/nginx/access.log です。

各ログエントリにおいて、$http_x_forwarded_for 変数の値が実際のクライアント IP です。

image

Apache サーバー

Apache アクセスログのデフォルトパスは /var/log/httpd/access_log です。

各ログエントリにおいて、%{X-Forwarded-For}i 変数の値が実際のクライアント IP です。

image

IIS サーバー

IIS アクセスログのデフォルトパスは %SystemDrive%\inetpub\logs\LogFiles です。

各ログエントリにおいて、最後の X-Forwarded-For フィールドの値が実際のクライアント IP です。

image

本番環境のベストプラクティス

  • X-Forwarded-For ヘッダーの検証とフィルタリング:バックエンドサーバーで、X-Forwarded-For ヘッダーを検証し、フィルタリングします。不正な形式のエントリや信頼できない IP アドレスを含むエントリは拒否します。

  • セキュリティポリシーの使用:ALB とバックエンドサーバー間でセキュリティグループやその他のサードパーティ製セキュリティポリシーを使用して、スプーフィングされた X-Forwarded-For ヘッダーを持つ悪意のあるリクエストを制限し、フィルタリングします。

  • TLS 暗号化:X-Forwarded-For ヘッダーの送信を含む、コンポーネント間の通信を保護するために TLS 暗号化を使用します。これにより、中間者攻撃やデータ改ざんのリスクが軽減されます。

よくある質問

100 から始まる IP からの頻繁なアクセス

  • アップグレード済みの ALB インスタンスは、関連付けられた vSwitch CIDR ブロックのプライベート IP アドレス (ローカル IP) を使用してバックエンドサーバーと通信します。

  • アップグレードされていない ALB インスタンスは、Alibaba Cloud によって予約されている 100.64.0.0/10 アドレス範囲を使用してバックエンドサーバーと通信します。これにはセキュリティリスクはありません。

ALB は、バックエンドサーバーへのリクエスト転送に加えて、継続的なヘルスチェックも行います。アップグレードされていない ALB インスタンスを使用している場合、バックエンドサーバーのアクセスログには、100.64.0.0/10 範囲の IP アドレスからの多数のリクエストが記録されます。

ALB インスタンスとバックエンドサービス間の適切な接続を確保するために、バックエンドの Elastic Compute Service (ECS) インスタンス上の iptables またはその他のサードパーティ製セキュリティソフトウェアが、ALB インスタンスの vSwitch CIDR ブロックまたは 100.64.0.0/10 アドレス範囲をブロックしていないことを確認してください。

WAF、CDN、または GA を使用する場合のクライアント IP の取得

トラフィックが ALB に到達する前に Web Application Firewall (WAF)、Content Delivery Network (CDN)、または Global Accelerator (GA) などのサービスによって転送される場合でも、X-Forwarded-For フィールドから実際のクライアント IP を取得できます。これらの製品は、デフォルトでこのヘッダーを転送するため、追加の設定は不要です。

X-Forwarded-For のスプーフィングを防ぐために、他の HTTP ヘッダーを使用して実際のクライアント IP を記録できます:

  • Alibaba Cloud CDN の Ali-Cdn-Real-Ip ヘッダーを使用します。アーキテクチャは、クライアント > CDN > WAF > ALB > ECS です。

    1. デフォルトでは、CDN はオリジンサーバーに転送するリクエストに Ali-Cdn-Real-Ip 要求ヘッダーを追加します。このヘッダーは、CDN のポイントオブプレゼンス (POP) に接続したクライアントの実際の IP アドレスを渡します。

    2. WAF と統合する際は、クライアント IP 検出用のカスタムヘッダーとして Ali-Cdn-Real-Ip を選択します。

    3. バックエンドの Nginx サーバーで $http_ali_cdn_real_ip ログ変数を設定して、このフィールドから実際のクライアント IP を取得します。

  • ALB リスナーの転送ルールの ヘッダーの挿入 アクションを使用して、リクエストに HTTP ヘッダー (キーと値のペア) を追加します。アーキテクチャは、クライアント > GA > ALB > ECS です。

    1. ALB リスナーの転送ルールで、転送操作 を ヘッダーの挿入 に設定します。この例では、キーは client-real-ip で、値は [システム定義] - [クライアント IP アドレス] に設定されています。

    2. リスナーで 実際のクライアントソース IP を見つける を有効にし、信頼できる IP アドレスリストにGA エンドポイントのパブリック出力 IP アドレスを追加します。

    3. バックエンドの Nginx サーバーで $http_client_real_ip ログ変数を設定して、このフィールドから実際のクライアント IP を取得します。

ACK 環境でのクライアント IP の取得

詳細については、「AlbConfig を使用した ALB インスタンスの設定」をご参照ください。

Nginx または Apache による実際のクライアント IP の直接取得 (接続層アドレスの置換)

Nginx

デフォルトでは、Nginx ログの $remote_addr は ALB の転送 IP (ローカル IP) を記録します。これを実際のクライアント IP に置き換えるには (これにより、既存のロギングおよびアクセス制御ルールが変更なしで機能するようになります)、ngx_http_realip_module モジュールを使用します:

  1. nginx -V 2>&1 | grep --color=auto http_realip_module を実行して、モジュールがインストールされていることを確認します。

  2. 設定ファイル (デフォルト: /etc/nginx/nginx.conf) の http ブロックに以下を追加します:

    set_real_ip_from  <インスタンスの vSwitch CIDR ブロック>;
    real_ip_header    X-Forwarded-For;
    real_ip_recursive on;
    アップグレードされていない ALB インスタンスを使用する場合、set_real_ip_from を 100.64.0.0/10 に設定します。
  3. sudo nginx -t を実行して構文を確認した後、sudo nginx -s reload を実行して設定をリロードします。

設定が有効になった後、アクセスログ (デフォルト: /var/log/nginx/access.log) を確認し、$remote_addr が実際のクライアント IP を表示するようになったことを確認します。
トラフィックが WAF や CDN などの複数のプロキシを通過する場合は、各プロキシレイヤーのオリジン IP 範囲を set_real_ip_from に追加します。
ヘルスチェックリクエストには X-Forwarded-For ヘッダーが含まれないため、これらのリクエストに対する $remote_addr は、引き続き ALB インスタンスの vSwitch CIDR ブロック (またはアップグレードされていないインスタンスの場合は 100.64.0.0/10) を表示します。これは想定される動作です。

Apache

デフォルトでは、Apache ログの %h は ALB の転送 IP (ローカル IP) を記録します。これを実際のクライアント IP に置き換えるには (これにより、既存のロギングおよび Require ip アクセス制御ルールが変更なしで機能するようになります)、Apache 2.4 に組み込まれている mod_remoteip モジュールを使用します:

  1. httpd -M | grep remoteip_module を実行して、モジュールがインストールされていることを確認します。

  2. 設定ファイル (デフォルト: /etc/httpd/conf/httpd.conf) に以下を追加します:

    RemoteIPHeader       X-Forwarded-For
    RemoteIPTrustedProxy <インスタンスの vSwitch CIDR ブロック>
    アップグレードされていない ALB インスタンスを使用する場合、RemoteIPTrustedProxy を 100.64.0.0/10 に設定します。
  3. sudo systemctl restart httpd を実行して Apache を再起動します。

設定が有効になった後、アクセスログ (デフォルト: /var/log/httpd/access_log) を確認し、%h が実際のクライアント IP を表示するようになったことを確認します。
トラフィックが WAF や CDN などの複数のプロキシを通過する場合は、各プロキシレイヤーのオリジン IP 範囲を RemoteIPTrustedProxy に追加します。
ヘルスチェックリクエストには X-Forwarded-For ヘッダーが含まれないため、これらのリクエストに対する %h は、引き続き ALB インスタンスの vSwitch CIDR ブロック (またはアップグレードされていないインスタンスの場合は 100.64.0.0/10) を表示します。これは想定される動作です。