在代理伺服器後方表達
在反向代理伺服器後方執行 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 位址和子網路陣列。下列清單顯示預先設定的子網路名稱
- 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
})
|
啟用 信任代理
會有以下影響
-
req.hostname
的值來自 X-Forwarded-Host
標頭中設定的值,而這項值可以由客戶端或代理設定。
-
X-Forwarded-Proto
可以由反向代理設定,以告知應用程式它是 https
或 http
,甚至是非法名稱。此值會反映在 req.protocol
中。
-
req.ip
和 req.ips
的值會根據 socket 位址和 X-Forwarded-For
標頭填入,從第一個不受信任的位址開始。
信任代理
設定是使用 proxy-addr
套件實作的。如需更多資訊,請參閱其文件。