nginx入口控制器转发源ip

Posted

技术标签:

【中文标题】nginx入口控制器转发源ip【英文标题】:nginx ingress controller forward source ip 【发布时间】:2020-07-13 01:55:18 【问题描述】:

我已经为应用程序设置了入口,但想将我的 IP 地址列入白名单。所以我创建了这个 Ingress:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: $MY_IP/32
  name: $INGRESS_NAME
spec:
  rules:
  - host: $DNS_NAME
    http:
      paths:
      - backend:
          serviceName: $SVC_NAME
          servicePort: $SVC_PORT
  tls:
  - hosts:
    - $DNS_NAME
    secretName: tls-secret

但是当我尝试访问它时,我得到一个 403 禁止,并且在 nginx 日志记录中我看到一个客户端 ip,但它来自集群节点之一,而不是我的家庭 ip。

我还使用此配置创建了一个 configmap:

data:
  use-forwarded-headers: "true"

在容器中的 nginx.conf 中,我可以看到已正确传递/配置,但我仍然得到一个 403 禁止,仍然只有来自集群节点的客户端 IP。

我在 AKS 集群上运行,而 nginx 入口控制器位于 Azure 负载均衡器后面。 nginx 入口控制器 svc 暴露为类型负载均衡器,并锁定 svc 打开的节点端口。

我需要在 Nginx 中配置其他东西吗?

【问题讨论】:

【参考方案1】:

如果您使用Helm chart 安装了 nginx-ingress,您可以简单地使用controller.service.externalTrafficPolicy: Local 配置您的values.yaml 文件,我相信这将适用于您的所有服务。否则,您可以使用service.spec.externalTrafficPolicy: Local 配置特定服务,以对这些特定服务实现相同的效果。

这里有一些资源可以加深您的理解:

k8s docs - Preserving the client source IP k8s docs - Using Source IP

【讨论】:

我觉得后者可能行不通。如果我们只是在应用程序的 svc 上而不是在 nginx-ingress 的 svc 上启用它,节点的 ip 仍然会被转发到 svc 而不是 realip。 在 Oracle Cloud 上尝试了 configmap 中的 use-forwarded-headers 和 nginx 入口(quay ingress-controller 0.30)中的“externalTrafficPolicy”,但对我都不起作用 在特定服务上执行此操作对我不起作用。在 nginx-ingress-controller SERVICE(不是部署或配置)上设置 externalTrafficPolicy: Local 使一切都神奇地工作。甚至 ClusterIP 服务现在也能获得正确的标头。【参考方案2】:

听起来您的 Nginx 入口控制器位于 NodePort(或 LoadBalancer)服务之后,或者更确切地说是在 kube-proxy 之后。通常,要让您的控制器查看原始连接 IP,您需要使用 hostNetwork 端口部署它,以便它直接侦听传入流量。

【讨论】:

嗨,是的,很抱歉忘记提及这一点。编辑了问题。我的 nginx 控制器公开为类型负载均衡器,并且确实位于天蓝色负载均衡器后面,该负载均衡器确实有 lb 规则转发到由 svc 打开的节点端口。 很抱歉试图编辑 coderrangers 的建议,但想编辑我自己的。想补充一点,AKS中默认使用Kube-proxy

以上是关于nginx入口控制器转发源ip的主要内容,如果未能解决你的问题,请参考以下文章

Nginx 入口控制器 websocket 支持

nginx 获取源IP 获取经过N层Nginx转发的访问来源真实IP

如何修复 nginx 入口的“无法确保负载均衡器”错误

NGINX Ingress 上的全局静态 IP 名称

具有多个入口资源对象的 Kubernetes nginx 入口控制器

Nginx 入口控制器返回 404 Kubernetes