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

Server Load Balancer:Application Load Balancer を介してバックエンドサーバーでクライアントの送信元 IP アドレスを取得する

最終更新日:Nov 09, 2025

Application Load Balancer (ALB) リスナーを使用してトラフィックを転送する場合、HTTP ヘッダーの X-Forwarded-For フィールドからクライアントの送信元 IP アドレスを取得できます。

X-Forwarded-For の仕組み

HTTP および HTTPS リスナーは X-Forwarded-For ヘッダーをサポートしています。バックエンドサーバーを構成して、X-Forwarded-For ヘッダーからクライアントの IP アドレスを取得できます。

X-Forwarded-For のフォーマット:

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

したがって、X-Forwarded-For ヘッダーに含まれる左端の IP アドレスがクライアントの IP アドレスです。

プロシージャ

ステップ 1: X-Forwarded-For ヘッダーを使用して IP アドレスを取得するようにリスナーが有効になっていることを確認する

  1. Application Load Balancer (ALB) コンソールにログインします。

  2. 上部のナビゲーションバーで、インスタンスがデプロイされているリージョンを選択します。

  3. [インスタンス] ページで、ターゲットインスタンスを見つけてそのインスタンス ID をクリックします。

  4. インスタンス詳細ページで、[リスナー] タブをクリックし、ターゲットリスナーを見つけてその ID をクリックします。

  5. リスナー詳細ページで、[HTTP ヘッダーの追加][X-Forwarded-For ヘッダーを使用してクライアント IP アドレスを取得] が含まれていることを確認します。

    説明

    デフォルトでは、ALB は X-Forwarded-For ヘッダーを使用してクライアントの送信元 IP アドレスを取得するように有効化されています。

ステップ 2: バックエンドサーバーを設定する

次のプロシージャは、バックエンドサーバーを設定する方法を示しています。使用するバックエンドサーバーのタイプに基づいてプロシージャを選択してください。

NGINX サーバーを設定する

この例では、CentOS 7.9 オペレーティングシステムと NGINX 1.20.1 を使用します。使用する環境に基づいて設定を調整してください。

  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 サーバーにインストールされていることを示しており、次のステップに進むことができます。

    http_realip_module がインストールされていることを示すサンプル出力

    nginx version: nginx/1.20.1
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
    built with OpenSSL 1.1.1k  FIPS 25 Mar 2021
    TLS SNI support enabled
    configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-compat --with-debug --with-file-aio --with-google_perftools_module --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_degradation_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_mp4_module --with-http_perl_module=dynamic --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-http_xslt_module=dynamic --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-stream_ssl_preread_module --with-threads --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
    
    説明
    • 2011 年にリリースされた NGINX 1.0.4 以降は http_realip_module モジュールをサポートしています。お使いの NGINX のバージョンが 1.0.4 より前の場合は、データをバックアップして新しいバージョンにアップグレードすることをお勧めします。

    • http_realip_module モジュールが NGINX サーバーにインストールされていない場合は、NGINX を再度コンパイルしてインストールし、その後 http_realip_module をインストールします。YUM などのパッケージマネージャを使用して NGINX をインストールおよび管理することをお勧めします。パッケージマネージャを使用するとプロセスが簡素化されます。

  2. 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"';
      
      # ...
    }
    
  3. sudo nginx -s reload コマンドを実行して NGINX 設定ファイルを再読み込みします。

Apache サーバーを設定する

この例では、CentOS 7.9 オペレーティングシステムと Apache 2.4.6 を使用します。使用する環境に基づいて設定を調整してください。

  1. Apache サーバーで httpd -M | grep remoteip_module コマンドを実行して、remoteip_module モジュールが Apache サーバーにインストールされているかどうかを確認します。Apache は remoteip_module を使用して X-Forwarded-For の値を解析します。

    出力に remoteip_module (shared) が含まれている場合、モジュールが Apache サーバーにインストールされていることを示しており、次のステップに進むことができます。

    説明
    • 2012 年にリリースされた Apache 2.4.0 以降は remoteip_module モジュールをサポートしています。お使いの Apache のバージョンが 2.4.0 より前の場合は、データをバックアップして新しいバージョンにアップグレードすることをお勧めします。

    • remoteip_module モジュールが Apache サーバーにインストールされていない場合は、Apache を再度コンパイルしてインストールし、その後 remoteip_module をインストールします。YUM などのパッケージマネージャを使用して Apache をインストールおよび管理することをお勧めします。パッケージマネージャを使用するとプロセスが簡素化されます。

  2. Apache 設定ファイルを変更して保存します。次のコードブロックに例を示します。設定ファイルのデフォルトパスは /etc/httpd/conf/httpd.conf です。パスは使用する環境によって異なる場合があります。

    # ...
    <IfModule log_config_module>
    	# X-Forwarded-For に関する情報を記録するために使用される LogFormat ディレクティブ %{X-Forwarded-For}i を追加します。
      LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
      LogFormat "%{X-Forwarded-For}i %h %l %u %t \"%r\" %>s %b" common
    	#...
    </IfModule>
    # ...

  3. sudo systemctl restart httpd コマンドを実行して Apache を再起動します。

IIS サーバーを設定する

この例では、Windows Server 2016 オペレーティングシステムを使用します。使用する環境に基づいて設定を調整してください。

  1. F5XForwardedFor ファイルをダウンロードして解凍します。

  2. x86\ または x64 ディレクトリから F5XFFHttpModule.dll および F5XFFHttpModule.ini ファイルを IIS サーバー上のディレクトリにコピーします。IIS プロセスがそのディレクトリに対する読み取りおよび書き込み権限を持っていることを確認してください。

  3. [サーバー マネージャー][IIS マネージャー] を開きます。

  4. IIS サーバーを選択し、[モジュール] をダブルクリックします。

  5. [ネイティブ モジュールの構成] をクリックし、表示されるダイアログボックスで [登録] をクリックします。

  6. ダウンロードした .dll ファイルを追加します。

    1. ファイル名を入力し、パスを選択して、[OK] をクリックします。

    2. 登録するモジュールが自動的に選択されます。[OK] をクリックします。

  7. IIS マネージャーのホームページに戻り、[ログ] をダブルクリックします。X-Forwarded-For に関する情報を記録するようにログフォーマットを設定します。

    1. [フィールドの選択] をクリックします。

      image.png

    2. 左下隅にある [フィールドの追加] をクリックし、次のフィールドを追加して、[OK] をクリックします。

      image.png

    3. 右側の [操作] ペインで [適用] をクリックします。

  8. IIS サーバーを再起動し、設定が有効になるまで待ちます。

ステップ 3: バックエンドサーバーがクライアントの IP アドレスを取得できるかテストする

次のプロシージャは、テストを実行する方法を示しています。使用するバックエンドサーバーのタイプに基づいてプロシージャを選択してください。

NGINX サーバー

NGINX サーバーを使用している場合、NGINX ログを確認して、バックエンドサーバーがクライアントの IP アドレスを取得できるかどうかを判断できます。

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

各ログエントリで、$http_x_forwarded_for 変数の左端の IP アドレスがクライアントの IP アドレスです。

image.png

Apache サーバー

Apache サーバーを使用している場合、Apache ログを確認して、バックエンドサーバーがクライアントの IP アドレスを取得できるかどうかを判断できます。

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

各ログエントリで、%{X-Forwarded-For}i 変数の左端の IP アドレスがクライアントの IP アドレスです。

image.png

IIS サーバー

IIS サーバーを使用している場合、IIS ログを確認して、バックエンドサーバーがクライアントの IP アドレスを取得できるかどうかを判断できます。

[ログ] モジュールでログファイルのパスを確認できます。

image.png

各ログエントリで、X-Forwarded-For の左端の IP アドレスがクライアントの IP アドレスです。

image.png

よくある質問

100 で始まる IP アドレスが ECS インスタンスに頻繁にアクセスするのはなぜですか?

Server Load Balancer システムは、外部リクエストをバックエンドの ECS インスタンスに転送します。また、ヘルスチェックを実行し、ECS インスタンスのサービス可用性をモニターします。これらのアクセスリクエストは、Server Load Balancer システムから送信されます。

アップグレードされた ALB インスタンスは、デフォルトで vSwitch CIDR ブロックのプライベート IP アドレス (ローカル IP) を使用してバックエンドの ECS インスタンスと通信します。対照的に、従来の ALB インスタンスは 100.64.0.0/10 のアドレス範囲を使用します。100.64.0.0/10 の範囲は Alibaba Cloud によって予約された CIDR ブロックです。この範囲の IP アドレスは他のユーザーに割り当てることはできないため、セキュリティリスクは存在しません。アップグレードされていない従来の ALB インスタンスを使用している場合、100 で始まる IP アドレスからの多くのアクセスリクエストが表示されることがあります。

サービスの可用性を確保するために、サーバーが ALB インスタンスのローカル IP または 100.64.0.0/10 CIDR ブロックからのトラフィックをブロックしないようにしてください。これには、iptables またはサードパーティのセキュリティポリシーソフトウェアを使用したトラフィックのブロックが含まれます。

WAF、CDN、または GA を使用している場合にクライアントの送信元 IP アドレスを取得する方法

トラフィックがロードバランサーに到達する前に Web Application Firewall (WAF)、CDN、または Global Accelerator (GA) などのプロダクトによって転送される場合でも、X-Forwarded-For フィールドからクライアントの送信元 IP アドレスを取得できます。これらのプロダクトは、デフォルトで X-Forwarded-For フィールドを通過させます。追加の設定は必要ありません。

ビジネスのセキュリティ要件が高く、X-Forwarded-For のなりすましを防ぎたい場合は、次の対策を講じることができます:

  • 他のプロダクトでヘッダーフィールドを指定して、クライアントの送信元 IP アドレスを記録します。

    たとえば、アーキテクチャがクライアント > CDN > WAF > Server Load Balancer > ECS の場合、CDN は HTTP ヘッダーで Ali-Cdn-Real-Ip フィールドを渡します。WAF を設定する際、クライアント IP アドレスの検出メソッドを指定されたヘッダーフィールド Ali-Cdn-Real-Ip を使用するように設定します。次に、バックエンドの Nginx サーバーでログ変数を $http_Ali_Cdn_Real_Ip として設定します。ログに記録される IP アドレスは、クライアントの送信元 IP アドレスです。

  • ALB でヘッダーフィールドを指定して、クライアントの送信元 IP アドレスを記録します。

    たとえば、アーキテクチャがクライアント > GA > Server Load Balancer > ECS の場合、ALB リスナーの転送ルールで [ヘッダーの挿入] アクションを使用して、クライアントの送信元 IP アドレスを記録できます。たとえば、キーを client-real-ip に、値をシステム定義変数であるクライアント IP アドレスに設定します。同時に、[実際のクライアントソース IP を検索] スイッチを有効にし、GA エンドポイントのパブリック IP アドレスを ALB の信頼できる IP リストに追加し、バックエンドの Nginx サーバーでログ変数を $http_client_real_ip として設定します。ログに記録される IP アドレスは、クライアントの送信元 IP アドレスです。

    写入header

次のような他のメソッドを使用して、システムのセキュリティを強化することもできます:

  • X-Forwarded-For ヘッダーの検証とフィルタリング: バックエンドサーバーで X-Forwarded-For ヘッダーを検証およびフィルタリングして、正当で信頼できるものであることを確認します。X-Forwarded-For ヘッダーのフォーマットと IP アドレスを確認し、不正または疑わしい値を拒否できます。

  • ファイアウォールとアクセス制御リスト (ACL) の使用: ロードバランサーとバックエンドサーバーの間にファイアウォールと ACL をデプロイして、X-Forwarded-For ヘッダーを操作する可能性のある悪意のあるリクエストをフィルタリングします。

  • SSL/TLS 暗号化の使用: SSL/TLS 暗号化を使用して、X-Forwarded-For ヘッダーの送信を含む通信を保護します。これにより、中間者 (MITM) 攻撃やデータ改ざんのリスクが軽減されます。

ACK シナリオで ALB を使用している場合にクライアントの送信元 IP アドレスを取得するにはどうすればよいですか?

ACK クラスターで ALB を使用する際にクライアントの IP アドレスを取得するには、「訪問者の IP アドレスを取得する」をご参照ください。

リファレンス

ロードバランサーの種類によって、クライアントの送信元 IP アドレスを取得する方法は異なります: