X-Forwarded-For:在代理之后获取真实客户端IP
当流量经过反向代理、负载均衡或CDN时,你的应用在TCP连接中看到的是代理的IP,而非访客的。X-Forwarded-For(XFF)头携带原始客户端IP——但前提是你安全地读取它。
这个头如何增长
每个代理都会追加它收到请求时对端的地址:
X-Forwarded-For: <client>, <proxy1>, <proxy2>
最左侧是声称的原始客户端;右侧是它经过的各级代理。
为什么不能盲目信任它
客户端可以自己发送伪造的 X-Forwarded-For 头。如果你的应用不加检查就读取最左值,攻击者就能伪造任意IP——绕过IP白名单、污染日志或规避限速。这是真实而常见的漏洞。
正确读取
只信任来自你自己基础设施的XFF:
- 清楚你前面有多少级代理(CDN+负载均衡=2)。
- 从最右开始,精确剥离这么多个受信任跳数。
- 你到达的第一个不属于受信任代理的地址,就是真实客户端。
本站也应用此规则:仅按受信任代理的跳数从XFF推导客户端IP,否则回退到连接地址。地址在世界眼中的样子见 首页,它能透露什么见 IP能透露什么。
备注: 较新的
Forwarded:头(RFC 7239)用for=/proto=字段将其标准化。使用你的代理所设置的那个,但应用同样的信任纪律。