Utilisation des enregistrements de services du DNS
Par Clochix le vendredi 4 septembre 2009, 13:01 - les petits tutos à toto - Lien permanent
Brève introduction sur une fonctionnalité encore peu utilisée des serveurs DNS, les enregistrements de services, et bribes de réflexion sur une possible extension.
Désolé pour ce billet très incohérent, qui a dérivé de deux lignes de code pour récupérer le nom de la machine à contacter pour se connecter à un serveur Jabber à des réflexions un peu plus générales.
Au commencement était le DNS qui permettait de faire le lien entre un nom de domaine et une (ou plusieurs) adresses IP.
Petit rappel
Chaque enregistrement DNS est composé d'un nom, le nom de domaine, d'un type, d'une classe, d'une durée de vie et d'une valeur.
Les types les plus courant sont:
- A : adresse IPv4;
- AAAA : adresse IPv6;
- NS : nom du serveur DNS gérant le domaine;
- CNAME : pour les alias. Par exemple
www.clochix.net CNAME blogs.vip.gandi.netsignifie que le nomwww.clochix.netest un simple synonyme deblogs.vip.gandi.netet que pour avoir ses caractéristiques il faut donc requérir celles du domaine initial;
La classe sera toujours 'IN' pour internet (je doute que les gens qui utilisent d'autres valeurs lisent ce billet).
La durée de vie (TTL) indique le nombre de secondes pendant lequel un client peut garder l'information en cache au lieu de la re-demander au serveur (c'est ce qui explique les durées de propagation des modifications d'enregistrement DNS : un client n'est censé interroger le serveur qui gère le domaine que toutes les TTL secondes)
MX
Au commencement donc était le DNS. Un peu plus tard, on s'est dit que ça serait bien de pouvoir indiquer dans le DNS que les mails adressés à un domaine sont traités par un autre serveur. Ainsi le site web clochix.net pourrait être hébergé sur une machine, et les mails traités par une autre. Ainsi est né le MX. C'est un type d'enregistrement indiquant les serveurs qui traitent les mails pour un domaine. Ses données se composent d'une liste de priorités et de noms de serveurs. Par exemple pour clochix.net:
clochix.net. 10800 IN MX 10 spool.mail.gandi.net. clochix.net. 10800 IN MX 50 fb.mail.gandi.net.
Les mails devront être envoyés au serveur spool.mail.gandi.net
ou, s'il est indisponible, à fb.mail.gandi.net.
SRV
L'idée était bonne, on a donc décidé de la généraliser en créant un nouveau type d'enregistrement, SRV, défini par la RFC 2782 pour associer des serveurs à des services pour un domaine.
Pour découvrir le serveur associé à un service, il faut demander
l'enregistrement SRV pour le nom
_Service._Protocole.Domain. Les noms de service et de protocole
sont préfixés par le caractère '_' pour éviter toute confusion avec des noms
existant.
La liste des noms de services est en cours de normalisation, on pourra en trouver une version ici.
Le protocole sera généralement _tcp ou _udp.
Le protocole XMPP est un des premiers à utiliser les
enregistrements SRV. Concrètement, si vous voulez connaître l'adresse du
serveur auquel vous connecter pour accéder à votre compte GTalk[1] à partir d'un client Jabber, il suffit de
rechercher le SRV de _xmpp-client._tcp.gmail.com. La réponse
devrait ressembler à ça:
_xmpp-client._tcp.google.com. 900 IN SRV 20 0 5222 talk1.l.google.com. _xmpp-client._tcp.google.com. 900 IN SRV 20 0 5222 talk2.l.google.com. _xmpp-client._tcp.google.com. 900 IN SRV 5 0 5222 talk.l.google.com.
Les données d'un enregistrement SRV sont:
- la priorité, comme pour les MX, la plus petite étant le serveur prioritaire;
- un poids servant à choisir entre les serveurs de même priorité. Cette fois, ce sont les poids les plus lourds qui sont prioritaires;
- le port : cela permet de définir un port inhabituel pour un service;
- le nom de domaine du serveur;
Pour utiliser le serveur Jabber de Google, un client devra donc se connecter
au port 5222 de la machine talk.l.google.com.
En PHP
Accéder au DNS en PHP est très simple, c'est disponible nativement grâce à
la fonction dns_get_record. On pourra utiliser un code de ce genre
pour récupérer l'hôte hébergeant le serveur XMPP d'un domaine:
function getServer($domain) {
$rec = dns_get_record("_xmpp-client._tcp.$domain", DNS_SRV);
usort($rec, create_function('$a,$b', 'if($a["pri"]==$b["pri"]){if ($a["weight"]==$b["weight"])return 0;return($a["weight"]>$b["weight"]?-1:1);}return($a["pri"]<$b["pri"]?-1:1);'));
return $rec[0];
}
$rec = getServer('gmail.com');
$server = $rec['target'];
$port = $rec['port'];
(je trie les réponses en fonction de leur priorité et de leur poids avec une fonction anonyme dont le code n'a aucun intérêt).
Pour aller plus loin
Outre mes travaux en cours sur XMPP, je me suis aussi
intéressé aux enregistrements SRV suite à un billet d'Eric Daspet, "Ouvert
et décentralisé, est-ce suffisant ?" dans lequel il se demandait où
centraliser son profil public, comment avoir à un seul endroit les liens vers
son blog, son micro-blog, sa galerie de photos, son CV, etc. Selon Saint TBL, tout doit avoir une URL.
Je suis donc assez partisan que chaque être possède un nom de domaine, histoire
de maîtriser la base de ses URL[2][3]. Posséder un nom de domaine est le minimum
nécessaire, mais c'est peut-être aussi suffisant pour stocker sa carte de
visite. A partir du moment où on dispose d'un nom de domaine, est-il besoin
d'autres choses pour pointer vers ses données ?. Le DNS devrait pour moi
suffire. Il contient un type d'enregistrement, TXT, susceptible de contenir
n'importe quelle donnée textuelle (je ne connais pas les contraintes de
taille). De nouvelles propositions d'utilisation en sont régulièrement faites,
qui débouchent parfois sur la création de nouveaux type d'enregistrements.
Ainsi la RFC 1464 propose
d'utiliser les champs TXT pour stocker des données sous la simple forme clé =
valeur. La RFC 4408 utilise
elle les enregistrements TXT pour implémenter un mécanisme de lutte contre le
spam, le Sender
Policy Framework[4]. Pourquoi ne pas utiliser ce champ pour
stocker sa carte de visite, sous forme par exemple d'un document XML avec tous
les vocabulaires qui vont bien ? Ou inventer un équivalent aux
enregistrements SRV, non plus pour des services au sens Internet, mais pour des
bouts de notre présence en ligne... Idéalement, le protocole whois
aurait pu également servir à stocker ce type d'information. Il sert à
interroger les bases de données des registres où sont enregistrés les noms de
domaine, et contient de nombreuses informations. Malheureusement, malgré
l'existence de quelques RFC, il n'est absolument pas standardisé, et il est
difficile d'imaginer des applications inter-opérables s'appuyant dessus. Le DNS
lui-même semble donc le meilleur endroit où stocker sa carte de visite.
Mouais, vous en pensez quoi ?
Ajout du 7 septembre l'idée n'est évidemment pas neuve, et j'ai trouvé plusieurs propositions similaires d'implémentations. Mais j'ai surtout découvert les enregistrements NAPTR définis dans la RFC 2915 et qui permettent très schématiquement de renvoyer une réponse en appliquant une expression régulière à la question. Je n'ai pas le temps de creuser mais si ça vous intéresse allez donc faire un tour par là.
Notes
[1] c'est mal
[2] non je n'ai pas d'actions chez Gandi
[3] le gTLD .name a d'ailleurs été créé dans cette optique
[4] grosso-modo cela consiste à lister une série d'IP
seules autorisées à envoyer des mails pour un domaine. Cette liste était
initialement stockée dans les champs TXT avant qu'un type spécifique
d'enregistrement, SPF, ne soit créé
Commentaires
Magistral. J'ai enfin commencé à comprendre des nuances qui m'échappaient vraiment !
Ouch, pour moi le DNS était un "simple" protocole pour mettre en relation un nom de domaine et une IP. J'avais jamais poussé plus loin la compréhension des DNS. Là je dois dire que ça fait un bon point de départ pour approfondir le peu de connaissances que j'ai sur le sujet.
J'ai tout de même du mal à voir pourquoi tu parles de "stocker dans le DNS". Pour moi ça changerait beaucoup de son utilisation de départ. Si tu considères que j'ai rien compris à ton article, hésite pas à me dire de tout relire hein
Par contre, que un très grand nombre de personne possède un nom de domaine avec au minimum leur carte de visite sous forme de document XML me parrait être une bonne idée. Cependant je dois admettre que cela impliquerait que les gens aient un serveur, ou loue un petit bout de serveur.
Remarque : je parle d'un grand nombre de personne et non de tout le monde. J'ai du mal à voir ce que ma grand mère pourrait faire avec sa carte de visite sur le net.
@Pied de mamouth

> J'ai tout de même du mal à voir pourquoi tu parles de "stocker dans le DNS". Pour moi ça changerait beaucoup de son utilisation de départ.
Pas vraiment à vrai dire: le DNS est une sorte d'annuaire avec des informations relatives au nom de domaine. Il ne s'agit pas de le transformer en base de données dans laquelle on stockerait n'importe quoi, juste de rajouter quelques informations supplémentaires, comme ça a déjà été fait à plusieurs reprises. Regarde les différents types de champs qui existent, tu verras que le DNS conserve déjà bon nombre de données.
La faiblesse de ma proposition est au niveau de la séparation entre le DNS, pour les informations techniques, destinées essentiellement aux machines, et le whois, pour des informations "administratives" plus à destination des humains. Ce que je souhaite y stocker est à mi-chemin entre les deux. Je reconnais que ça aurait peut-être plus sa place dans le whois, mais devant l'absence de standardisation d'icelui...
> Cependant je dois admettre que cela impliquerait que les gens aient un serveur, ou loue un petit bout de serveur.
Nop. Un nom de domaine n'est pas lié à un serveur physique. Tu peux très bien avoir un nom de domaine sans aucun serveur derrière (cf par exemple tous les domaines réservés juste pour protéger des marques) ou uniquement utilisé pour le mail, les mails étant gérés pas un prestataire tiers.
Avoir un nom de domaine nécessite juste de le réserver auprès d'un registre (en fonction de l'extension les prix commencent à 1 ou 2€ par an). Point.
> Remarque : je parle d'un grand nombre de personne et non de tout le monde. J'ai du mal à voir ce que ma grand mère pourrait faire avec sa carte de visite sur le net.
Y indiquer l'adresse de son blog, de son profil sur Wikipedia, de son album de photos en ligne... Comment, tu ne lui as pas encore montré comment faire tout ça ? Voilà une idée d'activité pour la Mozilla Service Week, mettre mamie sur le Net
Mettre sa carte de visite directement dans le DNS, c'est ce que propose le TLD .tel (http://fr.wikipedia.org/wiki/.tel).
L'idée n'est pas bête. Plutôt que d'avoir un numéro de téléphone, on donne un machin.tel et à partir de là on a accès à toute la carte de visite. Avec un téléphone compatible, on rentre machin.tel et ça récupère le numéro de téléphone.
Le problème, c'est que d'une part l'espace de noms sera très vite rempli et d'autre part on se retrouve avec deux noms de domaines : un pour ses services et un pour sa carte de visite.
Ce serait quand même beaucoup mieux d'avoir des champs normalisés du DNS, par exemple _voice._tel.DOMAIN.