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

Server Load Balancer:CLB レイヤー 7 リスナーを使用したクライアント IP アドレスの取得

最終更新日:Aug 27, 2026

CLB のレイヤー 7 リスナーを使用する場合、X-Forwarded-For HTTP ヘッダーからクライアント IP アドレスを取得します。

仕組み

Classic Load Balancer (CLB) のレイヤー 7 リスナー (HTTP/HTTPS) は、X-Forwarded-For HTTP ヘッダーにクライアント IP アドレスを保持します。バックエンドサーバーは設定後にこの IP を取得できます。

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

X-Forwarded-For: <client IP address, proxy-server-1-IP, proxy-server-2-IP, ...>

この方法を使用する場合、リストの左端の IP アドレスがクライアント IP アドレスです。

CLB は HTTPS 通信を終端し、HTTP 経由でバックエンドサーバーと通信します。HTTPS リスナーを使用する場合でも、バックエンドサーバーは HTTP のみで設定してください。

操作手順

前提条件

  • レイヤー 7 リスナーを持つ CLB インスタンスが作成されている必要があります。詳細については、「CLB インスタンスの作成と管理」および「HTTP リスナーの追加」をご参照ください。このトピックでは、例としてポート 80 の HTTP リスナーを使用します。

  • バックエンドサーバーを持つサーバーグループが CLB インスタンスに追加されている必要があります。詳細については、「vServer グループの作成と管理」をご参照ください。このトピックでは、例として HTTP プロトコルを使用し、ECS インスタンスとポート 80 を持つ vServer グループを使用します。

ステップ 1:リスナーが X-Forwarded-For を使用していることの確認

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

  2. 上部メニューで、インスタンスがデプロイされているリージョンを選択します。

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

  4. インスタンス詳細 ページで、リスナー タブをクリックし、対象のレイヤー 7 リスナーを見つけてその ID をクリックします。

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

    デフォルトでは、CLB のレイヤー 7 リスナーは X-Forwarded-For ヘッダーを使用してクライアント IP アドレスを取得します。この機能は無効にできません。

ステップ 2:バックエンドサーバーの設定

  • このセクションでは、バックエンドサーバーのアクセスログにクライアント IP アドレスを記録する方法 (X-Forwarded-For フィールド経由) を説明します。 接続レイヤー変数 (Nginx の $remote_addr など) は、引き続き CLB 転送 IP を示し、影響を受けません。

  • 既存のログ形式、アクセス制御、およびレート制限ルールが変更なしで機能するように、$remote_addr などの接続層の変数を実際のクライアント IP に置き換えたい場合は、「接続層のアドレスをクライアント IP に置き換える (Nginx および Apache)」をご参照ください。

Nginx サーバー

環境例:CentOS 7.9 と Nginx 1.20.1。お使いの環境は異なる場合があります。

  1. nginx -V | grep http_realip_module を実行して、http_realip_module がインストールされているか確認します。Nginx はこのモジュールを使用して X-Forwarded-For レコードを解析します。

    出力に --with-http_realip_module が含まれている場合、モジュールはインストール済みです。次のステップに進んでください。

    ngx_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'
    
    ngx_http_realip_module は Nginx 1.0.4 (2011年) 以降で利用可能です。古いバージョンを使用している場合は、設定をバックアップしてから Nginx をアップグレードしてください。
    ngx_http_realip_module がインストールされていない場合は、モジュールを含めて Nginx を再コンパイルするか、yum などのパッケージマネージャーを使用して Nginx を再インストールしてください。
  2. Nginx 設定ファイルを編集します。ファイルパスを検索するには、nginx -t を実行します。デフォルトは /etc/nginx/nginx.conf です。

    http {
      # log_format に $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"';
      
      # ...
    }
    
  3. sudo nginx -s reload コマンドを実行して Nginx の設定をリロードします。

Apache サーバー

環境例:CentOS 7.9 と Apache 2.4.6。お使いの環境は異なる場合があります。

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

    出力に remoteip_module (shared) が含まれている場合、モジュールはインストールされています。次のステップに進んでください。

    remoteip_module は Apache 2.4.0 (2012年) 以降で利用可能です。古いバージョンを使用している場合は、設定をバックアップしてから Apache をアップグレードしてください。
    remoteip_module がインストールされていない場合は、モジュールを含めて Apache を再コンパイルするか、yum などのパッケージマネージャーを使用して Apache を再インストールしてください。
  2. Apache 設定ファイルを編集します。デフォルトのパスは /etc/httpd/conf/httpd.conf です。

    # ...
    <IfModule log_config_module>
    	# %{X-Forwarded-For}i を追加して X-Forwarded-For 情報を記録します。
      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. OS アーキテクチャに基づいて、x86\ または x64\ ディレクトリから F5XFFHttpModule.dll と F5XFFHttpModule.ini を IIS の読み取り権限がある場所にコピーします。

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

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

  5. [ネイティブ モジュールの構成] をクリックし、次に [登録] をクリックします。

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

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

    2. システムは新しく登録されたモジュールを自動的に選択します。[OK] をクリックします。Register module

  7. サーバーのホームページに戻り、[ログ記録] モジュールをダブルクリックします。X-Forwarded-For フィールドを記録するように、ログ形式を設定します。

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

      image.png

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

      image.png

    3. 右上隅にある [適用] をクリックして変更を保存します。

  8. IIS サーバーを再起動して、設定を有効にします。

ステップ 3:クライアント IP 取得の確認

お使いのサーバーの種類に応じた手順に従ってください。

Nginx サーバー

Nginx のアクセスログをチェックして、クライアント IP の取得を確認します。

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

$http_x_forwarded_for フィールドの一番左の IP がクライアント IP アドレスです。

image.png

Apache サーバー

Apache のアクセスログをチェックして、クライアント IP の取得を確認します。

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

%{X-Forwarded-For}i フィールドの左端の IP がクライアント IP アドレスです。

image.png

IIS サーバー

IIS のログをチェックして、クライアント IP の取得を確認します。

ロギングモジュールでログファイルのパスを確認します。

image.png

X-Forwarded-For フィールドの左端の IP がクライアント IP アドレスです。

image.png

よくある質問

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

CLB システムは、外部リクエストをバックエンドの ECS インスタンスに転送し、ヘルスチェックを実行します。これらのリクエストはどちらもシステムから発信されます。

CLB システムは予約済みの CIDR ブロック 100.64.0.0/10 を使用します。このブロックは Alibaba Cloud 専用であり、セキュリティリスクをもたらすものではありませんが、100 で始まる IP からの頻繁なアクセスはこのためです。

サーバー上の iptables やその他のセキュリティソフトウェアがこの CIDR ブロックをブロックしないようにしてください。

WAF、CDN、GA を使用したクライアント IP の取得

トラフィックが CLB に到達する前に WAF、CDN、または Global Accelerator (GA) を通過する場合でも、X-Forwarded-For を使用してクライアント IP を取得できます。これらのサービスは、追加設定なしでデフォルトで X-Forwarded-For を通過させます。

X-Forwarded-For のなりすましを防ぐには、カスタムヘッダーを使用してクライアント IP を記録します。たとえば、クライアント > CDN > WAF > CLB > ECS のアーキテクチャでは、CDN は Ali-Cdn-Real-Ip ヘッダーを渡すことができます。WAF で、クライアント IP の取得方法として [ヘッダーフィールドの指定] を選択し、ヘッダーを Ali-Cdn-Real-Ip に設定します。Nginx のログ変数を $http_ali_cdn_real_ip に設定します。

追加のセキュリティ対策:

  • バックエンドサーバーで XFF ヘッダーを検証およびフィルタリングします。形式と IP アドレスを確認し、無効または疑わしい値を拒否します。

  • CLB とバックエンドサーバーの間にファイアウォールと ACL を使用して、XFF ヘッダーを標的とする悪意のあるリクエストをフィルタリングします。

  • SSL/TLS 暗号化を使用して、XFF ヘッダーの送信を含む通信を中間者攻撃から保護します。

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

Container Service for Kubernetes (ACK) クラスターでは、方法は同じですが、一部の操作の詳細が異なります。詳細については、「ネットワーク管理 FAQ」をご参照ください。

レイヤー 4 とレイヤー 7 リスナー:ソース IP の動作

クライアントリクエストが CLB を通過する際、バックエンドサーバーから見えるソース IP はリスナーのタイプによって異なります。

リスナータイプ

ソース IP の処理

remote_addr バックエンドサーバーからのビュー

レイヤー 4 (TCP/UDP)

CLB はクライアントのソース IP を直接転送します

クライアントの送信元 IP アドレス

レイヤー 7 (HTTP/HTTPS)

CLB はリバースプロキシとして機能し、バックエンドサーバーとの間に新しい TCP 接続を確立します

CLB 内部の転送 IP (100.64.0.0/10 の範囲)

レイヤー 7 リスナーでは、CLB はクライアントの送信元 IP アドレスを伝達するために、X-Forwarded-For HTTP リクエストヘッダーを自動的に追加します。 Nginx アクセスログの $remote_addr にクライアント IP の代わりに 100.64.0.0/10 範囲の CLB 内部転送 IP が表示される場合、これは仕様通りの動作です。

コネクションレイヤーのアドレスをクライアント IP に置き換える (Nginx と Apache)

Nginx

デフォルトでは、Nginx のログの $remote_addr は CLB の内部転送 IP (100.64.0.0/10 の範囲) を記録します。これを実際のクライアント IP に置き換えて、既存のログ形式、アクセス制御、およびレート制限ルールを変更なしで機能させるには、ngx_http_realip_module モジュールを使用します。

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

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

    set_real_ip_from  100.64.0.0/10;
    real_ip_header    X-Forwarded-For;
    real_ip_recursive on;
  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 を含まない HEAD ヘルスチェックリクエストの場合、$remote_addr は引き続き 100.64.0.0/10 と表示されます。これは想定どおりの動作です。

Apache

デフォルトでは、Apache ログの %h は CLB 内部転送 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 100.64.0.0/10
  3. sudo systemctl restart httpd を実行して Apache サービスを再起動します。

設定が有効になったら、アクセスログ (デフォルト: /var/log/httpd/access_log) で %h に実際のクライアント IP が表示されることを確認してください。
トラフィックが WAF や CDN などの複数のプロキシを通過する場合、各プロキシ層の送信元 IP 範囲を RemoteIPTrustedProxy に追加します。
ヘルスチェックリクエスト (HEAD で、X-Forwarded-For がない場合) でも、%h は 100.64.0.0/10 と表示され、これは想定内の動作です。

関連ドキュメント

他のロードバランサータイプでは、異なる方法を使用します。