ゲートウェイは、セキュリティの強化、ユーザーエクスペリエンスの最適化、またはマーケティング、監査、不正防止のシナリオにおけるコンプライアンス要件を満たすために、クライアントの送信元 IP アドレスを取得する必要があります。 このトピックでは、ASM ゲートウェイがクライアントの送信元 IP アドレスを取得できるように X-Forwarded-For(XFF)リクエストヘッダーを構成する方法について説明します。
WordPress の管理画面この関数は、ASM バージョン が必要です。 必要に応じて、ASM インスタンスをアップグレード してください。
背景
X-Forwarded-For(XFF)は HTTP リクエストヘッダーフィールドです。 リクエストがプロキシサーバー、サーバーロードバランサー、または Alibaba Cloud CDN を通過するときに、クライアントの送信元 IP アドレスを記録します。
X-Forwarded-For は、ドットで区切られた IP アドレスのリストです。 次の形式です。
X-Forwarded-For: <client's originating IP>, <first proxy IP>, <second proxy IP>, ...信頼できるプロキシの数を構成してクライアント IP を取得する
呼び出しチェーントポロジが固定されている場合は、ゲートウェイ ポッドの信頼できるホップ数(チェーン内のプロキシの数から 1 を引いた数)アノテーションを構成することで、ASM ゲートウェイがクライアント IP を取得できるようにすることができます。 次の図は例を示しています。
リクエストチェーンには、3 つの固定プロキシがあります。 信頼できるホップ数は numTrustedProxies: 2 です。 リクエストがプロキシを通過した後、XFF リクエストヘッダーの IP リストは [1.1.1.1, 2.2.2.2, 3.3.3.3] です。 ASM ゲートウェイは、構成された信頼できるホップ数に基づいて、このリストの末尾から IP アドレスを削除します。 クライアントの送信元 IP アドレス 1.1.1.1 を取得するためです。 信頼できるホップ数は次のように構成できます。
ASM kubeconfig を使用して、ASM ゲートウェイ構成を編集します。
$ kubectl -n istio-system edit istiogateway <ASM gateway name>ゲートウェイ ポッドに次のアノテーションを追加して、信頼できるホップ数を設定します。
警告この操作を行うと、ゲートウェイのローリング再起動が発生します。 この操作は、オフピーク時に実行してください。
spec: podAnnotations: proxy.istio.io/config: | gatewayTopology: numTrustedProxies: <number of trusted proxies-1>変更後、構成はゲートウェイ ポッドで機能します。
numTrustedProxiesの値は、XFF リクエストヘッダーの IP アドレスの数よりも小さくなければなりません。 それ以上の場合、ASM ゲートウェイは IP リストの最後の(一番右の)アドレスをクライアントの送信元 IP アドレスとして使用します。ASM ゲートウェイアクセスログに出力される XFF リクエストヘッダーには、ASM ゲートウェイによって追加されたアドレスが含まれています。 この追加操作は、
numTrustedProxiesの計算後に行われます。 この例では、XFF リクエストヘッダーのコンテンツには IP アドレス4.4.4.4が含まれます。 これは、ゲートウェイがnumTrustedProxiesの計算を完了してクライアント IP を取得した後、Proxy3 の IP を XFF リクエストヘッダーに追加するためです。 これは、取得したクライアント IP の精度には影響しません。
既知のアドレスを除外してクライアント IP を取得する
呼び出しチェーントポロジが固定されていない場合、信頼できるホップ数のみを構成しても、クライアント IP を取得できるとは限りません。 ASM ゲートウェイがそれらを除外できるように、信頼できる既知のアドレスを構成する必要があります。 そうすれば、正しいクライアントアドレスを取得できます。 次に例を示します。
上の図では、Client1 と Client2 のトポロジホップ数は一致していません。 したがって、固定ホップ数を構成しても、クライアントの送信元 IP アドレスを取得することはできません。 この場合、Proxy1 から Proxy4 の IP をゲートウェイの信頼できるアドレスセグメントに追加する必要があります。 そうすれば、ゲートウェイはこれらの既知のアドレスを除外して、正しいクライアントアドレスを取得できます。 既知のアドレスは次のように構成できます。
ASM ゲートウェイ構成を編集します。
$ kubectl -n istio-system edit istiogateway <ASM gateway name>ゲートウェイ ポッドに次のアノテーションを追加します。 これは、既知の IP アドレスを信頼できるセグメントに追加するためです。
警告この操作を行うと、ゲートウェイのローリング再起動が発生します。 この操作は、オフピーク時に実行してください。
ここでは、CIDR 形式のみがサポートされています。 固定 IP には、サブネットマスクのビット数
/32を含める必要があります。spec: podAnnotations: proxy.istio.io/config: | gatewayTopology: xffTrustedCidrs: - 2.2.2.2/32 - 3.3.3.3/32 - 4.4.4.4/32 - 5.5.5.5/32変更後、構成は新しいゲートウェイ ポッドで機能します。