全部產品
Search
文件中心

Alibaba Cloud Service Mesh:通過配置XFF要求標頭使ASM網關獲得用戶端IP

更新時間:May 17, 2025

在營銷、審計和反作弊等情境中,通常需要網關擷取用戶端源IP以提升安全性、最佳化體驗或滿足合規要求。本文介紹在ASM情境下,如何配置X-Forwarded-For要求標頭來使ASM網關擷取用戶端源IP。

重要

ASM網關擷取用戶端源IP功能需要ASM版本為1.24.6.83及以上,您可以通過升級ASM執行個體版本來確保可以正常配置。

背景資訊

X-Forwarded-For(XFF)是一個廣泛使用的HTTP要求標頭欄位,用於在請求經過Proxy 伺服器、負載平衡器或CDN時記錄用戶端的真實IP地址。

X-Forwarded-For的值是一個以逗號分隔的IP地址清單,格式如下:

X-Forwarded-For: <用戶端真實IP>, <第一個代理IP>, <第二個代理IP>, ...

通過配置信任代理數量擷取用戶端IP

在調用鏈路拓撲固定的情境中,通過為網關Pod配置信任跳數(鏈路代理數量-1)註解,即可使得ASM網關正確地擷取用戶端IP。如下圖樣本:

請求鏈路中固定存在3個代理,即信任跳數numTrustedProxies: 2。請求經過3個代理後,XFF要求標頭中的IP列表為[1.1.1.1, 2.2.2.2, 3.3.3.3],ASM網關基於已經配置的信任跳數對此列表進行反向移除,從而獲得真實的用戶端IP1.1.1.1。信任跳數配置方式如下:

  1. 使用ASM的kubeconfig,編輯ASM網關配置。

    $ kubectl -n istio-system edit istiogateway <ASM網關名稱>
  2. 為網關Pod添加以下註解,設定信任跳數。

    警告

    進行本操作將導致網關進行滾動重啟,請在業務低峰期進行操作。

    spec:
      podAnnotations:
        proxy.istio.io/config: |
          gatewayTopology:
            numTrustedProxies: <信任代理數量-1>

    修改完成後,配置將在新啟動的網關Pod上生效。

重要
  • numTrustedProxies的值必須小於XFF要求標頭攜帶的IP地址數量。大於等於X-Forwarded-For要求標頭中攜帶的地址數量,ASM網關將取IP列表中最後一個(最右側)地址作為用戶端真實IP。

  • ASM網關的訪問日誌中輸出的XFF要求標頭包含了ASM網關追加的地址,追加的動作發生在numTrustedProxies計算之後。以上述樣本為例,最終網關訪問日誌顯示的XFF要求標頭內容會包含4.4.4.4的IP地址,這是由於網關在完成numTrustedProxies的計算,擷取了用戶端IP後,為XFF要求標頭追加了Proxy3的IP,並不影響擷取的用戶端IP準確度。

通過排除已知地址擷取用戶端IP

在調用鏈路拓撲不固定的情境中,僅配置信任跳數無法確保能正確地擷取用戶端IP。此時需要通過配置信任的已知地址,使得ASM網關能夠剔除這些已知地址,從而獲得正確的用戶端地址。如下圖樣本:

在上圖呈現的情境中,Client1和Client2的拓撲跳數並不一致,無法通過配置固定跳數的方式來擷取真實的用戶端IP。此時需要將Proxy1~Proxy4的IP添加到網關的信任位址區段中,使網關可以剔除這些已知地址,從而獲得正確的用戶端地址。已知地址配置方式如下:

  1. 編輯ASM網關配置。

    $ kubectl -n istio-system edit istiogateway <ASM網關名稱>
  2. 為網關Pod添加以下註解,將已知的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

    修改完成後,配置將在新啟動的網關Pod上生效。