You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 02:45:37