(AKS) Kubernetes / ingress-nginx 中的 IP 白名单

问题描述 投票:0回答:1

读过这篇文章的人大家好,

我正在寻找一种方法,将对位于 234.234.234.234:1234 的公开服务(类型为 LoadBalancer)的访问限制为位于 123.123.123.123 的特定受信任 IP。

执行此操作的方法似乎是通过 nginx.ingress.kubernetes.io/whitelist-source-range:123.123.123.123/32 如以下文章所述:https://medium.com/@maninder.bindra/using-nginx-ingress-controller-to-restrict-access-by-ip-ip-whitelisting-for-a-service-部署到 bd5c86dc66d6

但是,这会遇到问题,因为默认的 externalTrafficPolicy 设置为“Cluster”会将发送者 IP 混淆到某些本地 bs,即使对于该死的 Ingress 控制器也是如此。

这个问题的解决方案似乎是将controller.service.externalTrafficPolicy设置为Local,但我不确定这样做的后果,因为它改变了解决pod的整个方式,而且我读过一些关于性能问题的文章方法。 还有一个问题是,相关资源已经存在,显然我必须完全重新创建它。我读过的每一篇关于此的文章似乎都假设您的资源尚不存在。

我想知道是否有一种方法可以解除源 IP 混淆,而无需进行如此大的更改。

kubernetes azure-aks access-control ingress-controller ingress-nginx
1个回答
0
投票

要使用 Nginx Ingress 控制器在公共 Kubernetes 服务中实现 IP 白名单,您需要将

externalTrafficPolicy
配置为
Local
以保留客户端的 IP 地址。默认情况下,
externalTrafficPolicy
设置为
Cluster
,这意味着来自客户端的流量将路由到集群中的任何节点,这可能会混淆原始客户端 IP 地址。

要保留客户端的 IP 地址,请将 LoadBalancer 服务的

externalTrafficPolicy
设置为
Local

示例

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 1234
    targetPort: 5678
  type: LoadBalancer
  externalTrafficPolicy: Local

此设置可确保外部流量直接路由到 Pod 运行的节点,从而保留客户端的 IP 地址。

enter image description here

您可以通过应用此配置来更新现有服务,也可以使用

修补服务
kubectl patch service myapp-service -p '{"spec":{"externalTrafficPolicy":"Local"}}'

接下来,使用

nginx.ingress.kubernetes.io/whitelist-source-range
注释配置 IP 白名单的 Ingress 资源:

示例

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: "123.123.123.123/32"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-service
            port:
              number: 1234

enter image description here

此配置将对 Ingress 的访问限制为指定的 IP 地址

123.123.123.123
,并将在 Nginx Ingress 中使用 IP 白名单来提供公共服务,将
externalTrafficPolicy
设置为
Local
并保留客户端 IP。

限制访问 AKS 中公开服务的另一种方法是,您可以使用

nginx.ingress.kubernetes.io/whitelist-source-range
注释将特定的受信任 IP 列入白名单。但是,默认设置为“集群”的
externalTrafficPolicy
可能会混淆发送者 IP,即使对于 Ingress 控制器也是如此。要在不更改
externalTrafficPolicy
的情况下解除源IP混淆,可以使用
nginx.ingress.kubernetes.io/real-ip-header
注释来指定包含客户端真实IP地址的标头。将值设置为
X-Forwarded-For
以使用
X-Forwarded-For
标题。

示例-

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: example-ingress
  annotations:
    nginx.ingress.kubernetes.io/whitelist-source-range: "123.123.123.123/32"
    nginx.ingress.kubernetes.io/real-ip-header: "X-Forwarded-For"
spec:
  rules:
  - host: example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: example-service
            port:
              name: http

此示例使用

nginx.ingress.kubernetes.io/real-ip-header
注释将
X-Forwarded-For
标头指定为包含客户端真实 IP 地址的标头。这使您可以在不更改
externalTrafficPolicy
的情况下解除源 IP 混淆。

在 AKS 中使用

externalTrafficPolicy: Local
real-ip-header
注释和
X-Forwarded-For
方法通过 Nginx Ingress 实现 IP 白名单都是有效的,两者之间的选择取决于具体要求和网络架构。

参考资料:

© www.soinside.com 2019 - 2024. All rights reserved.