プロキシの背後にある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-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
は、リバースプロキシによって設定され、アプリにhttps
かhttp
か、または無効な名前であるかを伝えることができます。この値はreq.protocolに反映されます。
-
req.ipとreq.ipsの値は、ソケットアドレスとX-Forwarded-For
ヘッダーに基づいて、最初の信頼されていないアドレスから開始して設定されます。
trust proxy
設定は、proxy-addrパッケージを使用して実装されています。詳細については、そのドキュメントを参照してください。