X-Forwarded-For:在代理之后获取真实客户端IP

最后更新: 2026-05-31

当流量经过反向代理、负载均衡或CDN时,你的应用在TCP连接中看到的是代理的IP,而非访客的。X-Forwarded-For(XFF)头携带原始客户端IP——但前提是你安全地读取它。

这个头如何增长

每个代理都会追加它收到请求时对端的地址:

X-Forwarded-For: <client>, <proxy1>, <proxy2>

最左侧是声称的原始客户端;右侧是它经过的各级代理。

为什么不能盲目信任它

客户端可以自己发送伪造的 X-Forwarded-For。如果你的应用不加检查就读取最左值,攻击者就能伪造任意IP——绕过IP白名单、污染日志或规避限速。这是真实而常见的漏洞。

正确读取

只信任来自你自己基础设施的XFF:

  1. 清楚你前面有多少级代理(CDN+负载均衡=2)。
  2. 最右开始,精确剥离这么多个受信任跳数。
  3. 你到达的第一个不属于受信任代理的地址,就是真实客户端。

本站也应用此规则:仅按受信任代理的跳数从XFF推导客户端IP,否则回退到连接地址。地址在世界眼中的样子见 首页,它能透露什么见 IP能透露什么

备注: 较新的 Forwarded: 头(RFC 7239)用 for= / proto= 字段将其标准化。使用你的代理所设置的那个,但应用同样的信任纪律。

参考资料