读过这篇文章的人大家好,
我正在寻找一种方法,将对位于 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 混淆,而无需进行如此大的更改。
要使用 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 地址。
您可以通过应用此配置来更新现有服务,也可以使用
修补服务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
此配置将对 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 白名单都是有效的,两者之间的选择取决于具体要求和网络架构。
参考资料: