在 Kubernetes 中使用 NGINX Ingress Controller 时,X-Forwarded-For 头部的值通常会被设置为经过的代理服务器的 IP 地址。如果你看到的 X-Forwarded-For 头部包含的是代理服务器的 IP 地址而不是客户端的真实 IP 地址,可能是因为 NGINX 配置没有正确处理真实 IP。
根据你提供的配置,以下是一些可能的解决方案:
确保 NGINX Ingress Controller 配置正确:
你已经在 ingress-nginx-controller 的 ConfigMap 中启用了 use-forwarded-headers 和 compute-full-forwarded-for。确保这些设置是正确的,并且 NGINX Ingress Controller 的版本支持这些选项。
检查负载均衡器或反向代理的配置:
如果你的 NGINX Ingress Controller 后面还有其他负载均衡器或反向代理(如 AWS ELB、GCP Load Balancer 等),确保它们也配置为传递真实的客户端 IP。通常,这些负载均衡器会将真实的客户端 IP 放在 X-Forwarded-For 头中。
设置 set_real_ip_from:
在你的 ConfigMap 中,你已经设置了 set_real_ip_from 0.0.0.0/0;。这意味着 NGINX 将信任来自任何 IP 的请求。通常,建议将其限制为负载均衡器或反向代理的 IP 地址。例如,如果你的负载均衡器的 IP 是 192.168.1.1,你可以将其设置为:
nginx
复制
set_real_ip_from 192.168.1.1;
使用 real_ip_header:
确保 real_ip_header 设置为 X-Forwarded-For,这在你的配置中已经设置:
nginx
复制
real_ip_header X-Forwarded-For;
检查 NGINX 日志:
查看 NGINX 的访问日志,确认 X-Forwarded-For 头部的值。你可以在 NGINX 的配置中添加日志格式,以便更好地调试:
nginx
复制
log_format custom '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log custom;
重启 NGINX Ingress Controller:
在更改配置后,确保重启 NGINX Ingress Controller,以使更改生效。
测试:
在完成上述步骤后,使用 curl 或其他工具测试你的服务,检查 X-Forwarded-For 头部是否包含真实的客户端 IP。
通过这些步骤,你应该能够解决 X-Forwarded-For 头部不包含真实客户端 IP 的问题。