# 代理背后的 Express

在反向代理后面运行 Express 应用程序时,某些 Express API 可能返回与预期不同的值。为了对此进行调整,trust proxy 应用程序设置可用于公开由 Express API 中的反向代理提供的信息。最常见的问题是公开客户端 IP 地址的快速 API 可能会显示反向代理的内部 IP 地址。

配置 trust proxy 设置时,了解反向代理的确切设置非常重要。由于此设置将信任请求中提供的值,因此 Express 中的设置组合与反向代理的操作方式相匹配非常重要。

应用程序设置 trust proxy 可以设置为下表中列出的值之一。

# 布尔值

如果是 true,则客户端的 IP 地址被理解为 X-Forwarded-For 标头中最左边的条目。

如果是false,则应用理解为直接面向客户端,客户端的IP地址来源于req.socket.remoteAddress。这是默认设置。

设置为 true 时,务必确保最后一个受信任的反向代理正在删除/覆盖以下所有 HTTP 标头:X-Forwarded-For、X-Forwarded-Host 和 X-Forwarded-Proto,否则客户端可能提供任何值。

# IP 地址

一个 IP 地址、子网或一组 IP 地址和子网,可作为反向代理信任。以下列表显示了预配置的子网名称:

loopback - 127.0.0.1/8,::1/128
linklocal - 169.254.0.0/16,fe80::/10
uniquelocal - 10.0.0.0/8、172.16.0.0/12、192.168.0.0/16、fc00::/7

您可以通过以下任一方式设置 IP 地址:

app.set('trust proxy', 'loopback') // specify a single subnet
app.set('trust proxy', 'loopback, 123.123.123.123') // specify a subnet and an address
app.set('trust proxy', 'loopback, linklocal, uniquelocal') // specify multiple subnets as CSV
app.set('trust proxy', ['loopback', 'linklocal', 'uniquelocal']) // specify multiple subnets as an array

指定时,IP 地址或子网将被排除在地址确定过程之外,并将离应用服务器最近的不受信任的 IP 地址确定为客户端的 IP 地址。这通过检查 req.socket.remoteAddress 是否受信任来工作。如果是这样,则从右到左检查 X-Forwarded-For 中的每个地址,直到第一个不受信任的地址。

# 数字

使用距离 Express 应用程序最多 n 跳数的地址。req.socket.remoteAddress 是第一跳,其余的在 X-Forwarded-For 标头中从右到左查找。0 的值意味着第一个不受信任的地址将是 req.socket.remoteAddress,即没有反向代理。

使用此设置时,重要的是要确保 Express 应用程序没有多个不同长度的路径,以便客户端可以少于配置的跳数,否则客户端可能会提供任何值.

# 函数

自定义信任实现。

app.set('trust proxy', (ip) => {
  if (ip === '127.0.0.1' || ip === '123.123.123.123') return true // trusted IPs
  else return false
})

启用 trust proxy 将产生以下影响:

  • req.hostname 的值来源于 X-Forwarded-Host 头中设置的值,可以由客户端设置,也可以由代理设置。

  • X-Forwarded-Proto 可以通过反向代理来告诉 apphttps 还是 http,甚至是一个无效的名字。该值由 req.protocol 反映。

  • req.ipreq.ips 值是根据套接字地址和 X-Forwarded-For 标头填充的,从第一个不受信任的地址开始。

trust proxy 设置是使用 proxy-addr 包实现的。有关更多信息,请参阅其文档。

Last Updated: 6/17/2023, 6:57:19 PM