Forum Linux.général netstat et IPv6

Posté par  .
Étiquettes : aucune
0
10
jan.
2005
Salut

Quand un serveur écoute à la fois en IPv4 et IPv6, netstat a la fâcheuse habitude de ne montrer que l'IPv6 presque toujours. Connaîtriez-vous une meilleure commande que netstat pour lister les sockets du système? (lsof -i a le même problème).
Ou bien sauriez-vous d'où vient le problème? J'ai mailé le programmeur de netstat, qui a accusé le kernel sans me donner plus de précisions. Vu qu'il y a quand même des applis dont les sockets sont correctement listées, il y a forcément moyen de s'en sortir.
  • # C'est "normal"...

    Posté par  . Évalué à 4.

    En fait, sur un système comme Linux, les sockets sont capables de gérer IPv4 et IPv6 simultanément... Ce qu'il se passe, c'est que quand une adresse IPv4 est utilisée avec ce genre de socket, elle est "mappée" en adresse IPv6.

    Par exemple, si tu as un serveur SSH (tournant sur le port 22/tcp), tu auras comme info au niveau de netstat:

    tcp6 0 0 :::22 :::* LISTEN

    Ce socket sera capable d'accepter des connexions IPv4 ou IPv6. Quand il s'agit d'une connexion IPv6, tu auras une ligne du style:

    tcp6 0 0 ::ffff:10.2.2.2:22 ::ffff:172.16.155:39464 ESTABLISHED

    Le "::ffff:" indique que c'est une adresse v4 mappée (jamais visible sur le réseau, uniquement au niveau applicatif).
    • [^] # Re: C'est "normal"...

      Posté par  . Évalué à 2.

      Merci pour ces éclaircissements. Je commence à comprendre ce qui se passe. Ayant des noms de domaines différents pour mes enregistrements A et AAAA, je n'avais pas beaucoup fait de tests avec netstat -n. De plus j'avais entendu parlé des addresses mappées mais je croyais que c'était utilisé uniquement pour NAT-PT.
      Si j'ai bien compris, les serveurs en question n'écoutent que sur une seule socket, qui est en IPv6, et, quand une requête IPv4 arrive, le kernel encapsule l'IPv4 dans IPv6 (via le mappage à base de "ffff") et la présente à l'appli serveur. L'appli serveur répond en IPv4 à cette requête car il a vu qu'il s'agissait d'une addresse mappée. Et si Exim est listé dans les 2 piles par netstat, c'est parce qu'il utilise 2 sockets, une en IPv4 et une en IPv6. J'ai bon?
      Cela dit, le kernel sait quand il doit mapper des addresses IPv4 donc il doit y avoir moyen de l'interroger pour avoir ce renseignement, non?
      • [^] # Re: C'est "normal"...

        Posté par  . Évalué à 2.

        Je n'ai pas été voir les détails d'implémentation, mais je suppose qu'il y a une table des connexions TCP utilisant des adresses IPv6 dans le noyau. Chaque entrée dans la table contiendrait l'adresse source et l'adresse de destination.
        Au niveau réseau, quand le kernel aurait à envoyer des paquets TCP, il construirait au niveau 3 des paquets IPv4 si l'adresse IPv6 correspond à une adresse IPv4 mappée, sinon des paquets IPv6.
        Je spécule sur le fonctionnement du noyau mais ça doit être plus ou moins ça. Je regarderai les détails si ça t'intéresse.

        Sur les systèmes *BSD, il semble que les sockets gèrent soit v4 soit v6 mais pas les 2 en même temps. Exemple sur mon FreeBSD 5.3:

        tcp4 0 0 *.22 *.* LISTEN
        tcp6 0 0 *.22 *.* LISTEN

        Pour avoir un comportement similaire sous Linux, je pense qu'il faut faire la séquence socket() / bind() / accept() sur un socket ne gérant que le v4, puis après refaire la même chose avec du v6. La 2ème socket ne pourrait pas "binder" sur les adresses v4 comme c'est le cas habituellement vu que la 1ère socket a déjà pris la main. C'est ce que doit faire Exim je pense.

        Pour ce que sort netstat, à mon avis il va lire ce qu'il y a dans /proc/net (fichiers tcp, tcp6, etc) et c'est tout. Je dirais qu'a priori, si tu as une socket "de type v6" sous Linux, elle est capable de recevoir en v4 et en v6, sauf si il y a eu une socket v4-only de créée explicitement avant.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.