7

我尝试使用代理协议在 google 容器上设置 nginx 入口(nodeport),以便可以将真实 ip 转发到后端服务,但最终导致标头损坏。

2017/02/05 13:48:52 [error] 18#18: *2 broken header: "�����~��]H�k��m[|����I��iv.�{y��Z �嵦v�Ȭq���2Iu4P�z;�    o$�s����"���+�/�,�0̨̩����/" while reading PROXY protocol, client: 10.50.0.1, server: 0.0.0.0:443

如果没有代理协议,一切都会很好。根据https://blog.mythic-beasts.com/2016/05/09/proxy-protocol-nginx-broken-header/这是由于使用了协议 v2(二进制),但 nginx 只能说 v1 . 有什么建议吗?

4

3 回答 3

2

GKE:在 kubernetes v1.6+ 中,源 ip 默认保留,x-real-ip无需设置任何额外的 nginx 配置即可在 headers 下找到。

AWS:可以通过将其添加到注释中来保留源 ip

apiVersion: v1
kind: Service
metadata:
  name: nginx-ingress
  namespace: nginx-ingress
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-proxy-protocol: '*'
  labels:
    app: nginx-ingress

查看此链接 https://github.com/kubernetes/ingress/tree/master/examples/aws/nginx

于 2017-08-12T06:40:21.643 回答
0

我自己也遇到了这个问题。对我来说,我不在负载均衡器后面(除了我的 nginx 入口),所以我实际上不需要proxy-protocol设置。

但是,我127.0.0.1仍然是客户端 IP。诀窍是我使用的 nginx 入口版本(0.9.0-beta.5)存在错误。更新我的容器映像以gcr.io/google_containers/nginx-ingress-controller:0.9.0-beta.8解决问题,我收到了正确的X-Forwarded-For标题。

请注意,更高版本(在撰写本文时最高为 beta.11)仍然存在问题,所以我暂时停留在 beta.8 上。

您可以在https://console.cloud.google.com/gcr/images/google-containers/GLOBAL/nginx-ingress-controller查看可用的版本。

如果您想查看可用的配置选项,请查看https://github.com/kubernetes/ingress/tree/master/controllers/nginx

于 2017-07-25T02:25:22.023 回答
-1

我自己也遇到了这个问题,这就是最终使它起作用的东西。更新到 nginx 控制器的 beta.8 版本。

如果某些使用 AWS 的人想从我的错误中吸取教训,请不要通过 aws cli 手动配置负载均衡器。上面提到的服务注释为您完成了这一切。如果我意识到这一点,我本可以为自己省去很多麻烦。

于 2018-07-20T09:36:06.937 回答