nginx入口控制器转发源ip

bra*_*vdk 6 nginx kubernetes kubernetes-ingress nginx-config nginx-ingress

我已经为应用程序设置了入口,但想将我的 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
Run Code Online (Sandbox Code Playgroud)

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

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

data:
  use-forwarded-headers: "true"
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jac*_*Luc 5

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

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

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

cod*_*ger 1

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