1. ホーム
  2. node.js

[解決済み] Express.js の req.ip が ::ffff:127.0.0.1 を返している。

2022-07-08 06:06:16

質問

私は現在、要求されたユーザーのIPを取得しようとしています。問題は、IPが ::ffff:127.0.0.1 ではなく 127.0.0.1 . 試しに trusted proxy オプション (プロキシは使っていませんが) と req.ips は空白です。4.x Express.jsを使用しています。

router.get('/', function(req, res, next) {
    console.log('ip', req.ip)
    res.send({})
});

どのように解決するのですか?

::ffff: は、IPv6(128ビット)空間内に配置されるIPv4(32ビット)アドレス用のサブネットプレフィックスです。 IPv6 は、サブネット プレフィックスとインターフェイス サフィックスの 2 つの部分に分かれています。 それぞれは64ビット長、つまり4つの16進数文字のグループです。

IPv6 では、先頭のゼロを削除し、さらに連続したゼロを削除することができます。 ::ffff: は実際には次のように変換されます。 0000:0000:ffff:0000 このアドレスはIPv4からIPv6へのサブネットプレフィックスとして指定されているため、どのIPv6プロセッサもIPv4アドレスで動作していると理解し、それに応じて処理します。

近い将来、IP アドレスはすべて IPv6 になるでしょう。これは、IPv4 アドレス空間の数 (42 億から雑多な目的のためのスペースを引いた数) がほぼなくなったからです。

<ブロッククオート

IPv6では、より大きなスペースを確保することができます。 ビル・ゲイツが IPv6 について講演しています。

IPv6の名前空間を使用してIPアドレスのアドレッシングを開始することが重要であり、そのため、IPv6の名前空間内に ::ffff: を含めることが重要です。なぜなら、将来的にはコロンの間に本当の 16 進数のデータが含まれるようになるからです。 美的な理由からこれを削除すると、IPv6 ネットワークに切り替えたとき、または IPv6 アドレスに直面したときに、コードが壊れてしまいます。

いくつかのネットワークは現在 IPv6 を実行しており、まもなく IPv6 IP アドレスに直面するでしょう。今すぐ移行するか、将来的にコードを破壊するリスクを負ってください。

現在 IPv6 を実行しているネットワークもあります。

この問題の TL;DR(ショート)バージョンは、次のとおりです。すべてがうまくいっています。 変更しないでください。これは IPv4 アドレスの IPv6 バージョンです。

IPv6 と互換性のあるコードにしたい場合、あなたがしなければならないのは、そのコードが ::ffff: プレフィックスがあればそれを取り除き、残りをIPv4として処理します。 ::ffff: が存在しない場合、それはIPv6アドレスであり、そのように処理される必要があります。 文字列にピリオドがあるかどうかを確認することでダブルチェックすることができます。

IPアドレスに必要な調整以外のすべてにおいて、IPを記録しているだけであることに留意してください。 パーサーとログ アグリゲートにとって重要なのは、IP アドレスに対応するために ::ffff:127.0.0.1 などが将来的に重要になります。 IPを変更する必要がない限りは、受け取ったままの状態にしておけばいい。