K8S架构下Nginx容器从Ingress恢复客户端IP的更佳方案
我的Kubernetes(K8S)架构如下:Cloudflare -> Digital Ocean负载均衡器 -> Nginx Ingress -> Nginx容器。根据Stack Overflow上的相关回答,在Nginx Ingress层面可以正确获取用户的真实IP,但在Nginx容器内部显示的却是服务IP。我通过配置以下代码恢复了客户端IP:
set_real_ip_from 0.0.0.0/0; real_ip_header X-Forwarded-For;
但我不信任set_real_ip_from 0.0.0.0/0;这一行配置,因为它允许来自任意IP的请求,且我无法获取Ingress服务的CIDR。请问当请求来自Ingress服务时,是否有更优的方法在Nginx容器中恢复客户端IP?
利用K8S服务DNS动态信任Ingress Controller
Nginx Ingress Controller作为集群内的服务,可直接通过其服务的DNS名称配置信任来源,无需手动指定IP。假设Ingress服务名为nginx-ingress-controller,所在命名空间为ingress-nginx,配置如下:set_real_ip_from nginx-ingress-controller.ingress-nginx.svc.cluster.local; real_ip_header X-Forwarded-For; real_ip_recursive on;开启
real_ip_recursive on后,Nginx会从X-Forwarded-For列表中筛选出最后一个非信任IP的地址,确保真实客户端IP不会被中间代理覆盖。信任集群Pod CIDR范围
Ingress Controller的Pod必然属于集群的Pod CIDR范围,你可以通过kubectl cluster-info dump | grep -i pod-cidr命令获取该CIDR,然后在容器Nginx中配置信任这个范围:# 替换为你的集群Pod CIDR,例如10.244.0.0/16 set_real_ip_from 10.244.0.0/16; real_ip_header X-Real-IP; real_ip_recursive on;同时需确保Ingress Controller已开启传递真实IP的配置,在其ConfigMap中添加:
data: use-forwarded-headers: "true" proxy-real-ip-cidr: "0.0.0.0/0" # 因前端有Cloudflare和DO负载均衡,需信任这些来源信任Digital Ocean负载均衡器IP段
流量先经过DO负载均衡器,可直接使用DO官方公布的负载均衡器IP段作为信任来源,避免0.0.0.0/0的安全风险,示例配置如下:# 实际IP段请参考Digital Ocean官方文档 set_real_ip_from 10.128.0.0/10; set_real_ip_from 141.101.0.0/16; real_ip_header X-Forwarded-For; real_ip_recursive on;
内容的提问来源于stack exchange,提问作者SergkeiM

