乾貨:不同場景容器內獲取客戶端源IP的方法
摘要:客戶端和容器伺服器之間可能存在多種不同形式的代理伺服器,那容器中如何獲取到客戶端真實的源ip呢?
k8s已經成為當今容器化的標準,人們在享受容器帶來的高效與便利的同時,也遇到一些煩惱:客戶端和容器伺服器之間可能存在多種不同形式的代理伺服器,那容器中如何獲取到客戶端真實的源ip呢?下面我們就幾種場景型別如何能獲取到源ip進行討論。
原理介紹:
四層轉發:
Nodeport:nodeport訪問方式,是將容器埠對映到節點埠,如果“服務親和”選擇“叢集級別”需要經過一次服務轉發,無法實現獲取客戶端源ip,而“節點模式”不經過轉發,可以獲取客戶端源ip。
ELB:ELB訪問方式,是透過華為雲ELB產品來實現負載均衡,“服務親和”也是需要選擇“節點級別”,其中“共享型”ELB需要在節點安裝TOA外掛,而“獨享型”ELB預設透傳源ip,不需要安裝TOA外掛。
七層轉發:
Ingress:應用在七層訪問時,客戶端源ip預設儲存在HTTP頭部的“X-Forwarded-For”欄位,無需做其他操作。
具體操作:
一、負載均衡 ( LoadBalancer )
負載均衡( LoadBalancer )的Service模式下,支援容器中獲取源IP需要滿足以下前提條件:
1. 服務親和選擇“節點級別”而不是“叢集級別”。
2. 在pod所在的節點安裝TOA外掛。(“獨享型”ELB無需進行以下操作)
安裝TOA外掛步驟如下:
1) 準備編譯環境:
執行如下命令,安裝gcc編譯器。
]# yum install gcc
執行如下命令,安裝make工具。
]# yum install make
2)編譯核心模組
a) 下載TOA核心模組原始碼。
]# wget b) 執行如下命令,進入原始碼目錄,編譯模組。
]# unzip master.zip
]# cd TCP_option_address-master/src/
]# make
編譯過程未提示warning或者error,說明編譯成功,檢查當前目錄下是否已經生成toa.ko檔案。
說明:如果報錯提示“config_retpoline=y but not supported by the compiler, Compiler update recommended”,表明gcc版本過老,建議將gcc升級為較新版本。
3)載入核心模組
執行如下命令,載入核心模組。
]# insmod toa.ko
執行如下命令,驗證模組載入情況,檢視核心輸出資訊。
]# dmesg | grep TOA
若提示資訊包含“TOA: toa loaded”,說明核心模組載入成功。
4) 自動載入核心模組
為了使TOA核心模組在系統啟動時生效,可以將載入TOA核心模組的命令加到客戶的啟動指令碼中。
在“/etc/sysconfig/modules/”目錄下新建toa.modules檔案。該檔案包含了TOA核心模組的載入指令碼,請參考如下示例:
#!/bin/sh
/sbin/modinfo -F filename /root/toa/toa.ko > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/insmod /root/TCP_option_address-master/src/toa.ko
fi
注意:其中“/root/TCP_option_address-master/src/toa.ko”為TOA核心模組檔案的路徑,客戶需要將其替換為自己編譯的TOA核心模組路徑。
執行以下命令,為toa.modules啟動指令碼新增可執行許可權。
]# chmod +x /etc/sysconfig/modules/toa.modules
這種情況下可以從四層負載均衡上獲取到客戶端的源IP(可以透過netstat檢視)。
測試要點:這種情況下可以使用netstat看到客戶端連線到POD的IP地址。
二、節點訪問 ( NodePort )
節點訪問(NodePort)型別的Service的服務親和選擇“節點級別”而不是“叢集級別”,即Service的 spec.externalTrafficPolicy 需要設定為 Local。
圖1 服務親和選擇節點級別
三、七層負載均衡(Ingress)
七層負載均衡的模式下,不能在四層負載均衡上獲取客戶端IP(不能透過netstat檢視客戶端IP),需要對應用伺服器進行配置,然後透過七層負載均衡的http頭中的x-forward-for獲取。
真實的來訪者IP會被負載均衡放在HTTP頭部的X-Forwarded-For欄位,格式如下:
X-Forwarded-For: 來訪者真實IP, 代理伺服器1-IP, 代理伺服器2-IP, ...
測試要點:從容器中獲取http請求頭”x-forward-for”,獲取的IP為客戶端的IP。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1762/viewspace-2796412/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在容器服務中獲取客戶端真實源 IP客戶端
- pomelo獲取客戶端IP客戶端
- c# 獲取客戶端IPC#客戶端
- 獲取客戶端真實IP客戶端
- .net 獲取客戶端真實ip客戶端
- java 獲取客戶端真實ipJava客戶端
- java獲取客戶端ip和macJava客戶端Mac
- 一次獲取客戶端 IP 記錄客戶端
- 伺服器獲取真實客戶端 IP伺服器客戶端
- java web 通過request獲取客戶端IPJavaWeb客戶端
- 服務端如何獲取客戶端請求IP地址服務端客戶端
- 獲取SQL Server中連線的客戶端IP地址SQLServer客戶端
- Java面試題-如何獲取客戶端真實IPJava面試題客戶端
- ASP.NET獲取客戶端IP及MAC地址ASP.NET客戶端Mac
- JS獲取客戶端IP地址與機器名JS客戶端
- 在SelfHost專案中獲取客戶端IP地址客戶端
- 獲得客戶端ip的方法,排除代理伺服器客戶端伺服器
- nginx反向代理獲取客戶端的真實IP和域名Nginx客戶端
- Nginx 反向代理後如何獲取真實客戶端 IPNginx客戶端
- JSF/JAVA 根據IP獲取客戶端Mac地址JSJava客戶端Mac
- Silverlight中利用WCF獲取客戶端IP客戶端
- 在OwinSelfHost專案中獲取客戶端IP地址客戶端
- 獲取客戶端Mac地址客戶端Mac
- Spring 客戶端 IP 地址獲取及儲存細節Spring客戶端
- 阿里雲CDN + nginx多級代理獲取客戶端IP阿里Nginx客戶端
- nginx多級代理下如何獲取客戶端真實IPNginx客戶端
- flutter開發的乾貨集中營客戶端Flutter客戶端
- 【知識積累】伺服器端獲取客戶端的IP地址(當客戶端呼叫由Axis開發的WebService)伺服器客戶端Web
- asp.net 獲取客戶端瀏覽器訪問的IP地址ASP.NET客戶端瀏覽器
- 深入分析幾種PHP獲取客戶端IP的情況轉PHP客戶端
- Istio 中實現客戶端源 IP 的保持客戶端
- Nacos - 客戶端例項列表獲取客戶端
- ABP vNext 審計日誌獲取真實客戶端IP客戶端
- javascript獲取客戶端ip地址省市和運營商程式碼例項JavaScript客戶端
- PHP獲取客戶端、PHP獲取伺服器相關資訊PHP客戶端伺服器
- 從刷票瞭解如何獲得客戶端IP客戶端
- 在Intranet中獲得客戶端IP地址客戶端
- .NET CORE WEBAPI 後端獲取來源IPWebAPI後端