Ich versuche gerade, die IP des angeforderten Benutzers zu erhalten. Das Problem ist, dass die IP ::ffff:127.0.0.1
statt zurückkehrt 127.0.0.1
. Ich habe versucht, die trusted proxy
Option zu verwenden (obwohl ich keinen Proxy verwende) und die req.ips
ist leer. Verwenden von 4.x Express.js.
router.get('/', function(req, res, next) {
console.log('ip', req.ip)
res.send({})
});
req.ip
oderreq.ips
?req.ip
, nurreq.ips
als Test versucht . Ich bin mir nur nicht sicher, was das Präfix verursacht::ffff:
.Dotted-quad notation
.Antworten:
::ffff:
ist ein Subnetzpräfix für IPv4-Adressen (32 Bit), die in einem IPv6-Bereich (128 Bit) platziert sind. IPv6 besteht aus zwei Teilen, dem Subnetzpräfix und dem Schnittstellensuffix. Jedes ist 64 Bit lang oder 4 Gruppen mit 4 Hexadezimalzeichen.In IPv6 können Sie führende Nullen entfernen und dann aufeinanderfolgende Nullen entfernen. Dies bedeutet , dass diese Adresse
::ffff:
tatsächlich0000:0000:ffff:0000
als IPv4-zu-IPv6-Subnetzpräfix bezeichnet wurde, sodass jeder IPv6-Prozessor versteht, dass er mit einer IPv4-Adresse arbeitet, und damit umgehen kann entsprechend.In naher Zukunft werden alle IP-Adressen IPv6 sein. Dies liegt daran, dass wir im IPv4-Adressraum fast keine Zahlen mehr haben (4,2 Milliarden, abzüglich etwas Speicherplatz für verschiedene Zwecke).
Es ist wichtig, IP-Adressen mithilfe des IPv6-Namespace zu adressieren und diese daher
::ffff:
in Ihren Code aufzunehmen, da in Zukunft echte hexadezimale Daten zwischen diesen Doppelpunkten vorhanden sein werden. Wenn Sie es aus ästhetischen Gründen entfernen, wird Ihr Code beschädigt, wenn er zu einem IPv6-Netzwerk wechselt oder mit einer IPv6-Adresse konfrontiert wird.In einigen Netzwerken wird derzeit IPv6 ausgeführt, und Sie werden bald mit IPv6-IP-Adressen konfrontiert. Machen Sie jetzt den Sprung oder riskieren Sie, Ihren Code in Zukunft zu brechen.
Die TL; DR (kurze) Version der Sache lautet: Alles funktioniert gut. Ändern Sie es nicht, es ist die IPv6-Version einer IPv4-Adresse.
Wenn Sie Ihren Code mit IPv6 kompatibel machen möchten, müssen Sie nur nach dem
::ffff:
Präfix suchen. Wenn es vorhanden ist, entfernen Sie es und verarbeiten Sie den Rest als IPv4. Wenn::ffff:
es nicht vorhanden ist, handelt es sich um eine IPv6-Adresse und muss als solche verarbeitet werden. Sie können überprüfen, ob Punkte in der Zeichenfolge enthalten sind. Wenn ja, handelt es sich um IPv4.Denken Sie an alles außer an Anpassungen, die Sie an IP-Adressen vornehmen müssen. Sie zeichnen nur die IP auf, oder? Es wird für den Parser und die Protokollaggregate wichtig sein, dies
::ffff:127.0.0.1
in Zukunft zu erwarten . Wenn Sie eine IP nicht ändern müssen, lassen Sie sie einfach so, wie Sie sie erhalten.quelle
::ffff:
Präfix zu suchen. Sie wissen, ein IPv6 hat viele Notationen.Dies scheint eine Eigenart von IPv6 zu sein: Bei IPv4-Adressen scheint IPv6 die IPv6-Notation mit der IPv4-Notation zu mischen.
Um sowohl IPv4- als auch IPv6-Adressen in der einfachen, nicht gemischten Notation zu erhalten, verwende ich:
quelle
Wenn Sie nur IPv4 benötigen, können Sie den Knotenserver zwingen, IPv4 zu überwachen.
Für eine Express-App bearbeiten
/bin/www
:Veränderung
zu
Das hat zumindest bei mir funktioniert.
https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback
quelle
In Windows 7 ist IPv6 standardmäßig aktiviert. Obwohl mein Server nur IPv4 überwacht, sendet Windows 7 das
::ffff:
Präfix im Rahmen des Übergangs zu IPv6 an IPv4Übergang von IPv4
quelle
Ich hatte Probleme beim Versuch, IPv4-zugeordnete Adressen zu vergleichen, und fand die Bibliothek ipaddr.js hilfreich :-)
z.B
quelle
Versuchen Sie dies, um die genaue IP-Adresse zu erhalten, indem Sie das Subnetz entfernen.
quelle
Sie können Ihre IP-Adresse allein oder mit der angegebenen Familie über Sockets abrufen
quelle
quelle