簡體   English   中英

更新 ingress-nginx-controller ConfigMap 以將客戶端 IP 傳遞給后端服務

[英]Updating ingress-nginx-controller ConfigMap to Pass Client IP to Backend Service

在 kube.netes 集群中有一個ingress-nginx-controller部署,它將請求傳遞給集群內的后端服務,這一切目前都按預期工作。

現在有一個后端服務要求從內部獲取調用者的客戶端 IP 地址,但是,在其默認配置中使用 nginx controller,后端服務在調用HttpServletRequest.getRemoteAddr()時只能看到 kube.netes 集群的 .network IP 地址HttpServletRequest.getRemoteAddr()而不是客戶端調用者的 IP 地址。

我知道代理時的請求可以覆蓋客戶端 IP 地址,我假設這就是請求通過 nginx controller 時發生的情況。

我在后端服務中添加了一個調試日志,以打印收到的請求中的所有相關標頭,並且在其默認配置中使用 nginx controller,我在收到的每個請求中看到以下X-標頭:

x-request-id:3821cea91ffdfd04bed8516586869bdd5
x-real-ip:100.10.75.1
x-forwarded-proto:https
x-forwarded-host:www.myexample.com
x-forwarded-port:443
x-scheme:https

我在不同的地方讀到 nginx 可以配置為在X-Forwarded-For header 中傳遞客戶端的 IP 地址(例如,從上面的調試日志中可以看出,它目前不包含在客戶端請求中)。

查看ingress-nginx-controller Deployment中的nginx.conf ,后端的域服務器配置有如下設置:

            proxy_set_header X-Request-ID           $req_id;
            proxy_set_header X-Real-IP              $remote_addr;
            
            proxy_set_header X-Forwarded-For        $remote_addr;
            
            proxy_set_header X-Forwarded-Proto      $pass_access_scheme;
            
            proxy_set_header X-Forwarded-Host       $best_http_host;
            proxy_set_header X-Forwarded-Port       $pass_port;
            
            proxy_set_header X-Scheme               $pass_access_scheme;
            
            # Pass the original X-Forwarded-For
            proxy_set_header X-Original-Forwarded-For $http_x_forwarded_for;

執行kubectl describe deploy -n ingress-nginx ingress-nginx-controller顯示 nginx controller 具有以下配置映射參數:--configmap --configmap=ingress-nginx/ingress-nginx-controller因此,使用此信息,我需要做什么包含在自定義 yaml 中,然后我可以應用它以覆蓋 nginx 配置設置,使其將客戶端 IP 傳遞到后端服務?

In order to have the nginx controller pass the client's ip address to the backend service I applied the following configmap yaml config:

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    helm.sh/chart: ingress-nginx-3.10.1
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 0.41.2
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  compute-full-forwarded-for: "true"
  use-forwarded-headers: "false"
  real-ip-header: proxy_protocol

我相信此配置中重要的配置部分是以下行: real-ip-header: proxy_protocol

With this configmap applied to the nginx controller I can now see the client's IP address (no longer the kubernetes cluster's network IP address) shown in the request's x-real-ip header.

傳遞真正的客戶端 IP,無需太多配置更改。 我們需要在 ConfigMap 中使用 use-forwarded-headers: 'true' ,如下面的代碼片段所示。

apiVersion: v1
kind: ConfigMap
metadata:
  labels:
    helm.sh/chart: ingress-nginx-4.0.15
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/version: 1.1.1
    app.kubernetes.io/managed-by: Helm
    app.kubernetes.io/component: controller
  name: ingress-nginx-controller
  namespace: ingress-nginx
data:
  allow-snippet-annotations: 'true'
  ssl-redirect: 'false'
  use-forwarded-headers: 'true'

使用轉發頭¶

如果為真,NGINX 會將傳入的 X-Forwarded-* 標頭傳遞給上游。 當 NGINX 位於另一個設置這些標頭的 L7 代理/負載平衡器后面時,請使用此選項。

如果為 false,NGINX 將忽略傳入的 X-Forwarded-* 標頭,並用它看到的請求信息填充它們。 如果 NGINX 直接暴露給 inte.net,或者它位於不會更改數據包中源 IP 的基於 L3/數據包的負載平衡器之后,請使用此選項。

通過啟用此 header,X-Forwarded-* header 將不會被任何內部 IP 附加或替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM