2015-04-02 19 views
57

Attualmente sto cercando di ottenere l'IP dell'utente richiesto. Il problema è che l'IP restituisce ::ffff:127.0.0.1 anziché 127.0.0.1. Ho provato a utilizzare l'opzione trusted proxy (sebbene non utilizzi un proxy) e lo req.ips è vuoto. Utilizzando 4.x Express.js.Express.js req.ip sta restituendo :: ffff: 127.0.0.1

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

Quindi, cosa stai usando 'req.ip' o' req.ips'? –

+0

'req.ip', ho appena provato' req.ips' come test. Non sono sicuro di cosa stia causando il prefisso ':: ffff:'. – rockerBOO

+0

http://stackoverflow.com/q/5861107/1700321, http://en.wikipedia.org/wiki/IPv6_address#Presentation 'Notazione punteggiata quad. –

risposta

82

::ffff: è un prefisso di sottorete per indirizzi IPv4 (32 bit) posizionati all'interno di uno spazio IPv6 (128 bit). IPv6 è suddiviso in due parti, il prefisso subnet e il suffisso dell'interfaccia. Ognuno è lungo 64 bit o 4 gruppi di 4 caratteri esadecimali.

In IPv6, si è permesso di eliminare zeri iniziali, e quindi rimuovere zeri consecutivi, cioè ::ffff: traduce effettivamente 0000:0000:ffff:0000, questo indirizzo è stato designato come IPv4 a IPv6 prefisso di sottorete, quindi qualsiasi processore IPv6 capirà che funzioni con un indirizzo IPv4 e gestirlo di conseguenza.

Nel prossimo futuro, gli indirizzi IP saranno tutti IPv6, questo perché siamo quasi fuori dai numeri (4,2 miliardi, meno un po 'di spazio per scopi diversi) nello spazio degli indirizzi IPv4.

IPv6 consente uno spazio molto più grande. "340 undecillion dovrebbe essere sufficienti per chiunque" - Bill Gates parla su IPv6.

E 'importante cominciare ad affrontare gli indirizzi IP utilizzando lo spazio dei nomi IPv6 e quindi includere il ::ffff: nel codice perché in futuro ci saranno dati reali esadecimali tra questi due punti. Se lo spogliamo per motivi estetici, il tuo codice si interromperà quando passerà a una rete IPv6 o sarà confrontato con un indirizzo IPv6.

Alcune reti eseguono attualmente IPv6 e presto ci si troverà ad affrontare gli indirizzi IP IPv6; fare il salto ora o rischiare di rompere il codice in futuro.

La versione TL; DR (breve) della questione è: tutto funziona correttamente. Non alterarlo, è la versione IPv6 di un indirizzo IPv4.

IPv6 IPv4

Se si vuole rendere il codice compatibile con IPv6, tutto quello che dovete fare è controllare per il prefisso ::ffff: ...se esiste, rimuoverlo ed elaborare il resto come IPv4 ... se ::ffff: non esiste, è un indirizzo IPv6 e deve essere elaborato come tale. È possibile ricontrollare se ci sono periodi nella stringa, in tal caso è IPv4.

Ricorda che per tutto, tranne le regolazioni che devi apportare agli indirizzi IP, stai registrando solo l'IP, giusto? Sarà importante analizzare e registrare gli aggregati per aspettarsi ::ffff:127.0.01 e simili in futuro. A meno che non sia necessario modificare un IP, lascialo come ciò che ricevi.

9

Windows 7 ha IPv6 abilitato per impostazione predefinita. Anche se il mio server in ascolto su IPv4 solo, Windows 7 invia il ::ffff: prefisso al IPv4 come parte della transizione a IPv6

::ffff:0:0:0/96 - Un prefisso utilizzato per gli indirizzi IPv4-tradotte che vengono utilizzati dal Stateless IP/ICMP Translation (SIIT) protocollo.

Transition from IPv4

8

stavo avendo problemi con il tentativo di confrontare IPv4 mappati indirizzi, e abbiamo trovato l'ipaddr.js biblioteca utile :-)

esempio

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

Questo sembra essere un capriccio di ipv6: per gli indirizzi ipv4, ipv6 sembra mixare la notazione ipv6 con la notazione ipv4.

Al fine di ottenere entrambi gli indirizzi IPv4 e IPv6 nel semplice, la notazione non mescolato, sto usando:

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

È possibile ottenere l'indirizzo IP da solo o con la famiglia specificata utilizzando prese

 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]); 
     } 
Problemi correlati