无需登录 数据私有 本地保存

X-Forwarded-For 模拟器 - 代理链 IP 追加演示

19
0
0
0
代理链模拟器
代理链路拓扑
客户端
代理 #1
目标服务器
客户端 代理节点 目标服务器
HTTP 请求头
X-Forwarded-For: 192.168.1.100
目标服务器接收到的完整HTTP头部
逐步构建过程
步骤 节点 操作 X-Forwarded-For 值
请添加代理节点以查看构建过程
客户端IP: - 代理层数: - 最终XFF含 - 个IP
常见问题与知识点

X-Forwarded-For (XFF) 是一个 HTTP 扩展头部字段,用于标识通过 HTTP 代理或负载均衡器连接到 Web 服务器的客户端的原始 IP 地址。它最初由 Squid 缓存代理引入,现已成为事实上的行业标准。

由于代理服务器会修改请求的来源 IP(服务器看到的是代理的 IP 而非客户端 IP),XFF 头部解决了"如何知道真实客户端是谁"的问题。格式为:X-Forwarded-For: client, proxy1, proxy2, ...,最左侧为原始客户端 IP,右侧依次为各级代理的上游 IP。

注意:RFC 7239 定义了标准的 Forwarded 头部作为 XFF 的替代方案,但 XFF 仍被广泛使用。

代理链中每一级代理都会将自己看到的直接上游 IP追加到 XFF 头部的末尾:

  1. 客户端发起请求(通常无 XFF 头)→ 到达代理 A
  2. 代理 A 识别客户端 IP 为 1.1.1.1,设置 XFF: 1.1.1.1
  3. 请求转发至代理 B,代理 B 看到来源 IP 为 2.2.2.2(代理 A 的 IP),追加后 XFF: 1.1.1.1, 2.2.2.2
  4. 依次类推,每级代理追加其上游 IP

最终目标服务器结合 XFF 和 TCP 连接来源 IP,可还原完整链路。

可以。XFF 头部是客户端或代理自行添加的 HTTP 头部,恶意客户端可以在初始请求中直接包含伪造的 XFF 值。例如,攻击者发送:X-Forwarded-For: 127.0.0.1 试图伪装为本地请求。

防护策略:

  • 只信任已知代理追加的 IP:从右向左解析 XFF,找到第一个非受信代理之前的 IP 作为真实客户端 IP。
  • 配置受信代理列表:在 Nginx 中使用 set_real_ip_from 指令指定受信任的代理 IP 范围。
  • 使用 X-Real-IP:一些代理单独设置此头部(通常不可伪造,由受信代理覆盖)。

  • X-Forwarded-For:包含完整的代理链 IP 列表(逗号分隔),可追溯多级代理。
  • X-Real-IP:通常只包含一个 IP 地址,即原始客户端的真实 IP。通常由最边缘的代理(如 Nginx)设置,且后续代理不应修改。

实践中,X-Real-IP 更简洁但信息量少;XFF 更完整但需要解析。许多场景下两者配合使用。

主流 CDN(如 Cloudflare、AWS CloudFront、Akamai)通常会在 XFF 中追加客户端真实 IP,同时可能使用自定义头部:

  • Cloudflare:使用 CF-Connecting-IP 头部传递真实客户端 IP。
  • AWS CloudFront:在 XFF 中追加客户端 IP,同时提供 CloudFront-Viewer-Address
  • 通用做法:CDN 边缘节点作为代理链的第一级,追加客户端 IP 到 XFF。

如果你的服务器在 CDN 后面,需要配置信任 CDN 的 IP 范围,以正确解析 XFF 中的客户端 IP。

Nginx 配置示例:

# 定义受信代理 IP 范围
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
real_ip_header X-Forwarded-For;
real_ip_recursive on;

# 在日志中记录真实 IP
log_format main '$remote_addr - $remote_user [$time_local] '
                '"$request" $status $body_bytes_sent '
                '"$http_referer" "$http_user_agent" '
                '"$http_x_forwarded_for"';

# 将真实 IP 传递给后端
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

$proxy_add_x_forwarded_for 会自动将客户端 IP 追加到现有 XFF 值后面。

RFC 7239 定义了标准化的 Forwarded 头部,旨在统一 X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host 等多个非标准头部。格式示例:

Forwarded: for=192.0.2.1;proto=https;host=example.com;by=203.0.113.1

虽然 Forwarded 更规范,但 XFF 等传统头部在生态系统中仍然占据主导地位,许多框架和工具同时支持两者。

如果没有正确配置 XFF 解析,服务器 remote_addr 看到的只是最后一跳代理的 IP(即直接连接服务器的代理)。常见原因:

  • 未配置 real_ip_header 或等效设置
  • 未将上游代理/CDN 加入受信列表
  • 代理未正确设置 XFF 头部
  • 使用了不支持 XFF 的代理软件

使用本工具可以直观理解代理链的 IP 追加机制,帮助排查配置问题。