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 galactikboulay . Évalué à 4.
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 Bernez . Évalué à 2.
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 galactikboulay . Évalué à 2.
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.