代理后的 Express

当在反向代理后运行 Express 应用时,一些 Express API 可能会返回与预期不同的值。为了解决这个问题,可以使用 trust proxy 应用设置来在 Express API 中暴露由反向代理提供的信息。最常见的问题是,暴露客户端 IP 地址的 Express API 可能会显示反向代理的内部 IP 地址。

配置 trust proxy 设置时,务必了解反向代理的具体设置。由于此设置会信任请求中提供的值,因此 Express 中的设置组合必须与反向代理的运行方式相匹配。

应用设置 trust proxy 可以设置为下表中的某个值。

类型
布尔值

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

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

当设置为 true 时,务必确保最后一个受信任的反向代理会移除/覆盖所有以下 HTTP 头部:X-Forwarded-ForX-Forwarded-HostX-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 将产生以下影响

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

编辑此页面