API网关后有多层代理,真实客户端IP怎么取?Forwarded与X-Forwarded-For

不能无条件相信客户端提交的X-Forwarded-For,必须按可信代理链从右向左解析
发布于
2

当请求依次经过CDN、WAF、云负载均衡和API网关时,应用TCP连接的直接对端通常是最后一层网关。因此应用框架读取到负载均衡IP是正常的。真实客户端地址需要从受控代理写入的头部中解析,但绝不能无条件相信用户提交的X-Forwarded-For

多层代理中的地址变化

位置 直接连接来源 可能写入的信息
CDN/WAF 客户端公网地址 清洗并写入客户端IP头
负载均衡 CDN或WAF出口 追加Forwarded/XFF或代理协议
API网关 负载均衡地址 再次追加代理链
应用 API网关地址 按可信代理规则解析

为什么X-Forwarded-For可以被伪造

它只是HTTP请求头。客户端可以直接发送任意值。如果第一层受控代理没有删除外部传入值并重新构造,恶意请求就能把伪造地址放在列表左侧。应用若机械取最左项,会污染审计、限流和安全决策。

正确思路是可信代理链

应用先确认直接连接来源是否属于可信API网关。然后从代理链最右侧开始,跳过由组织明确控制的代理地址,取第一个不可信地址作为候选客户端。具体实现应使用框架的可信代理配置,不要手写简单字符串分割。

Forwarded与XFF有什么区别

Forwarded是标准化头,可包含forprotohostX-Forwarded-For是广泛使用的事实标准。现实环境可能同时存在。应选择基础设施明确维护的一套来源,规定覆盖与追加规则,避免两个头互相冲突。

X-Real-IP一定更安全吗

不一定。任何头的可靠性都取决于受控代理是否清洗外部输入并重新写入。若应用可被绕过CDN直接访问,攻击者还可以直接连接Origin并伪造头。应限制Origin只接受来自可信代理网络的连接。

IPv6和端口格式容易踩什么坑

标准Forwarded头中的IPv6可能带引号和方括号,XFF列表也可能包含IPv4、IPv6或无效文本。解析器应使用成熟库并验证地址格式。不要将主机和端口混为一个IP字符串,也不要因为日志系统不支持IPv6而截断。

Proxy Protocol什么时候使用

在TCP负载均衡场景中,Proxy Protocol可在连接层传递源地址,但发送端和接收端必须同时启用。错误地把Proxy Protocol流量发给普通HTTP服务会导致请求损坏。它同样依赖可信网络,不能从公网任意接受。

真实IP用于限流有哪些风险

家庭、公司、移动网络和CGNAT会让多个用户共享地址;移动切网又会频繁变化。IP限流适合做一层风险控制,不应成为唯一身份。对登录、支付或敏感API,应结合账号、设备、Token、行为和业务键。

CGNAT与共享公网IP可参考公网IP共享与CGNAT判断

日志应同时记录哪些字段

  • 应用看到的直接对端地址;
  • 原始代理头的受控摘要;
  • 解析后的候选客户端地址;
  • 命中的可信代理规则版本;
  • 请求ID、网关与服务实例;
  • 解析异常或头冲突标记。

IP地址可能属于个人数据,应设置访问权限、使用目的和保留期限。

配置变更怎样验证

  1. 列出CDN、WAF、负载均衡和网关顺序;
  2. 明确每层是覆盖还是追加头;
  3. 限制Origin仅接受可信入口;
  4. 测试正常IPv4、IPv6和多层代理;
  5. 直接发送伪造XFF,确认被清洗;
  6. 绕过一层代理,确认应用拒绝或不信任;
  7. 核对日志、限流和审计结果。

结论

多层代理后的真实客户端IP不是“取XFF最左边”这么简单。只有建立可信代理列表、入口清洗规则和从右向左的解析逻辑,客户端地址才可用于审计和辅助风控。

常见问题(FAQ)

X-Forwarded-For最左边一定是真实客户端IP吗?
不一定。客户端可以自行提交该头,只有经过受控入口清洗并结合可信代理链解析才可靠。
连接的Remote Address为什么是负载均衡IP?
应用TCP连接的直接对端就是最后一层代理,因此Remote Address显示代理地址是正常现象。
X-Real-IP比X-Forwarded-For更可靠吗?
不一定,可靠性取决于谁写入、是否清洗以及应用信任哪些代理,而不是头名称。
可以只用客户端IP作为账号安全判断吗?
不应。IP会共享、变化或经过代理,应与身份、设备、行为和风险信号结合。

本文由作者原创/授权发布于极跃圈(jiyueip.com)未经许可,禁止转载。题图来自Unsplash,基于CC0协议。

声明:极跃圈(JIYUEIP.com)内网友所发表的所有内容及言论仅代表其本人,并不反映任何极跃圈(JIYUEIP.com)之意见及观点。

0 讨论
热门最新
总结
暂无总结
0 / 600