在容器服務中獲取客戶端真實源 IP

2022-01-10 22:54:04 字數 3151 閱讀 1919

對服務請求的**有做審計的需求,如異地登陸告警。

針對安全攻擊或安全事件溯源需求,如 apt 攻擊、ddos 攻擊等。

業務場景資料分析需求,如業務請求區域統計。

其他需要獲取客戶端位址的需求。

要啟用保留客戶端 ip 功能,可在 service 資源中配置字段service.spec.externaltrafficpolicy,此欄位表示服務是否希望將外部流量路由到節點本地或集群範圍的端點。有兩個選項值:cluster(預設)和local方式,如下圖所示:

優點:只需要修改 kubernets service 資源配置即可。

缺點:會存在潛在的 pods(endpoints)流量負載不均衡風險。

使用tke原生支援的 clb 直通 pod 的**功能(clb 透傳**,並繞過 kubernetes service 流量**),後端 pods 收到的請求的源ip即是客戶端真實源ip,此方式無論是在四層還是七層服務的**場景下都適用,**原理如下圖:

優點:tke原生支援的功能特性,只需在控制台按照文件配置即可。

缺點:集群需要開啟 vpc-cni 模式網路,詳情參考文件 vpc-cni 模式說明

在七層(http/https)服務**場景下,可以通過獲取 http header 中x-forwarded-forx-real-ip欄位的值來獲取客戶端真實源 ip, tke 中有兩種場景使用方式,原理介紹如下:

下面詳細介紹在 tke 中兩種場景的配置使用方法:

然後在控制台為 service 新建乙個對應的 ingress 訪問入口,如下圖:

待配置生效後,在後端通過獲取 http header 中的x-forwarded-forx-real-ip字段值得到客戶端真實源 ip。後端抓包測試結果示例如下:

nginx ingress 可以通過 tke 應用商店、自定義 yaml 配置或使用官方(helm 安裝)方式安裝,原理和部署方法可參考文件 在 tke 上部署 nginx ingress 中的部署方案一或方案三,若選擇方案一部署,則需要修改 nginx ingress controller service 的externaltrafficpolicy字段值為local。安裝完成後,會在tke控制台自動為 nginx ingress controller 服務建立乙個 clb(四層)訪問入口,如下圖所示:

為要**的後端服務建立乙個 ingress 資源並配置**規則, 可以使用以下 yaml 建立:

apiversion: networking.k8s.io/v1beta1

kind: ingress

metadata:

annotations:

kubernetes.io/ingress.class: nginx # ingressclass類為"nginx"

name: example

namespace: default

spec:

rules: # 配置服務**規則

待配置生效後,在後端獲取 http header 中的x-forwarded-forx-real-ip字段值得到客戶端真實源 ip,後端抓包測試結果示例如下:

以上介紹的兩種場景都可以滿足獲取客戶端真實源 ip 的需求,且具有以下優點和缺點:

缺點:僅適用於七層(http/https)流量**場景,不適用於四層**場景,如果是四層**場景,請使用後面介紹的其他方式。

優點:對於 tcp 傳輸方式,在核心層面且僅對 tcp 連線的首包進行改造,幾乎沒有效能損耗。

缺點

需要在集群工作節點上載入 toa 核心模組,且需在服務端通過函式呼叫獲取攜帶的源 ip、埠資訊,配置使用比較麻煩。

對於 udp 傳輸方式,會對每個資料報改造新增 option 資料(源 ip 和源埠),帶來網路傳輸通道效能損耗。

在 tke 上部署 nginx ingress: 在 tke 上部署 nginx ingress - 最佳實踐

tke 場景下 clb 直通 pod 使用介紹:在 tke 上使用負載均衡直通 pod - 最佳實踐

獲取客戶端真實ip

很多時候我們需要獲取客戶端的訪問ip,ip位址合法驗證 long sprintf u ip2long ip ip long array ip,long array 0.0.0.0 0 return ip type 一 如果沒有使用 伺服器,remote addr 客戶端iphttp x forwar...

獲取客戶端真實IP

server http x real ip nginx 模式下,獲取客戶端真實ip server http client ip 端的 有可能存在,可偽造 server http x forwarded for 使用者是在哪個ip使用的 有可能存在,也可以偽造 server http cdn src ...

獲取客戶端真實IP

在jsp裡,獲取客戶端的ip位址的方法是 request.getremoteaddr 這種方法在大部分情況下都是有效的。但是在通過了 apache,nagix等反向 軟體就不能獲取到客戶端的真實ip位址了。如果使用了反向 軟體,用 request.getremoteaddr 經過 以後,由於在客戶端...