Classic Load Balancer のプロキシプロトコルサポートの設定 - Elastic Load Balancing

Classic Load Balancer のプロキシプロトコルサポートの設定

プロキシプロトコルは、接続のリクエスト元からリクエスト先に接続情報を伝達するために使用されるインターネットプロトコルです。Elastic Load Balancing ではプロキシプロトコルのバージョン 1 を使用します。このバージョンでは、人間が判読できるヘッダー形式が使われます。

フロントエンド接続とバックエンド接続の両方に Transmission Control Protocol (TCP) を使用する場合、Classic Load Balancerは、デフォルトで、リクエストヘッダーを変更せずにリクエストをインスタンスに転送します。プロキシプロトコルを有効にすると、送信元 IP アドレス、送信先 IP アドレス、ポート番号などの接続情報を含むリクエストヘッダーに、人間が判読できるヘッダーが追加されます。これにより、ヘッダーがリクエストの一部としてインスタンスに送信されます。

注記

AWS マネジメントコンソールでは、プロキシプロトコルの有効化がサポートされません。

プロキシプロトコルヘッダー

プロキシプロトコルヘッダーは、ロードバランサーでバックエンド接続用に TCP を使用する場合に、クライアントの IP アドレスを識別するのに役立ちます。ロードバランサーはクライアントとインスタンスの間のトラフィックを傍受するため、インスタンス内のアクセスログには、発信元クライアントの IP アドレスでなく、ロードバランサーの IP アドレスが含まれています。リクエストの 1 行めを解析して、クライアントの IP アドレスとポート番号を取得することができます。

IPv6 のヘッダー内のプロキシのアドレスは、ロードバランサーのパブリック IPv6 アドレスです。この IPv6 アドレスは、ipv6 または dualstack で始まるロードバランサーの DNS 名から解決される IP アドレスと一致します。クライアントが IPv4 に接続する場合、ヘッダー内のプロキシのアドレスはロードバランサーのプライベート IPv4 アドレスであるため、EC2-Classic ネットワーク外の DNS ルックアップでは解決できません。

プロキシプロトコルの行は 1 行であり、キャリッジリターンとラインフィード ("\r\n") で終わります。形式は次のとおりです。

PROXY_STRING + single space + INET_PROTOCOL + single space + CLIENT_IP + single space + PROXY_IP + single space + CLIENT_PORT + single space + PROXY_PORT + "\r\n"

例: IPv4

次に IPv4 のプロキシプロトコルの例を示します。

PROXY TCP4 198.51.100.22 203.0.113.7 35646 80\r\n

例: IPv6 (EC2-Classic のみ)

次に IPv6 のプロキシプロトコルの例を示します。

PROXY TCP6 2001:DB8::21f:5bff:febf:ce22:8a2e 2001:DB8::12f:8baa:eafc:ce29:6b2e 35646 80\r\n

プロキシプロトコルを有効にするための前提条件

開始する前に、以下を実行します:

  • ロードバランサーが、プロキシプロトコルが有効になっているプロキシサーバーの背後にないことを確認します。プロキシプロトコルがプロキシサーバーとロードバランサーの両方で有効になっていると、ロードバランサーは、プロキシサーバーからのヘッダーが既に追加されているリクエストに別のヘッダーを追加します。インスタンスの設定によっては、このような重複によってエラーが発生する可能性があります。

  • インスタンスでプロキシプロトコル情報を処理できることを確認します。

  • リスナー設定でプロキシプロトコルがサポートされることを確認します。詳細については、「クラシックロードバランサー のリスナー設定」を参照してください。

AWS CLI を使用したプロキシプロトコルの有効化

プロキシプロトコルを有効にするには、タイプ ProxyProtocolPolicyType のポリシーを作成し、このポリシーをインスタンスのポートで有効にします。

次の手順を使用して、ProxyProtocolPolicyType タイプのロードバランサーの新しいポリシーを作成し、ポート 80 のインスタンスに設定して、そのポリシーが有効になっていることを確認します。

ロードバランサーの Proxy Protocol を有効にするには

  1. (省略可)次の describe-load-balancer-policy-types コマンドを使用して、Elastic Load Balancing でサポートされているポリシーを一覧表示します。

    aws elb describe-load-balancer-policy-types

    応答には、サポートされるポリシータイプの名前と説明が出力されます。ProxyProtocolPolicyType タイプの出力は次のとおりです。

    { "PolicyTypeDescriptions": [ ... { "PolicyAttributeTypeDescriptions": [ { "Cardinality": "ONE", "AttributeName": "ProxyProtocol", "AttributeType": "Boolean" } ], "PolicyTypeName": "ProxyProtocolPolicyType", "Description": "Policy that controls whether to include the IP address and port of the originating request for TCP messages. This policy operates on TCP/SSL listeners only" }, ... ] }
  2. 次の create-load-balancer-policy コマンドを使用して、プロキシプロトコルを有効にするポリシーを作成します。

    aws elb create-load-balancer-policy --load-balancer-name my-loadbalancer --policy-name my-ProxyProtocol-policy --policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=true
  3. 次の set-load-balancer-policies-for-backend-server コマンドを使用して、新しく作成したポリシーを特定のポートで有効にします。このコマンドは現在有効になっている一連のポリシーを置き換えることに注意してください。したがって、--policy-names オプションで、リストに追加するポリシー (my-ProxyProtocol-policy など) と現在有効になっているポリシー (my-existing-policy など) の両方を指定する必要があります。

    aws elb set-load-balancer-policies-for-backend-server --load-balancer-name my-loadbalancer --instance-port 80 --policy-names my-ProxyProtocol-policy my-existing-policy
  4. (オプション) 次の describe-load-balancers コマンドを使用して、プロキシプロトコルが有効になっていることを確認します。

    aws elb describe-load-balancers --load-balancer-name my-loadbalancer

    応答には、my-ProxyProtocol-policy ポリシーがポート 80 に関連付けられていることを示す次の情報が出力されます。

    { "LoadBalancerDescriptions": [ { ... "BackendServerDescriptions": [ { "InstancePort": 80, "PolicyNames": [ "my-ProxyProtocol-policy" ] } ], ... } ] }

AWS CLI を使用したプロキシプロトコルの無効化

インスタンスに関連付けられているポリシーは無効にすることができ、また後で有効にすることができます。

プロキシプロトコルをポリシーを無効にするには

  1. 次の set-load-balancer-policies-for-backend-server コマンドを使用して、--policy-names オプションからプロキシプロトコルポリシーを削除して、このポリシーを無効にします。(ただし、my-existing-policy など、有効なままにしておく必要のある他のポリシーは残します)。

    aws elb set-load-balancer-policies-for-backend-server --load-balancer-name my-loadbalancer --instance-port 80 --policy-names my-existing-policy

    有効にする他のポリシーがない場合は、次のとおり --policy-names で空の文字列を指定します。

    aws elb set-load-balancer-policies-for-backend-server --load-balancer-name my-loadbalancer --instance-port 80 --policy-names "[]"
  2. (省略可) 次の describe-load-balancers コマンドを使用して、ポリシーが無効になっていることを確認します。

    aws elb describe-load-balancers --load-balancer-name my-loadbalancer

    応答には、ポリシーに関連付けられているポートがないことを示す次の情報が出力されます。

    { "LoadBalancerDescriptions": [ { ... "BackendServerDescriptions": [], ... } ] }