X-Forwarded-For

X-Forwarded-For (XFF) 请求头是用于识别通过代理服务器连接到 Web 服务器的客户端原始 IP 地址的事实标准标头。

警告:不正确使用此标头可能会带来安全风险。有关详细信息,请参阅安全和隐私问题部分。

当客户端直接连接到服务器时,客户端的 IP 地址会发送到服务器(并且通常会写入服务器访问日志)。但是,如果客户端连接通过任何转发或反向代理,则服务器只能看到最终代理的 IP 地址,这通常用处不大。如果最终代理是与服务器位于同一安装中的负载均衡器,则尤其如此。因此,为了向服务器提供更有用的客户端 IP 地址,使用了X-Forwarded-For请求标头。

有关使用此标头的详细指南,请参阅解析选择 IP 地址部分。

标头类型 请求标头
禁止的标头名称

此标头的标准化版本是 HTTP Forwarded 标头。

安全和隐私问题

根据设计,此标头会公开隐私敏感信息,例如客户端的 IP 地址。因此,在部署此标头时必须牢记用户的隐私。

当客户端和服务器之间没有可信的反向代理(例如负载均衡器)时,X-Forwarded-For标头是不可信的。如果客户端和所有代理都是良性和行为良好的,则标头中的 IP 地址列表具有指令部分中描述的含义。但是,如果存在客户端或任何代理存在恶意或错误配置的风险,则标头的任何部分(或全部)都可能被欺骗(并且可能不是列表或根本不包含 IP 地址)。

如果客户端和服务器之间存在任何可信的反向代理,则最终的X-Forwarded-For IP 地址(每个可信代理一个)是可信的,因为它们是由可信代理添加的。(只要服务器只能通过这些代理访问,而不能直接访问,则为真)。

X-Forwarded-For的任何与安全相关的用途(例如速率限制或基于 IP 的访问控制)只能使用可信代理添加的 IP 地址。使用不可信的值会导致速率限制规避、访问控制绕过、内存耗尽或其他负面的安全或可用性后果。

相反,最左边的(不可信的)值只能在使用欺骗值不会产生负面影响的情况下使用。

语法

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

元素以逗号分隔,逗号周围可能有可选的空格。

指令

<client>

客户端 IP 地址

<proxy1>, <proxy2>

如果请求通过多个代理,则会列出每个后续代理的 IP 地址。这意味着,在客户端和代理行为良好的情况下,最右边的 IP 地址是最新的代理的 IP 地址,最左边的 IP 地址是原始客户端的 IP 地址。

示例

http
X-Forwarded-For: 2001:db8:85a3:8d3:1319:8a2e:370:7348

X-Forwarded-For: 203.0.113.195

X-Forwarded-For: 203.0.113.195, 2001:db8:85a3:8d3:1319:8a2e:370:7348

X-Forwarded-For: 203.0.113.195,2001:db8:85a3:8d3:1319:8a2e:370:7348,198.51.100.178

解析

X-Forwarded-For标头的解析不正确会导致欺骗值用于安全相关目的,从而导致上述负面后果。

请求中可能存在多个X-Forwarded-For标头。这些标头中的 IP 地址必须视为单个列表,从第一个标头的第一个 IP 地址开始,一直持续到最后一个标头的最后一个 IP 地址。有两种方法可以创建此单个列表

  • X-Forwarded-For完整标头值用逗号连接,然后按逗号拆分为列表,或者
  • 将每个X-Forwarded-For标头按逗号拆分为列表,然后连接这些列表

仅使用多个X-Forwarded-For标头中的一个是不够的。

(某些反向代理会自动将多个X-Forwarded-For标头连接到一个,但最安全的方法是不假设这种情况)。

选择 IP 地址

选择地址时,必须使用所有X-Forwarded-For标头中的完整 IP 列表。

在选择最靠近客户端的X-Forwarded-For客户端 IP 地址(不可信且用于安全相关目的)时,应选择最左边第一个有效地址不是私有/内部的地址。(“有效”是因为欺骗值可能根本不是 IP 地址;“不是内部/私有”是因为客户端可能在其内部网络上使用了代理,这可能添加了来自私有 IP 空间的地址)。

在选择第一个可信X-Forwarded-For客户端 IP 地址时,需要额外的配置。有两种常见的方法

  • 可信代理计数:配置了互联网和服务器之间的反向代理数量。X-Forwarded-For IP 列表从最右边开始搜索,搜索次数为该计数减一。(例如,如果只有一个反向代理,则该代理将添加客户端的 IP 地址,因此应使用最右边的地址。如果有三个反向代理,则最后两个 IP 地址将是内部的)。
  • 可信代理列表:配置了可信反向代理的 IP 或 IP 范围。X-Forwarded-For IP 列表从最右边开始搜索,跳过可信代理列表上的所有地址。第一个不匹配的地址是目标地址。

第一个可信的X-Forwarded-For IP 地址可能属于不可信的中间代理,而不是实际的客户端计算机,但它是唯一适合安全用途的 IP。

请注意,如果服务器可以直接从互联网连接(即使它也位于可信的反向代理后面)——X-Forwarded-For IP 列表的任何部分都不能被视为可信或安全用于安全相关用途。

规范

不是任何当前规范的一部分。此标头的标准化版本是Forwarded

另请参阅