2015-04-02 8 views
57

Ich versuche derzeit, die IP des angeforderten Benutzers zu erhalten. Das Problem ist, dass die IP ::ffff:127.0.0.1 anstelle von 127.0.0.1 zurückgibt. Ich versuchte mit trusted proxy Option (obwohl kein Proxy verwenden) und req.ips ist leer. 4.x Express.js verwendenExpress.js req.ip gibt zurück :: ffff: 127.0.0.1

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

Also, was verwenden Sie 'req.ip' oder' req.ips'? –

+0

'req.ip', gerade versucht' req.ips' als Test. Ich bin mir nur nicht sicher, was das Präfix ':: ffff:' verursacht. – rockerBOO

+0

http://stackoverflow.com/q/5861107/1700321, http://en.wikipedia.org/wiki/IPv6_address#Presentation 'Punktierte-Quad-Notation'. –

Antwort

82

::ffff: ist ein Subnetzpräfix vergleichen für IPv4-Adressen (32 Bit), die in einem IPv6-Bereich (128 Bit) platziert sind. IPv6 besteht aus zwei Teilen, dem Subnetz-Präfix und dem Interface-Suffix. Jeder ist 64 Bits lang oder 4 Gruppen von 4 hexadezimalen Zeichen.

In IPv6 werden Sie erlauben führende Nullen zu entfernen, und dann aufeinanderfolgende Nullen entfernen, was bedeutet, ::ffff: übersetzt tatsächlich zu 0000:0000:ffff:0000, diese Adresse wurde als IPv4 zu IPv6-Subnetz-Präfix bezeichnet wird, so wird jeder IPv6-Prozessor verstehen, dass es funktioniert mit eine IPv4-Adresse und behandeln Sie es entsprechend.

In naher Zukunft werden IP-Adressen alle IPv6 sein, weil wir im IPv4-Adressraum fast keine Nummern mehr haben (4,2 Milliarden, minus Platz für verschiedene Zwecke).

IPv6 ermöglicht einen viel größeren Platz. "340 Unzenmillionen sollten genug für jeden sein" - Bill Gates spricht über IPv6.

Es ist wichtig, IP-Adressen zu starten Adressierung des IPv6-Namespace verwenden und daher gehört die ::ffff: in Ihrem Code, da in der Zukunft wird es zwischen diesen Doppelpunkten realen hexadezimalen Daten sein. Wenn Sie es aus ästhetischen Gründen entfernen, wird Ihr Code beim Wechsel in ein IPv6-Netzwerk oder bei einer IPv6-Adresse unterbrochen.

In einigen Netzwerken wird derzeit IPv6 ausgeführt, und Sie werden bald mit IPv6-IP-Adressen konfrontiert sein. Machen Sie jetzt den Sprung oder riskieren Sie Ihren Code in Zukunft zu brechen.

Die TL, DR (kurz) Version der Sache ist: Alles funktioniert gut. Ändern Sie es nicht, es ist die IPv6-Version einer IPv4-Adresse.

IPv6 IPv4

Wenn Sie Ihren Code kompatibel mit IPv6 zu machen, alles, was Sie tun müssen, ist für das Präfix ::ffff: überprüfen ...Wenn es existiert, entferne es und verarbeite den Rest als IPv4 ... wenn nicht existiert, ist es eine IPv6-Adresse und muss als solche verarbeitet werden. Sie können überprüfen, ob Punkte in der Zeichenfolge enthalten sind. Wenn dies der Fall ist, handelt es sich um IPv4.

Denken Sie an alles außer Anpassungen, die Sie an IP-Adressen vornehmen müssen, Sie nehmen gerade die IP auf, richtig? Es wird wichtig sein, Aggregate zu parsen und zu protokollieren, um in Zukunft ::ffff:127.0.01 und solche zu erwarten. Wenn Sie eine IP nicht ändern müssen, lassen Sie sie einfach als das, was Sie erhalten.

9

In Windows 7 ist IPv6 standardmäßig aktiviert. Auch wenn mein Server auf IPv4 hört nur, Windows 7 sendet den ::ffff: Präfix zu dem IPv4 als Teil des Übergangs zu IPv6

::ffff:0:0:0/96 - Präfix verwendete für IPv4-übersetzte Adressen, die von der Stateless IP/ICMP verwendet werden Übersetzung (SIIT) -Protokoll.

Transition from IPv4

8

Ich hatte Probleme mit dem Versuch IPv4- Adressen abgebildet, und fand die ipaddr.js Bibliothek hilfreich :-)

zB

_.isEqual(ipaddr.process('::ffff:127.0.0.1'), ipaddr.process('127.0.0.1')) === true 
10

Dies scheint eine Eigenart von ipv6 zu sein: Für IPv4-Adressen scheint ipv6 die ipv6-Notation mit der ipv4-Notation zu mischen.

Um IPv4- und IPv6-Adressen in der einfachen, ungemischt Notation zu bekommen, ich bin mit:

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress; 
if (ip.substr(0, 7) == "::ffff:") { 
    ip = ip.substr(7) 
} 
0

Sie können Ihre IP-Adresse allein oder mit der angegebenen Familie Get über Sockets

 var app = require('express')(); 

app.get("/ip", (req, res) => { 
     console.log(req.ip) 
     let ip = req.ip.split(':'); 
     let ip_details = req.socket.address(); 
      console.log(ip_details);      
    // { address: '::ffff:127.0.0.1', family: 'IPv6', port: 3001 

      console.log(ip[3]);//127.0.0.1 
          res.json(ip[3]); 
     } 
Verwandte Themen