X-Forwarded-For 头

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

此头的一个标准化版本是 HTTP Forwarded 头,尽管其使用频率要低得多。

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

头类型 请求头
禁止请求头

语法

http
X-Forwarded-For: <client>, <proxy>
X-Forwarded-For: <client>, <proxy>, …, <proxyN>

例如,第一个头中的 IPv6 客户端 IP,第二个头中的 IPv4 客户端 IP,以及第三个示例中的 IPv4 客户端 IP 和 IPv6 代理 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

指令

<client>

客户端 IP 地址。

<proxy>

代理 IP 地址。如果请求通过多个代理,则会列出每个连续代理的 IP 地址。这意味着最右侧的 IP 地址是最新的代理的 IP 地址,最左侧的 IP 地址是原始客户端的地址(假设客户端和代理行为良好)。

描述

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

有关使用 X-Forwarded-For 的详细指南,请参阅解析选择 IP 地址部分。

安全和隐私问题

此头按设计会暴露隐私敏感信息,例如客户端的 IP 地址。因此,在使用此头时必须牢记用户的隐私。

如果您知道请求链中的所有代理都是可信的(即您控制它们)并且配置正确,则您的代理添加的头部分可以被信任。如果任何代理是恶意的或配置错误,则非可信代理添加的头中任何部分都可能被欺骗,或者可能具有意外的格式或内容。如果服务器可以直接从互联网连接——即使它也位于可信的反向代理之后——则 X-Forwarded-For IP 列表的任何部分都不能被视为可信或安全用于安全相关用途。

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

最左侧(不可信)的值只能用于使用欺骗值不会产生负面影响的情况。

解析

不当解析 X-Forwarded-For 头可能会产生负面安全影响,其后果如上一节所述。因此,在解析头值时应考虑以下几点。

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

  • 用逗号连接 X-Forwarded-For 的完整头值,然后按逗号分割成一个列表,或者
  • 将每个 X-Forwarded-For 头按逗号分割成列表,然后连接这些列表。

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

一些反向代理会自动将多个 X-Forwarded-For 头合并为一个,但更安全的是不要假设总是如此。

选择 IP 地址

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

选择最接近客户端的 X-Forwarded-For IP 地址(不可信且用于安全相关目的)时,应选择从最左侧开始的第一个有效地址非私有/内部的 IP。

注意:我们上面说“有效地址”,因为欺骗值可能不是实际的 IP 地址。此外,我们说“非内部/私有”,因为客户端可能在其内部网络上使用了代理,这可能添加了来自私有 IP 空间的地址。

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

可信代理计数

配置互联网和服务器之间的反向代理数量。X-Forwarded-For IP 列表从最右侧开始,按该计数减一进行搜索。例如,如果只有一个反向代理,该代理将添加客户端的 IP 地址,因此应使用最右侧的地址。如果有三个反向代理,则最后两个 IP 地址将是内部地址。

可信代理列表

配置可信反向代理的 IP 或 IP 范围。X-Forwarded-For IP 列表从最右侧开始搜索,跳过所有位于可信代理列表中的地址。第一个不匹配的地址是目标地址。

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

示例

客户端和代理 IP

从以下 X-Forwarded-For 请求头中,我们可以推断客户端 IP 地址是 203.0.113.195,并且请求已通过两个代理。第一个代理的 IPv6 地址是 2001:db8:85a3:8d3:1319:8a2e:370:7348,请求链中最后一个代理的 IPv4 地址是 198.51.100.178

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

规范

不属于任何当前规范。此头的标准化版本是Forwarded

另见