プロキシの背後にある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パッケージを使用して実装されています。詳細については、そのドキュメントを参照してください。