【问题标题】:How can I get real client IP from Nginx ingress load balancer in GKE如何从 GKE 中的 Nginx 入口负载均衡器获取真实客户端 IP
【发布时间】:2022-10-14 07:12:42
【问题描述】:

我怎样才能得到真实客户端IP来自 GKE 中的 Nginx 入口负载均衡器?根据在线资源,我已经配置了 External Traffic Policy: Local 并添加了 use-proxy-protocol: "true" 属性。

但是,我仍然在日志中看到了 GKE 节点 IP/接口,而不是真正的客户端 IP。

我的负载均衡器服务->

Name:                     ingress-nginx-controller
Namespace:                ingress-nginx
Labels:                   app.kubernetes.io/component=controller
                          app.kubernetes.io/instance=ingress-nginx
                          app.kubernetes.io/managed-by=Helm
                          app.kubernetes.io/name=ingress-nginx
                          app.kubernetes.io/version=0.41.2
                          helm.sh/chart=ingress-nginx-3.10.1
Annotations:              networking.gke.io/load-balancer-type: Internal
Selector:                 app.kubernetes.io/component=controller,app.kubernetes.io/instance=ingress-nginx,app.kubernetes.io/name=ingress-nginx
Type:                     LoadBalancer
IP Family Policy:         SingleStack
IP Families:              IPv4
IP:                       xx.xxx.xx.xx
IPs:                      xx.xx.xxx.xx
LoadBalancer Ingress:     xx.xx.xx.xx
Port:                     http  80/TCP
TargetPort:               http/TCP
NodePort:                 http  32118/TCP
Endpoints:                xx.x.xx.xx:80
Port:                     https  443/TCP
TargetPort:               https/TCP
NodePort:                 https  31731/TCP
Endpoints:                xx.x.xx.xxx:443
Session Affinity:         None
External Traffic Policy:  Local
HealthCheck NodePort:     30515

我的配置图->

apiVersion: v1
data:
  access-log-path: /var/log/nginx-logs/access.log
  compute-full-forwarded-for: "true"
  enable-real-ip: "true"
  enable-underscores-in-headers: "true"
  error-log-path: /var/log/nginx-logs/error.log
  large-client-header-buffers: 4 64k
  log-format-upstream: $remote_addr - $request_id - [$proxy_add_x_forwarded_for] -
    $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer"
    "$http_user_agent" $request_length $request_time [$proxy_upstream_name] $upstream_addr
    $upstream_response_length $upstream_response_time $upstream_status
  proxy-read-timeout: "240"
  proxy-send-timeout: "240"
  real-ip-header: proxy_protocol
  use-forwarded-headers: "true"
  use-proxy-protocol: "true"

【问题讨论】:

  • 您想在后端服务 Pod 中获取实际的客户端 IP?
  • @GariSingh 是的,我想获取实际的客户端 IP。

标签: kubernetes google-kubernetes-engine kubernetes-ingress nginx-ingress gke-networking


【解决方案1】:

你好吗?

您还需要在 Kubernetes 规范上进行设置:

externalTrafficPolicy: Local

所以你可以使用如下:

use-proxy-protocol: "false"
enable-real-ip: "true"
use-forwarded-headers: "true"
proxy-real-ip-cidr: "YOUR-LB-IP/32"

如果您想进行 HTTPS 重定向,那么您可以根据需要进行设置:

force-ssl-redirect: "true"

继续阅读https://cloud.google.com/kubernetes-engine/docs/how-to/service-parameters#externalTrafficPolicy

【讨论】:

    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-29
    相关资源
    最近更新 更多