客戶端真實源IP地址可以用于分析網站流量和用戶行為。通過分析來源IP地址,可以了解用戶的地理位置、瀏覽器偏好和其他用戶行為指標。這些數據可以用于優化網站設計、定位目標受眾和改善用戶體驗。
在容器化場景下,客戶端和容器服務端之間可能存在多種代理服務器,外部請求在經過多次轉發后,容器中服務無法獲取到客戶端真實源IP。
場景介紹
不同請求類型,獲取客戶端真實IP說明如下:
| 類型 |
說明 |
|---|---|
| HTTP/HTTPS請求 | 通過在ELB監聽器開啟X-Forwarded-For,業務應用可以通過X-Forwarded-For頭部提取到源地址,從而獲得客戶端真實IP。 |
| TCP請求 | 通過在后端主機配置TOA插件獲取客戶端的真實源IP地址。TOA是操作系統的內核模塊,需要在ELB后端主機中安裝TOA插件,以實現后端主機可獲取客戶端真實源IP地址的目的。 |
對于HTTP/HTTPS請求,具體實現分為以下兩類:
| 服務類型 |
說明 |
|---|---|
| 負載均衡 | ELB訪問方式,是通過彈性負載均衡ELB產品來實現負載均衡。通過創建LoadBalancer SVC時,指定注解方式開啟X-Forwarded-For。當通過ELB訪問工作負載時,可以通過X-Forwarded-For頭部提取到源地址。 |
| 節點端口(NodePort) | NodePort訪問方式,是將容器端口映射到節點端口,實現獲取客戶端源IP有以下方式: 當配置SVC外部流量策略為Local時,表示請求不經過轉發,可以獲取客戶端源ip; 當配置SVC外部流量策略為Cluster時,需要通過手動創建監聽器及后端主機組,開啟X-Forwarded-For實現。 |
前提條件
已創建工作負載,確認容器內服務端口
已創建負載均衡器,可參考:創建負載均衡器
集群組件ccse-cloud-controller-manager(命名空間kube-system下)版本需大于等于v1.0.4,版本可通過查看組件使用的鏡像確認
HTTP/HTTPS請求獲取客戶端真實源IP地址
負載均衡SVC
SVC創建
- 登錄“云容器引擎”管理控制臺;
- 在集群列表頁點擊進入指定集群;
- 進入主菜單**“網絡”-“服務”,點擊”創建服務“**,進入創建頁,進行以下配置:
| 配置項 |
說明 |
|---|---|
| 類型 | 選擇"負載均衡" |
| 負載均衡 | 選擇已建負載均衡器名稱 |
| 注解 | 1、點擊“添加注解” 2、注解類型選擇“天翼云注解”,注解名稱選擇“service.beta.kubernetes.io/ctyun-loadbalancer-xforwardedfor”,值為“true”,點擊“添加” 3、注解類型選擇“天翼云注解”,注解名稱選擇“service.beta.kubernetes.io/ctyun-loadbalancer-protocol-port”,值為“{PORTOCOL}:{PORT}”,點擊“添加” 4、如果是https監聽,需要添加指定https證書的注解,注解類型選擇“天翼云注解”,注冊名稱選擇“service.beta.kubernetes.io/ctyun-loadbalancer-ssl-cert”,值為https證書的id,點擊添加 |
| 端口映射 | 1、填入正確的工作負載容器內端口 2、服務端口填入上一步注解中定義的監聽器端口,比如這里配置為88 |
| 工作負載綁定 | 選擇需要獲取客戶端真實ip的工作負載類型、名稱 |
說明{PROTOCOL}:{PORT}中,PROTOCOL為監聽協議,值為http或https;PORT為負載均衡監聽器端口,填入一個當前負載均衡器可用端口,比如http:88;https證書的id可從天翼云負載均衡控制臺證書列表中獲取
-
配置完成后,點擊“提交”
-
負載均衡SVC創建完成后,到負載均衡控制臺,選擇指定負載均衡器,查看詳情如下:
| 說明 | |
|---|---|
| 監聽器 | 監聽器會新增一條HTTP_88的記錄,并已開啟“通過X-Forwarded-For獲取客戶端IP” |
| 后端主機組 | 后端主機組新增關聯監聽器HTTP_88的記錄 |

訪問驗證
以工作負載為nginx為例:
- 進入負載詳情,查看pod日志,打開自動刷新;
- 本地請求訪問工作負載,比如//117.88..:88/
- 查看pod日志,從nginx access.log可以看到請求記錄,下面124.127.58.**即為本機ip地址,可獲取客戶端真實ip
192.168.0.17 - - [08/Apr/2024:06:30:14 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" "124.127.58.**"
節點端口(NodePort)SVC
當選擇服務類型為“節點端口”,即NodePort類型SVC,有以下兩種獲取客戶端源IP方式:
- 配置SVC外部流量策略,即Service的spec.externalTrafficPolicy,配置為Local。
該方式下外部請求就只會被代理到本地 endpoints 而不會被轉發到其它節點,這樣就保留了原來的IP 地址。 - 該模式下客戶端只能訪問pod所在的node節點,無法使用其他node節點訪問服務。
- 配置SVC外部流量策略仍為Cluster,創建SVC之后,需要在負載均衡器中手動創建監聽器及后端主機組,后端主機組配置為容器節點及端口。
注意cubecni不支持外部流量策略為Local模式
說明該模式下客戶端只能訪問pod所在的node節點,無法使用其他node節點訪問服務
方式一:外部流量策略為Local
創建服務時,選擇類型為“節點端口”,外部流量策略為Local:

創建完成后,通過//{NodeIP}:32767請求工作負載,從nginx access.log可以看到請求記錄,下面192.168.0.6即為內網ip地址,可獲取客戶端真實ip:
192.168.0.6 - - [08/Apr/2024:07:31:25 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.79.1" "-"
方式二:外部流量策略為Cluster、手動配置負載均衡
1、創建服務時,選擇類型為“節點端口”,外部流量策略為Cluster:
2、進入“負載均衡”控制臺,創建負載均衡器或者選擇已有負載均衡實例,進行以下操作:
- 點擊“添加監聽器”,選擇協議端口為HTTP類型,填入端口號;打開下方“獲取客戶端IP”開關:
- 點擊進入下一步,這里定義后端主機組名稱:
- 配置完成,點擊“創建”;
- 進入上一步創建的后端主機組,點擊“添加主機”,選擇主機為容器集群節點:
- 點擊“下一步”,配置主機端口為步驟1中SVC配置端口,配置權重:
- 點擊“確定”,完成主機添加。
3、訪問驗證
-
本地請求訪問工作負載,比如//117.88..:8088/
-
查看pod日志,從nginx access.log可以看到請求記錄,下面124.127.58.**即為本機ip地址,可獲取客戶端真實ip:
192.168.0.17 - - [08/Apr/2024:07:30:14 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" "124.127.58.**"
TCP請求獲取客戶端真實源IP地址
針對TCP請求,可以通過在后端主機配置TOA插件獲取客戶端的真實源IP地址,詳情可參見:TCP請求獲取客戶端真實源IP地址