Adresse IP vers nom
Le
Olivier Miakinen

[diapublication, avec suivi vers fr.comp.reseaux.ip seul]
Bonjour,
Pour remplacer un gethostbyaddr en C, je voudrais savoir si les deux
méthodes suivantes sont équivalentes, et sinon quelle différence
il y a entre les deux :
1) faire un getaddrinfo suivi d'un getnameinfo du premier résultat ;
2) faire un getaddrinfo avec AI_CANONNAME et récupérer le ai_canonname.
Cordialement,
--
Olivier Miakinen
Bonjour,
Pour remplacer un gethostbyaddr en C, je voudrais savoir si les deux
méthodes suivantes sont équivalentes, et sinon quelle différence
il y a entre les deux :
1) faire un getaddrinfo suivi d'un getnameinfo du premier résultat ;
2) faire un getaddrinfo avec AI_CANONNAME et récupérer le ai_canonname.
Cordialement,
--
Olivier Miakinen
Bonjour,
getnameinfo() permet (entre autres) de récupérer un enregistremen t PTR
relatif à une adresse. L'équivalent de gethostbyaddr(), en d'autr es
mots.
AI_CANONNAME permet d'avoir, en plus de l'adresse, le nom exact sous
lequel le résolveur a trouvé l'adresse, c'est à dire aprà ¨s éventuel
ajout d'un suffixe DNS et processing d'alias.
Je pense qu'on peut formuler ça de manière plus claire et plus pr écise,
mais ça s'illustre bien comme ça :
~$ # ajout d'un suffixe DNS
~$ ./gani www
getaddrinfo + AI_CANONNAME: www.wxcvbn.org
getnameinfo: coloc.wxcvbn.org
~$ # processing d'un alias (CNAME)
~$ ./gani www.kame.net
getaddrinfo + AI_CANONNAME: orange.kame.net
getnameinfo: orange.kame.net
~$
C'est traité dans la RFC 2553.
HTH
--
Jérémie Courrèges-Anglas
Empreinte GPG : 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494
[...]
3493, plutôt.
De plus, on me dit dans l'oreillette que ce module[1] Perl vient avec
deux scripts, getaddrinfo et getnameinfo.
Bonne journée,
--
Jérémie Courrèges-Anglas
Empreinte GPG : 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494
Le 24/01/2013 07:11, Jérémie Courrèges-Anglas a écrit :
Oui.
C'est là que je m'aperçois que j'avais oublié un détail important dans
ma question : je ne m'intéresse qu'au cas où la requête porte sur une
adresse IP (v4 ou v6) et pas sur un nom DNS. Est-ce que dans ce cas
le getnameinfo pourrait retourner un nom sans suffixe DNS, ou un alias,
au lieu de l'adresse canonique ?
J'avoue que je n'ai pas pensé à lire les RFC ; je me suis contenté
des pages man trouvées un peu partout, et de la page suivante :
Merci pour le pointeur vers la RFC 3493, je vais regarder ça dès que
je serai arrivé au boulot.
Cordialement,
--
Olivier Miakinen
http://search.cpan.org/~pevans/Socket-GetAddrInfo-0.22/lib/Socket/GetAddrInfo.pm
:)
--
DW
Je l'ai lue.
Non seulement je n'y ai pas trouvé la réponse à ma question, mais
cela m'a fait me poser deux autres questions. Bon, il y en a une
pour laquelle je pense avoir trouvé la réponse.
====================================================================== 1)
The ai_flags field to which hints parameter points shall be set to
zero or be the bitwise-inclusive OR of one or more of the values
AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST, AI_NUMERICSERV,
AI_V4MAPPED, AI_ALL, and AI_ADDRCONFIG.
</>
Je viens de regarder les fichiers netdb.h de plusieurs Linux et
plusieurs SunOS (je n'arrive pas à me connecter sur les AIX en ce
moment), et tous ont AI_NUMERICHOST mais pas AI_NUMERICSERV.
Je ne comprenais pas pourquoi jusqu'à ce que je voie que ce n'était
pas prévu dans la RFC 2553, et que les OS des machines en question
sont assez vieux.
====================================================================== 2)
If hints is a null pointer, the behavior
shall be as if it referred to a structure containing the value zero
for the ai_flags, ai_socktype and ai_protocol fields, and AF_UNSPEC
for the ai_family field.
</>
If the third argument to
getaddrinfo() is a NULL pointer, this is the same as if the caller
had filled in an addrinfo structure initialized to zero with
ai_family set to PF_UNSPEC.
</>
Ceci est en contradiction avec la page de man suivante :
Spécifier hints à NULL est équivalent à définir ai_socktype et
ai_protocol à 0, ai_family à AF_UNSPEC et ai_flags à (AI_V4MAPPED |
AI_ADDRCONFIG).
</>
C'est aussi un problème de version ?
======================================================================
Cordialement,
--
Olivier Miakinen
[...]
[...]
Il peut retourner à peu près tout ce qui est une valeur acceptabl e pour
un enregistrement PTR, une entrée de table hosts, etc. Exemple (g4 est
une machine sur mon lan).
~$ # avant modifs
~$ ./gani g4
getaddrinfo + AI_CANONNAME: g4.wxcvbn.org
getnameinfo: g4.wxcvbn.org
~$ # bidouillage du /etc/hosts
~$ ./gani g4
getaddrinfo + AI_CANONNAME: foo
getnameinfo: foo
~$ # bidouillage du PTR
~$ ./gani g4
getaddrinfo + AI_CANONNAME: g4.wxcvbn.org
getnameinfo: bar
~$
La plupart du temps, quand une application vérifie le nom d'un client,
elle récupère le reverse avec getnameinfo() puis fait une requà ªte sur ce
reverse avec getaddrinfo(), et regarde si l'adresse obtenue est la mêm e.
C'est simplifié, car un système peut avoir plusieurs adresses et une
adresse peut avoir plusieurs enregistrements PTR.
--
Jérémie Courrèges-Anglas
Empreinte GPG : 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494
Effectivement, AI_CANONNAME est expliqué de manière assez brà ¨ve.
Intéressant.
Je dirais plutôt un choix d'implémentation de la part des dé veloppeurs
de la glibc. AI_ADDRCONFIG (par défaut) a sans doute du sens, par cont re
les adresses v6 mappées font un peu moins consensus[1] et cette valeur
par défaut (AI_V4MAPPED) n'a pas de sens[2].
Perso j'aime utiliser mes propres hints même pour des petites applis,
entre autres pour supporter des options telles que -4 ou -6 (choix de la
famille d'adresse).
[1] http://tools.ietf.org/html/draft-itojun-v6ops-v4mapped-harmful
[2] http://sourceware.org/bugzilla/show_bug.cgi?id415
--
Jérémie Courrèges-Anglas
Empreinte GPG : 61DB D9A0 00A4 67CF 2A90 8961 6191 8FBF 06A1 1494
Bon, ma question n'a plus lieu d'être puisque, au moins sur Linux,
je constate que getaddrinfo(adresse IP, AI_CANONNAME) me retourne
l'adresse IP et pas un nom canonique. Je n'ai donc pas le choix,
je fais un getaddrinfo suivi de getnameinfo. Et tant que j'y suis
j'ai rajouté un AI_NUMERICHOST au getaddrinfo puisque l'adresse
est numérique, ça ne mange pas de pain.
En l'occurrence, ces deux tests retournaient la même valeur.
Mais là, effectivement, c'est différent.
Oui, ok. Je ne suis pas sûr d'avoir ce besoin, mais cela pourrait
arriver (j'ai un certain nombre de programmes à migrer ou faire
migrer vers la nouvelle interface).
À ce propos, existe-t-il avec la nouvelle interface un moyen de
récupérer la liste de tous les alias, comme avec le h_aliases
de l'ancienne structure hostent ? Il me semble que c'est devenu
impossible, n'est-ce pas ?
Cordialement,
--
Olivier Miakinen
Pour le moment j'ai défini mes propres hints dans tout ce que j'ai
fait, et je vais le recommander aux autres aussi.
Deux liens très intéressants, un grand merci pour cela.
Cordialement,
--
Olivier Miakinen
Je n'avais fait que survoler le premier lien avant de répondre.
Je viens maintenant de le lire plus attentivement, et en réalité
le plus grand problème serait qu'une adresse IPv4-Mapped transite
telle quelle sur le réseau. Certes, ce draft explique que si on
éradique complètement ces adresses, y compris dans l'API de base,
cela diminue le risque qu'elles se baladent sur le réseau. Mais
si on peut les interdire sur le réseau, cela suffit.
Cordialement,
--
Olivier Miakinen