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