Request.connection.remoteAddress Now Prefixed in :: ffff dans node.js

J'ai récemment changé mon routeur sur un fourni par Google pour Google Fiber (yay!) Et maintenant je remarque un changement dans ce que je vois lorsque j'inspecte request.connection.remoteAddress pendant que je développe sur mon serveur local. Avant, j'avais l'habitude de voir ceci:

request.connection.remoteAddress; // 192.168.1.10 

Maintenant, je vois ceci:

 request.connection.remoteAddress; // ::ffff:192.168.1.10 
  1. Quelqu'un peut-il expliquer ce qui se passe?
  2. Est-ce que mon serveur Node a écouté les adresses IPv6?
  3. Is ::ffff:192.168.1.10 fait une adresse IPv6 ou est-ce une adresse IPv4?
  4. Le moyen le plus simple de savoir si une adresse à distance est IPv6 pour vérifier si la chaîne contient :: ?
  5. Lors du stockage des adresses IPv4 dans la base de données, j'utilise quelque chose comme INET_ATON pour les transformer en nombres entiers volumineux. Devrais-je l'abandonner et stocker toutes les adresses distantes comme des chaînes qui peuvent comporter 45 caractères (longueur maximale d'une chaîne d'adresse IPv6)

    Est-ce que mon serveur Node a écouté les adresses IPv6?

    Oui. Votre serveur écoute les connexions IPv6 et l'indicateur IPV6_V6ONLY n'est pas défini avec le résultat que les connexions IPv4 sont traitées par le même socket. Vous pouvez en lire plus sur ce drapeau dans cette question .

    Que les connexions IPv6 soient possibles (peuvent être acheminées vers votre serveur) n'est pas pertinente dans ce cas-là, il est important que les connexions IPv4 soient reçues par une socket qui écoute les connexions IPv6.

    Is ::ffff:192.168.1.10 fait une adresse IPv6 ou est-ce une adresse IPv4?

    Tous les deux. Les adresses IPv6 peuvent intégrer des adresses IPv4 – et c'est l'une de ces adresses intégrées. Voir les adresses IPv6 mappées IPv4 .

    Le moyen le plus simple de savoir si une adresse à distance est IPv6 pour vérifier si la chaîne contient :: ?

    Une adresse IPv6 ne contient pas nécessairement :: , c'est plutôt une petite notation indiquant un certain nombre de zéros. ::ffff:192.168.1.10 est équivalent à 0:0:0:0:0:ffff:192.168.1.10 ou 0:0:0:0:0:ffff:c0a8:010a (voir présentation de l'adresse IPv6 ). Donc, afin de distinguer les adresses IPv6 et IPv4, vous devriez simplement vérifier un seul colon -:.

    Lors du stockage des adresses IPv4 dans la base de données, j'utilise quelque chose comme INET_ATON pour les transformer en nombres entiers volumineux. Devrais-je l'abandonner et stocker toutes les adresses distantes comme des chaînes qui peuvent comporter 45 caractères (longueur maximale d'une chaîne d'adresse IPv6)

    Une adresse IPv6 est un numéro de 128 bits – même si vous pouvez le stocker en tant que nombre (par exemple, en tant que deux nombres BIGINT dans MySQL), il est douteux que cette approche ait vraiment un sens. Le seul scénario que je peux imaginer où vous devriez travailler avec des nombres est l'évaluation de masques de sous-réseau, car tout le reste est une chaîne suffisante et plus facile à manipuler.

    Re: # 4, une bibliothèque comme ipaddr.js fonctionne bien, par exemple:

     var ipString = request.connection.remoteAddress; if (ipaddr.IPv4.isValid(ipString)) { // ipString is IPv4 } else if (ipaddr.IPv6.isValid(ipString)) { var ip = ipaddr.IPv6.parse(ipString); if (ip.isIPv4MappedAddress()) { // ip.toIPv4Address().toString() is IPv4 } else { // ipString is IPv6 } } else { // ipString is invalid }