【问题标题】:Nginx ingress controller setting unexpected X-Forwarded-* headersNginx 入口控制器设置了意外的 X-Forwarded-* 标头
【发布时间】:2021-06-11 01:56:59
【问题描述】:

我在 EKS 上遇到了 nginx 入口控制器 (ingress-nginx v0.44.0) 的问题,其中 X-Forwarded-* 标头设置为控制器 pod 正在运行的 kubernetes 工作节点,而不是实际用户点击控制器本身的请求的详细信息。 当我们在入口控制器上终止 SSL 时,这意味着“X-Forwarded-Proto”设置为“http”而不是“https”,这会导致应用程序 pod 出现问题。

我部署了一个test pod,它返回它收到的标头以确认问题,我可以看到这些标头已收到:

X-Forwarded-For: <ip of the eks worker node>
X-Forwarded-Host: foo.bar.net
X-Forwarded-Port: 8000
X-Forwarded-Proto: http

我期待这些:

X-Forwarded-For: <ip of the origin of the original request>
X-Forwarded-Host: foo.bar.net
X-Forwarded-Port: 443
X-Forwarded-Proto: https

现在,我们确实有一个旧的旧集群运行一个旧的 nginx 入口控制器 (nginx-ingress v0.34.1),它的行为实际上与我预期的一样,但我正在努力寻找它是如何配置的这是正确的。 我确实注意到此控制器的 nginx.conf 包含与 described here 相同的“full_x_forwarded_proto”变量,但我找不到任何配置为 configmap 或类似内容的地方。

map $http_x_forwarded_proto $full_x_forwarded_proto {
  default $http_x_forwarded_proto;
  "" $scheme;
}

有人对我如何配置 nginx 以发送正确的“X-Forwarded-*”标头有任何建议吗?

【问题讨论】:

    标签: kubernetes nginx-ingress


    【解决方案1】:

    这在很大程度上取决于 Nginx 前面的确切网络设置。默认情况下,Kubernetes 通过隐藏真实客户端 IP 的 kube-proxy 网格路由所有外部连接。您还可能在其前面有某种 AWS ELB,它还可以根据设置隐藏客户端 IP。

    对于第一部分,请参阅 https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-type-loadbalancer(tl;dr set externalTrafficPolicy: Local),但对于第二部分,您必须查看您的特定负载平衡器设置。

    【讨论】:

    • 谢谢@coderanger,我已经检查了负载均衡器(两者前面都有一个基本的负载均衡器,配置几乎相同),因为其中一个工作正常,我不希望它是堵在那里。然而,externalTrafficPolicy 在两者上都设置为“Cluster”,所以我需要仔细研究一下。由于它们的设置相同,我不确定是否与它有关,但值得研究一下,谢谢!
    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2019-11-06
    • 2017-05-01
    • 2021-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多