通过配置XFF请求头使ASM网关获得客户端IP

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

在营销、审计和反作弊等场景中,通常需要网关获取客户端源IP以提升安全性、优化体验或满足合规要求。本文介绍在ASM场景下,如何配置X-Forwarded-For请求头来使ASM网关获取客户端源IP。

重要

ASM网关获取客户端源IP功能需要ASM版本为1.24.6.83及以上,您可以通过升级ASM实例版本来确保可以正常配置。

背景信息

X-Forwarded-For(XFF)是一个广泛使用的HTTP请求头字段,用于在请求经过代理服务器、负载均衡器或CDN时记录客户端的真实IP地址。

X-Forwarded-For的值是一个以逗号分隔的IP地址列表,格式如下:

X-Forwarded-For: <客户端真实IP>, <第一个代理IP>, <第二个代理IP>, ...

通过配置信任代理数量获取客户端IP

在调用链路拓扑固定的场景中,通过为网关Pod配置信任跳数(链路代理数量-1)注解,即可使得ASM网关正确地获取客户端IP。如下图示例:

image

请求链路中固定存在3个代理,即信任跳数numTrustedProxies: 2。请求经过3个代理后,XFF请求头中的IP列表为[1.1.1.1, 2.2.2.2, 3.3.3.3],ASM网关基于已经配置的信任跳数对此列表进行反向移除,从而获得真实的客户端IP1.1.1.1。信任跳数配置方式如下:

  1. 使用ASMkubeconfig,编辑ASM网关配置。

    $ kubectl -n istio-system edit istiogateway <ASM网关名称>
  2. 为网关Pod添加以下注解,设置信任跳数。

    警告

    进行本操作将导致网关进行滚动重启,请在业务低峰期进行操作。

    spec:
      podAnnotations:
        proxy.istio.io/config: |
          gatewayTopology:
            numTrustedProxies: <信任代理数量-1>

    修改完成后,配置将在新启动的网关Pod上生效。

重要
  • numTrustedProxies的值必须小于XFF请求头携带的IP地址数量。大于等于X-Forwarded-For请求头中携带的地址数量,ASM网关将取IP列表中最后一个(最右侧)地址作为客户端真实IP。

  • ASM网关的访问日志中输出的XFF请求头包含了ASM网关追加的地址,追加的动作发生在numTrustedProxies计算之后。以上述示例为例,最终网关访问日志显示的XFF请求头内容会包含4.4.4.4IP地址,这是由于网关在完成numTrustedProxies的计算,获取了客户端IP后,为XFF请求头追加了Proxy3IP,并不影响获取的客户端IP准确度。

通过排除已知地址获取客户端IP

在调用链路拓扑不固定的场景中,仅配置信任跳数无法确保能正确地获取客户端IP。此时需要通过配置信任的已知地址,使得ASM网关能够剔除这些已知地址,从而获得正确的客户端地址。如下图示例:

image

在上图呈现的场景中,Client1Client2的拓扑跳数并不一致,无法通过配置固定跳数的方式来获取真实的客户端IP。此时需要将Proxy1~Proxy4IP添加到网关的信任地址段中,使网关可以剔除这些已知地址,从而获得正确的客户端地址。已知地址配置方式如下:

  1. 编辑ASM网关配置。

    $ kubectl -n istio-system edit istiogateway <ASM网关名称>
  2. 为网关Pod添加以下注解,将已知的IP地址加入信任地址段。

    警告

    进行本操作将导致网关进行滚动重启,请在业务低峰期进行操作。

    此处仅支持CIDR的格式,即固定IP需要带有子网掩码位数/32
    spec:
      podAnnotations:
        proxy.istio.io/config: |
          gatewayTopology:
            xffTrustedCidrs:
            - 2.2.2.2/32
            - 3.3.3.3/32
            - 4.4.4.4/32
            - 5.5.5.5/32

    修改完成后,配置将在新启动的网关Pod上生效。