代理后面表达
在反向代理后面运行 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-For 、X-Forwarded-Host 和 X-Forwarded-Proto ,否则客户端可能提供任何值。
|
IP 地址 |
IP 地址、子网或要信任为反向代理的 IP 地址和子网数组。以下列表显示预配置的子网名称
- 环回 -
127.0.0.1/8 、::1/128
- 链路本地 -
169.254.0.0/16 、fe80::/10
- 唯一本地 -
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
可以由反向代理设置,以告诉应用程序它是 https
还是 http
,甚至是一个无效的名称。此值由 req.protocol 反映。
-
req.ip 和 req.ips 值基于套接字地址和 X-Forwarded-For
标头填充,从第一个不受信任的地址开始。
trust proxy
设置使用 proxy-addr 包实现。有关更多信息,请参阅其文档。