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 を有効にするには
-
(省略可)次の 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" }, ... ] }
-
次の create-load-balancer-policy コマンドを使用して、プロキシプロトコルを有効にするポリシーを作成します。
aws elb create-load-balancer-policy --load-balancer-name
my-loadbalancer
--policy-namemy-ProxyProtocol-policy
--policy-type-name ProxyProtocolPolicyType --policy-attributes AttributeName=ProxyProtocol,AttributeValue=true -
次の 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-port80
--policy-namesmy-ProxyProtocol-policy my-existing-policy
-
(オプション) 次の 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 を使用したプロキシプロトコルの無効化
インスタンスに関連付けられているポリシーは無効にすることができ、また後で有効にすることができます。
プロキシプロトコルをポリシーを無効にするには
-
次の 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-port80
--policy-namesmy-existing-policy
有効にする他のポリシーがない場合は、次のとおり
--policy-names
で空の文字列を指定します。aws elb set-load-balancer-policies-for-backend-server --load-balancer-name
my-loadbalancer
--instance-port80
--policy-names "[]" -
(省略可) 次の describe-load-balancers コマンドを使用して、ポリシーが無効になっていることを確認します。
aws elb describe-load-balancers --load-balancer-name
my-loadbalancer
応答には、ポリシーに関連付けられているポートがないことを示す次の情報が出力されます。
{ "LoadBalancerDescriptions": [ { ... "BackendServerDescriptions": [], ... } ] }