このページを翻訳

プロキシの背後にあるエクスプレス

リバースプロキシの背後で Express アプリケーションを実行する場合、Express API の中には予想以外の値が返されるものがあります。 これを調整するために trust proxy アプリケーションの設定は、Express API のリバースプロキシによって提供された情報を公開するために使用することができます。 最も一般的な問題は、クライアントのIPアドレスを公開するAPIで、リバースプロキシの内部IPアドレスが表示される可能性があります。

trust proxy の設定では、 リバースプロキシの正確な設定を理解することが重要です。 この設定はリクエストで提供された値を信頼するためです Express での設定の組み合わせが リバースプロキシの動作と一致することが重要です。

trust proxyを設定するアプリケーションは、次の表に示されている値のいずれかを設定することができます。

Boolean

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/16, fe80::/10
  • uniqueloc - 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アプリケーションから離れたホップの最大数のアドレスを使用してください。 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 はリバースプロキシによって設定することで、アプリが httpshttp` か無効な名前かをアプリに伝えることができます。 この値は req.protocol で反映されます。

  • req.ipreq.ips の値は、 ソケットアドレスと X-Forwarded-For ヘッダーに基づいて入力されます。 最初の信頼されていないアドレスから始めます

trust proxy は、 proxy-addr パッケージを使用して実装されています。 詳細については、そのドキュメントを参照してください。