web-dev-qa-db-fra.com

Express.js req.ip retourne :: ffff: 127.0.0.1

J'essaie actuellement d'obtenir l'adresse IP de l'utilisateur demandé. Le problème est que l'IP renvoie ::ffff:127.0.0.1 au lieu de 127.0.0.1. J'ai essayé d'utiliser l'option trusted proxy (sans utiliser de proxy) et le req.ips est vide. Utilisation de 4.x Express.js.

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

::ffff: est un préfixe de sous-réseau pour les adresses IPv4 (32 bits) placées dans un espace IPv6 (128 bits). IPv6 est divisé en deux parties, le préfixe de sous-réseau et le suffixe d'interface. Chacune a une longueur de 64 bits ou 4 groupes de 4 caractères hexadécimaux.

Dans IPv6, vous êtes autorisé à supprimer les zéros non significatifs, puis les zéros consécutifs, ce qui signifie que ::ffff: correspond en réalité à 0000:0000:ffff:0000, cette adresse a été désignée comme le préfixe de sous-réseau IPv4 à IPv6. gérer en conséquence.

Dans un avenir proche, toutes les adresses IP seront IPv6, car nous sommes presque à court de chiffres (4,2 milliards, moins de la place pour un but divers) dans l’espace adresse IPv4.

IPv6 permet un espace beaucoup plus grand. "340 indecions pourraient être Assez pour tout le monde" - Bill Gates s'exprimant sur IPv6.

Il est important de commencer à adresser les adresses IP à l'aide de l'espace de noms IPv6 et d'inclure par conséquent le ::ffff: dans votre code, car il y aura à l'avenir des données hexadécimales réelles entre ces deux points. Si vous le supprimez pour des raisons esthétiques, votre code se cassera s'il bascule vers un réseau IPv6 ou lorsqu'il est confronté à une adresse IPv6.

Certains réseaux utilisent actuellement IPv6 et vous serez bientôt confrontés aux adresses IP IPv6. faites le saut maintenant ou risquez de casser votre code dans le futur.

La version TL; DR (courte) de la question est la suivante: tout fonctionne bien. Ne le modifiez pas, c'est la version IPv6 d'une adresse IPv4.

 IPv6  IPv4

Si vous voulez rendre votre code compatible avec IPv6, il vous suffit de vérifier le préfixe ::ffff: ... s'il existe, de le supprimer et de traiter le reste en tant qu'IPv4 ... si ::ffff: n'existe pas, il s'agit d'un IPv6. adresse et doit être traité en tant que tel .. Vous pouvez vérifier si les points sont dans la chaîne, le cas échéant, il s’agit du protocole IPv4.

N'oubliez pas que pour tout, à l'exception des ajustements que vous devez apporter aux adresses IP, vous ne faites qu'enregistrer l'adresse IP, n'est-ce pas? Il va être important que l'analyseur et le journal des agrégats s'attendent à ::ffff:127.0.0.1 et autres à l'avenir. À moins que vous ne deviez modifier une adresse IP, laissez-la simplement comme ce que vous recevez.

122
Nick Steele

Cela semble être une bizarrerie de ipv6: pour les adresses ipv4, ipv6 semble mélanger la notation ipv6 avec la notation ipv4.

Pour obtenir à la fois les adresses ipv4 et ipv6 en notation simple et sans mélange, j'utilise:

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

IPv6 est activé par défaut sur Windows 7. Même si mon serveur n'écoute que sur IPv4, Windows 7 envoie le préfixe ::ffff: à IPv4 dans le cadre de la transition vers IPv6.

::ffff:0:0:0/96 - Préfixe utilisé pour les adresses traduites IPv4 utilisées par le protocole de traduction sans état IP/ICMP (SIIT).

Transition d'IPv4

9
rockerBOO

J'avais des problèmes en essayant de comparer les adresses mappées ipv4, et j'ai trouvé le ipaddr.js library utile :-)

par exemple

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

Si vous avez juste besoin d'IPv4, vous pouvez forcer le serveur de noeud à écouter à l'aide d'IPv4.

Pour une application express, éditez /bin/www:

changement

server.listen(port);

à

server.listen(port, '0.0.0.0');

Cela a fonctionné pour moi au moins. 

https://nodejs.org/api/net.html#net_server_listen_port_Host_backlog_callback

2
Your Friend Ken

Essayez ceci pour obtenir l’adresse IP exacte en supprimant le sous-réseau,

let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
ip = ip.replace('::ffff:', '');
0
MAREESKANNNAN R
var ip = req.ip.split(':').pop();
0
Mateo Marin