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

Global Accelerator:クライアントのIPアドレスを保存する

最終更新日:Jul 17, 2024

Global Accelerator (GA) は、クライアントIPアドレス保存機能を提供します。 この機能を有効にすると、バックエンドサーバーに保存されているクライアントIPアドレスを表示できます。 このトピックでは、さまざまなシナリオでクライアントIPアドレスの保存を有効にし、バックエンドサーバーで保存されているクライアントIPアドレスを表示する方法について説明します。

前提条件

Global Acceleratorインスタンスのリスナーが作成されます。 詳細については、「インテリジェントルーティングリスナーの追加と管理」をご参照ください。

背景情報

デフォルトでは、GAがバックエンドサーバーにリクエストを転送した後、バックエンドサーバーは、バックエンドサーバーが属するエンドポイントグループのIPアドレスのみを取得できます。 バックエンドサーバーは、リクエストを送信するクライアントのIPアドレスを取得できません。 バックエンドサーバーでクライアントのIPアドレスを取得する場合は、GAインスタンスのクライアントIPアドレスの保存を有効にする必要があります。 GAインスタンスがクライアントIPアドレスの保存をサポートするかどうかは、GAインスタンスのリスナーが使用するプロトコルによって異なります。

  • HTTPおよびHTTPS: クライアントIPアドレスの保存をサポートします。 クライアントのIPアドレスは、X-Forwarded-For HTTPヘッダーに保持されます。 バックエンドサーバーは、X-Forwarded-For HTTPヘッダーからクライアントのIPアドレスを取得します。

  • UDP: クライアントIPアドレスの保存をサポートしていません。

  • TCP: クライアントIPアドレスの保存をサポートします。 バックエンドサーバーがクライアントIPアドレスを取得できるように、バックエンドサービスのタイプに基づいてバックエンドサーバーの設定を変更する必要がある場合があります。 次の表に、バックエンドサーバーの設定方法を示します。

    バックエンドサービスの場所

    バックエンドサービスの種類

    クライアントIPアドレスの保存

    バックエンドサーバーの設定を変更するかどうか

    説明

    Alibaba Cloud

    Alibaba CloudパブリックIPアドレス

    関連付けられたインスタンスに基づいて:

    • VPCのElastic Compute Service (ECS) インスタンス: サポート

    • Network Load Balancer (NLB) インスタンス: サポート

    • Application Load Balancer (ALB) インスタンス: サポートされていません

    • 内部対応のClassic Load Balancer (CLB) インスタンス: サポート

    • インターネットNATゲートウェイ: サポート

    • ECSインスタンスに関連付けられている: 不要

    • NLBインスタンスに関連付けられている: 必須

    • 内部対応のCLBインスタンスに関連付けられている: 不要

    • インターネットNATゲートウェイに関連付けられている:

      • 10月2022日より前に作成された既存のNAT Gateway: 必須

      • 10月2022日以降に作成されたNAT Gateway: 不要

    • 必須: クライアントIPアドレスの保存を有効にすると、GAはプロキシプロトコルを使用してクライアントIPアドレスを保存します。 したがって、バックエンドサーバーはプロキシプロトコルをサポートする必要があります。

      重要

      バックエンドサーバーがプロキシプロトコルをサポートしていない場合、バックエンドサーバーはリクエスト内のプロキシプロトコルヘッダーを解析できません。

    • 不要: クライアントIPアドレスの保存を有効にすると、バックエンドサーバーはクライアントIPアドレスを取得できます。 バックエンドサーバーの設定を変更する必要はありません。

    ECS

    対応

    ECSインスタンスはVPCにデプロイされている必要があり、セキュリティグループルールはすべてのクライアントIPアドレスがECSインスタンスにアクセスできるように設定されています。

    不要

    ENI

    対応

    セキュリティグループルールは、すべてのクライアントIPアドレスがelastic network interface (ENI) にアクセスできるように設定されています。

    OSS

    非対応

    vSwitch

    既定ではサポートされていません。

    この機能を使用する場合は、アカウントマネージャーに連絡してください。

    CLB

    対応

    セキュリティグループルールは、すべてのクライアントIPアドレスがCLBバックエンドサーバーにアクセスできるように設定されています。

    次のシナリオでは、バックエンドサーバーはクライアントIPアドレスを取得できません。

    • CLBインスタンスのバックエンドサーバーは、クラシックネットワークにデプロイされたECSインスタンスです。

    • CLBインスタンスのリスナーにはHTTPまたはHTTPSが使用されます。

    ALB

    非対応

    NLB

    対応

    必須/任意

    サードパーティのクラウド

    カスタムIPアドレス

    対応

    必須/任意

    カスタムドメイン名

    対応

説明

Proxy Protocolは、TCPパケットにProxy protocolヘッダーを追加し、リクエストにクライアントIPアドレスを含めることができるインターネットプロトコルです。

プロキシプロトコルが使用されている場合、バックエンドサーバーは、サーバーが完全で有効なプロキシプロトコルヘッダーを受信した後にのみデータを処理します。 したがって、リスナーは、Proxy Protocolヘッダーを含むリクエストとProxy Protocolヘッダーを含まないリクエストを同じバックエンドサーバーポートに転送することはできません。 バックエンドサーバーに到着した最初のデータパケットがプロキシプロトコル形式に準拠していない場合、バックエンドサーバーはクライアントへの接続を閉じます。

HTTPまたはHTTPSリスナーを使用してリクエストを配信する場合、クライアントIPアドレスの保存を有効にする

デフォルトでは、HTTPまたはHTTPSリスナーに対してクライアントIPアドレスの保存が有効になっています。 バックエンドサーバーは、X-Forwarded-For HTTPヘッダーからクライアントIPアドレスを取得できます。

  1. クライアントIPアドレスの保存を有効にします。

    デフォルトでは、クライアントIPアドレスの保存はHTTPおよびHTTPSリスナーに対して有効になっています。 GAは、リクエストをバックエンドサーバーに転送する前に、クライアントのIPアドレスをX-Forwarded-For HTTPヘッダーに保持します。 バックエンドサーバーがリクエストを受信すると、X-Forwarded-For HTTPヘッダーからクライアントIPアドレスを取得できます。

  2. クライアントのIPアドレスを取得します。

    次の例は、X-Forwarded-For HTTPヘッダーの形式を示しています。 第1のIPアドレスは、クライアントのIPアドレスである。

    X-Forwarded-For: client IP address, IP address of Proxy Server 1, IP address of Proxy Server 2,...

TCPリスナーを使用してAlibaba Cloud上のバックエンドサーバーにリクエストを配信する場合、クライアントIPアドレスの保存を有効にする

GAインスタンスがTCPリスナーを使用し、バックエンドサーバーがAlibaba Cloudにデプロイされている場合、追加の変更を加えることなくクライアントIPアドレスの保存を有効にできます。

  1. クライアントIPアドレスの保存を有効にします。

    1. GAコンソール にログインします。

    2. インスタンスページで、管理するGAインスタンスを見つけて、リスナーの設定で、アクション列を作成します。

    3. リスナータブで、変更するリスナーを見つけて、変更で、アクション列を作成します。

    4. では、リスナーとプロトコルの設定ステップ、次へをクリックします

    5. では、エンドポイントグループの設定ステップ、選択保存からクライアントIPの保持ドロップダウンリストをクリックし、次へをクリックします

      バックエンドサービスがAlibaba Cloudにデプロイされている場合、クライアントIPの取得はデフォルトでクライアントIPの自動取得に設定されます。

      image.png

      • クライアントIPの自動取得: IPv4クライアントはバックエンドサービスの場合にアクセスします。このオプションを選択することを推奨します。 このモードでは、クライアントIPアドレスが自動的に取得されます。 バックエンドサービスを設定する必要はありません。 バックエンドサービスがAlibaba Cloudにデプロイされていない場合、このオプションは選択できません。

      • プロキシプロトコル: バックエンドサービスにIPv6クライアントがアクセスする場合、このオプションを選択することを推奨します。 このモードでは、バックエンドサーバーがプロキシプロトコルをサポートしている場合にのみ、クライアントIPアドレスを取得できます。

      詳細については、このトピックの「背景情報」セクションをご参照ください。

    6. では、確認ステップ、設定を確認し、送信をクリックします

  2. クライアントのIPアドレスを取得します。

    この例では、Linuxを実行するECSインスタンスで保存されているクライアントIPアドレスを表示する方法を示します。

    1. Linuxを実行しているECSインスタンスにログインします。

    2. 次のコマンドを実行して、HTTPリクエストをキャプチャします。

      tcpdump tcp port [Listening port] -n -X -s 0
    3. キャプチャしたリクエストのクライアントIPアドレスを確認します。

      結果は、クライアントIPアドレスが保持され、バックエンドサーバーで表示できることを示しています。开启保持客户端源IP功能后,后端服务器获取到客户端源IP

      クライアントIPアドレスの保存が無効になっている場合、バックエンドサーバーが属するエンドポイントグループのIPアドレスのみを表示できます。未开启保持客户端源IP

TCPリスナーを使用してAlibaba Cloud外部のバックエンドサーバーにリクエストを配信する場合、クライアントIPアドレスの保存を有効にする

Alibaba Cloudの外部にデプロイされたバックエンドサーバーに関連付けられているTCPリスナーのクライアントIPアドレスの保存を有効にするには、バックエンドサーバーがプロキシプロトコルをサポートしていることを確認します。 このセクションでは、NGINXサーバーを例として使用して、プロキシプロトコルヘッダーを解析し、クライアントIPアドレスを取得する方法を説明します。

  1. クライアントIPアドレスの保存を有効にします。

    1. GAコンソール にログインします。

    2. インスタンスページで、管理するGAインスタンスを見つけて、リスナーの設定で、アクション列を作成します。

    3. リスナータブで、変更するリスナーを見つけて、変更で、アクション列を作成します。

    4. では、リスナーとプロトコルの設定ステップ、次へをクリックします

    5. では、エンドポイントグループの設定ステップ、選択保存からクライアントIPの保持ドロップダウンリストをクリックし、次へをクリックします

      バックエンドサービスがAlibaba Cloudにデプロイされていない場合、クライアントIPの取得はデフォルトでプロキシプロトコルに設定されます。

      开启保持客户端源IP

      • クライアントIPの自動取得: IPv4クライアントはバックエンドサービスの場合にアクセスします。このオプションを選択することを推奨します。 このモードでは、クライアントIPアドレスが自動的に取得されます。 バックエンドサービスを設定する必要はありません。 バックエンドサービスがAlibaba Cloudにデプロイされていない場合、このオプションは選択できません。

      • プロキシプロトコル: バックエンドサービスにIPv6クライアントがアクセスする場合、このオプションを選択することを推奨します。 このモードでは、バックエンドサーバーがプロキシプロトコルをサポートしている場合にのみ、クライアントIPアドレスを取得できます。

      詳細については、このトピックの「背景情報」セクションをご参照ください。

    6. では、確認ステップ、設定を確認し、送信.

  2. プロキシプロトコルヘッダーを受け入れるようにNGINXサーバーを設定します。

    NGINXのhttp{} およびstream{} モジュールは、Proxy Protocolヘッダーを受け入れることができます。 http{} またはstream{} モジュールでプロキシプロトコルヘッダーを受け入れるポートを指定できます。

    http {
        #...
        server {
            listen 8080 proxy_protocol;    # Accept and parse the Proxy Protocol header on port 8080. 
            #...
        }
    }
       
    stream {
        #...
        server {
            listen 1235 proxy_protocol;    # Accept and parse the Proxy Protocol header on port 1235. 
            #...
        }
    }
  3. クライアントのIPアドレスを取得します。

    指定されたポートでリクエストを受信すると、NGINXはリクエスト内のProxy Protocolヘッダーを解析し、クライアントIPアドレスをproxy_protocol_addr変数に保持します。 したがって、次のいずれかの方法を使用して、クライアントのIPアドレスを取得できます。

    • HTTPリクエストを受信した場合は、次のHTTPリクエストヘッダーにクライアントIPアドレスを保持できます。

      http {
          proxy_set_header X-Real-IP $proxy_protocol_addr;
          proxy_set_header X-Forwarded-$proxy_protocol_addr;
      } 

      バックエンドサーバーは、X-Forwarded-For HTTPヘッダーからクライアントIPアドレスを取得できます。 HTTPヘッダーの最初のIPアドレスは、クライアントのIPアドレスです。

      X-Forwarded-For: client IP address, IP address of Proxy Server 1, IP address of Proxy Server 2,...
    • HTTPリクエストまたはTCPリクエストを受信した場合、クライアントIPアドレスをフローログに保持できます。 バックエンドサーバーは、フローログからクライアントIPアドレスを取得できます。

      1. http{} またはstream{} モジュールのlog_formatを変更して、フローログにクライアントIPアドレスを保持します。

        
        http {
            #...
            log_format combined '$proxy_protocol_addr - $remote_user [$time_local] ' ##Add the proxy_protocol_addr variable to log_format in the http{} module. The client IP address is preserved in the proxy in the proxy_protocol_addr variable. 
                                '"$request" $status $body_bytes_sent '
                                '"$http_referer" "$http_user_agent"';
        }
        #...
        stream {
            #...
            log_format basic '$proxy_protocol_addr - [$time_local] '                 ##Add the proxy_protocol_addr variable to log_format in the stream{} module. The client IP address is preserved in the proxy_protocol_addr variable. 
                              '$protocol $status $bytes_sent $bytes_received '
                              '$session_time';
        }
                        
      2. 次のコマンドを実行してフローログを照会し、クライアントIPアドレスを取得します。

    次のコードブロックは、プロキシプロトコルを使用してクライアントIPアドレスを保持する方法の完全な例です。

    worker_processes  4;
    events {
        worker_connections  1024;
    }
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
        log_format  main  '$proxy_protocol_addr $remote_addr - $remote_user [$time_local] "$request" '##Add the proxy_protocol_addr variable to log_format in the http{} module. The client IP address is preserved in the proxy_protocol_addr variable. 
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        sendfile        on;
        keepalive_timeout  65;
    
        upstream backend {
            server 192.XX.XX.36:8080;
            server 192.XX.XX.37:8080;
            keepalive 2000;
        }
    
        server {
            listen       80 proxy_protocol;                          ## Accept and parse the Proxy Protocol header on port 80. 
            server_name  example.com;
    
            proxy_set_header X-Real-IP       $proxy_protocol_addr;   ## Preserve the client IP address in the HTTP header field before the request is sent to a backend server. 
            proxy_set_header X-Forwarded-For $proxy_protocol_addr;   
    
            access_log  /var/log/nginx/access.log  main;
    
            location / {
                proxy_pass http://backend;
                proxy_http_version 1.1;
                proxy_set_header Connection "";
            }
        }
    }
    
    stream {
        log_format tcp_basic '$proxy_protocol_addr - [$time_local] '  ##Add the proxy_protocol_addr variable to log_format in the stream{} module. The client IP address is preserved in the proxy_protocol_addr variable. 
                          '$protocol $status $bytes_sent $bytes_received '
                          '$session_time';
        upstream stream_backend {
            server 192.XX.XX.36:2003;
            server 192.XX.XX.37:2003;
        }
    
        server {
            listen 1234 proxy_protocol;                               ## Accept and parse the Proxy Protocol header on port 1234. 
            access_log  /var/log/nginx/access_tcp.log  tcp_basic;   
            proxy_pass stream_backend;
        }
    }

    フローログを照会します。 フローログの最初のIPアドレスは、クライアントのIPアドレスです。

    保持源IP-查看日志

関連ドキュメント