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

Istio中X-Forwarded-For/X-Real-IP显示内网IP而非客户端真实IP问题

解决Istio Ingress Gateway无法转发客户端真实IP的问题

核心原因分析

问题根源在于两个关键配置缺失:

  1. Kubernetes Service默认的externalTrafficPolicy: Cluster会触发SNAT,导致Istio Ingress Gateway获取的是集群节点IP而非客户端真实IP;
  2. 原有EnvoyFilter未精准匹配Ingress Gateway工作负载,同时XFF参数设置不符合前置网络架构。

分步解决方案

1. 禁用Ingress Gateway Service的SNAT

Kubernetes的LoadBalancer/NodePort类型Service默认会做源地址转换,必须将其externalTrafficPolicy设为Local以保留客户端真实IP:

apiVersion: v1
kind: Service
metadata:
  name: istio-ingressgateway
  namespace: istio-system
spec:
  externalTrafficPolicy: Local  # 关键配置:跳过SNAT,保留真实客户端IP
  type: LoadBalancer  # 或你实际使用的NodePort类型
  ports:
    - name: http2
      port: 80
      targetPort: 8080
    - name: https
      port: 443
      targetPort: 8443
  selector:
    istio: ingressgateway

2. 修正EnvoyFilter配置,精准处理XFF头

原有EnvoyFilter未指定工作负载选择器,导致配置未生效到Ingress Gateway。以下是修正后的配置:

apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
  name: ingress-xff-config
  namespace: istio-system
spec:
  workloadSelector:
    labels:
      istio: ingressgateway  # 仅匹配Ingress Gateway实例
  configPatches:
    - applyTo: NETWORK_FILTER
      match:
        context: GATEWAY
        listener:
          filterChain:
            filter:
              name: "envoy.filters.network.http_connection_manager"
      patch:
        operation: MERGE
        value:
          typed_config:
            "@type": "type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager"
            use_remote_address: true  # 启用后,Envoy将XFF中的真实IP作为远程地址
            xff_num_trusted_hops: 1  # 根据前置负载均衡层数调整:前端有1层云LB则设1,无则设0
            xff_extract: true  # 强制从XFF头提取真实IP
            skip_xff_append: false  # 允许Envoy将真实IP追加到XFF头(按需调整)

3. 移除VirtualService中错误的头设置

你在VirtualService中使用%DOWNSTREAM_REMOTE_ADDRESS%的方式错误:该变量在后端边车中指向的是Ingress Gateway的网格内IP,而非客户端真实IP。直接删除这部分配置,让Envoy自动处理头传递:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: your-app-vs
  namespace: your-app-namespace
spec:
  hosts:
    - "your-domain.com"
  gateways:
    - istio-ingressgateway
  http:
    - route:
        - destination:
            host: your-app-service
            port:
              number: 80

4. 确保后端边车保留真实IP头

Istio默认会保留X-Forwarded-For和X-Real-IP头,若有自定义配置,可通过Sidecar资源明确允许头传递:

apiVersion: networking.istio.io/v1beta1
kind: Sidecar
metadata:
  name: default
  namespace: your-app-namespace
spec:
  trafficPolicy:
    tls:
      mode: DISABLE
  outboundTrafficPolicy:
    mode: ALLOW_ANY

验证步骤

  1. 重启Ingress Gateway Pod使配置生效:
    kubectl rollout restart deployment istio-ingressgateway -n istio-system
    
  2. 发送测试请求,检查后端服务日志中的X-Forwarded-For和X-Real-IP头,确认是否为客户端真实IP。

内容的提问来源于stack exchange,提问作者Carbonic Vito

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:43:13