本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
在营销、审计和反作弊等场景中,通常需要网关获取客户端源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。如下图示例:
请求链路中固定存在3个代理,即信任跳数numTrustedProxies: 2
。请求经过3个代理后,XFF请求头中的IP列表为[1.1.1.1, 2.2.2.2, 3.3.3.3]
,ASM网关基于已经配置的信任跳数对此列表进行反向移除,从而获得真实的客户端IP1.1.1.1
。信任跳数配置方式如下:
使用ASM的kubeconfig,编辑ASM网关配置。
$ kubectl -n istio-system edit istiogateway <ASM网关名称>
为网关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.4
的IP地址,这是由于网关在完成numTrustedProxies
的计算,获取了客户端IP后,为XFF请求头追加了Proxy3的IP,并不影响获取的客户端IP准确度。
通过排除已知地址获取客户端IP
在调用链路拓扑不固定的场景中,仅配置信任跳数无法确保能正确地获取客户端IP。此时需要通过配置信任的已知地址,使得ASM网关能够剔除这些已知地址,从而获得正确的客户端地址。如下图示例:
在上图呈现的场景中,Client1和Client2的拓扑跳数并不一致,无法通过配置固定跳数的方式来获取真实的客户端IP。此时需要将Proxy1~Proxy4的IP添加到网关的信任地址段中,使网关可以剔除这些已知地址,从而获得正确的客户端地址。已知地址配置方式如下:
编辑ASM网关配置。
$ kubectl -n istio-system edit istiogateway <ASM网关名称>
为网关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上生效。