在營銷、審計和反作弊等情境中,通常需要網關擷取用戶端源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。信任跳數配置方式如下:
使用ASM的kubeconfig,編輯ASM網關配置。
$ kubectl -n istio-system edit istiogateway <ASM網關名稱>為網關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添加到網關的信任位址區段中,使網關可以剔除這些已知地址,從而獲得正確的用戶端地址。已知地址配置方式如下:
編輯ASM網關配置。
$ kubectl -n istio-system edit istiogateway <ASM網關名稱>為網關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上生效。