web-dev-qa-db-fra.com

request.connection.remoteAddress maintenant préfixé dans :: ffff dans node.js

J'ai récemment changé mon routeur pour celui fourni par Google pour Google Fibre (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, je voyais 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. Mon serveur Node écoute-t-il les adresses IPv6?
  3. Est ::ffff:192.168.1.10 en fait une adresse IPv6 ou s'agit-il d'une adresse IPv4?
  4. Est le moyen le plus simple de savoir si une adresse distante est IPv6 pour vérifier si la chaîne contient ::?
  5. Lors du stockage d'adresses IPv4 dans la base de données, j'avais l'habitude d'utiliser quelque chose comme INET_ATON pour les transformer en grands entiers. Dois-je abandonner cela et simplement stocker toutes les adresses distantes sous forme de chaînes pouvant contenir 45 caractères (longueur maximale d'une chaîne d'adresse IPv6)
29
Kirk Ouimet

Mon serveur Node écoute-t-il les adresses IPv6?

Oui. Votre serveur écoute les connexions IPv6 et le IPV6_V6ONLY L'indicateur 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'a pas d'importance dans ce cas - l'important est que les connexions IPv4 soient reçues par un socket écoutant les connexions IPv6.

Est ::ffff:192.168.1.10 en fait une adresse IPv6 ou s'agit-il d'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 adresses IPv6 mappées IPv4 .

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

Une adresse IPv6 ne contient pas nécessairement ::, c'est plutôt une notation courte 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, pour distinguer les adresses IPv6 et IPv4, vous devez simplement rechercher un seul deux-points - :.

Lors du stockage d'adresses IPv4 dans la base de données, j'avais l'habitude d'utiliser quelque chose comme INET_ATON pour les transformer en grands nombres entiers. Dois-je abandonner cela et simplement stocker toutes les adresses distantes sous forme de chaînes pouvant contenir 45 caractères (longueur maximale d'une chaîne d'adresse IPv6)

Une adresse IPv6 est un nombre de 128 bits - même si vous pouvez la stocker sous forme de nombre (par exemple sous la forme de deux nombres BIGINT dans MySQL), on peut se demander si cette approche a vraiment du sens. Le seul scénario auquel je peux penser où vous auriez besoin de travailler avec des nombres est l'évaluation des masques de sous-réseau, pour tout le reste, une chaîne est suffisante et plus facile à gérer.

41
Wladimir Palant

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
}
15
DuBistKomisch