|
|
3 - Les formats3.1 - Le transport3.1.1 - Utilisation d'UdpLe port serveur utilisé pour l'envoi des
datagrammes en Udp est 53. Les datagrammes Dns en Udp sont limités à 512 octets
(valeur représentant les données sans l'entête Udp et
Ip). Les datagramme plus
long doivent être tronqué à l'aide du champ Tc. 3.1.2 - Utilisation de TcpLe port serveur utilisé pour l'envoi des datagrammes en Tcp est 53. Le datagramme inclus alors un champ de deux octets nommé "longueur", il permet de spécifier la la longueur total des données indépendamment de la fragmentation. La longueur est calculé sans les 2 octets de ce même champ. 3.2 - L'entêteVoici la structure de l'entête Dns basé
sur 12 octets. 3.2.1 - IdCodé sur 16 bits, doit être recopié lors de la réponse permettant à l'application de départ de pouvoir identifier le datagramme de retour. 3.2.2 - QrSur un 1 bit, ce champ permet d'indiquer s'il s'agit d'une requête (0) ou d'une réponse (1). 3.2.3 - OpcodeSur 4 bits, ce champ perme de spécifier le type de requête : 0 - Requête standard (Query) 1 - Requête inverse (Iquery) 2 - Status d'une requête serveur (Status) 3-15 - Réservé pour des utilisations futurs 3.2.4 - AaLe flag Aa, sur un bit, signifie "Authoritative Answer". Il indique une réponse d'une entité autoritaire. 3.2.5 - TcLe champ Tc , sur un bit, indique que ce message a été tronqué. 3.2.6 - RdLe flag Rd, sur un bit, permet de demander la récursivité en le mettant à 1. 3.2.7 - RaLe flag Ra, sur un bit, indique que la récursivité est autorisée. 3.2.8 - ZLe flag Z, sur un bit, est réservé pour une utilisation futur. Il doit être placé à 0 dans tout les cas. 3.2.9 - RcodeLe champ Rcode, basé sur 4 bits, indique le type de réponse. 0 - Pas d'erreur 1 - Erreur de format dans la requête 2 - Problème sur serveur 3 - Le nom n'existe pas 4 - Non implémenté 5 - Refus 6-15 - Réservés 3.2.10 - QdcountCodé sur 16 bits, il spécifie le nombre d'entrée dans la section "Question". 3.2.11 - AncountCodé sur 16 bits, il spécifie le nombre d'entrée dans la section "Réponse". 3.2.12 - NscountCodé sur 16 bits, il spécifie le nombre d'entrée dans la section "Autorité". 3.2.13 - ArcountCodé sur 16 bits, il spécifie le nombre d'entrée dans la section "Additionnel". 3.3 - Les RRLa base de données des serveurs de noms (fichier de domaine et fichiers de
résolution inverse) est constituée "d'enregistrements de ressources", "Ressource
Records" (RRs). Ces enregistrements sont répartis en classes.
La seule classe d'enregistrement usuellement employée est la classe Internet
(IN). L'ensemble d'informations de ressources associé à un nom particulier est
composé de quatre enregistrements de ressources séparés (RR). Voici les différents champs d'un RR
que vous pouvez aussi retrouver dans la Rfc 1035 au
chapitre 3.2.1
: 3.3.1 - NomNom du domaine où se trouve le RR. Ce champ est implicite lorsqu'un RR est en dessous d'un autre, auquel cas le champ owner est le même que celui de la ligne précédente. 3.3.2 - TypeCe champ type, codé sur 16 bits, spécifie quel type de donnée sont utilisés dans le RR. Voici les différents types disponibles:
3.3.3 - ClasseUne valeur encodée sur 16 bits identifiant une famille de protocoles ou une instance d'un protocole. Voici les classes de protocole possible :
3.3.4 - TtlC'est la durée de vie des RRs (32 bits, en secondes), utilisée par les solveurs de noms lorsqu'ils ont un cache des RRs pour connaître la durée de validité des informations du cache. 3.3.5 - LongueurSur 16 bits, ce champ indique la longueur des données suivantes. 3.3.6 - DonnéesDonnées identifiant la ressource, ce que l'on met dans ce champs dépend évidemment du type de ressources que l'on décrit. A : Pour la classe IN, une adresse IP sur 32 bits. Pour la classe CH, un nom de domaine suivi d'une adresse octale Chaotique sur 16 bits. Cname : un nom de domaine. Mx : une valeur de préférence sur 16 bits (la plus basse possible) suivie d'un nom d'hôte souhaitant servir d'échangeur de courrier pour le domaine de l'owner. Ptr : Une adresse IP sous forme d'un nom. Ns : Un nom d'hôte. Soa : Plusieurs champs. Voici un exemple montrant les différents
champs saisies par Ethereal : 4 - Les zones4.1 - Structure arborescente de l'espace de nomsLe Dns utilise la gestion hiérarchique des noms. On distingue deux domaines pour le classement des noms. 4.1.1 - Les domaines géographiques (Codes ISO 3166)
4.1.2 - Les domaines génériquesCette liste est définie par la
Rfc 1591 - Domain Name System Structure
and Delegation L'arborescence des noms de domaine est constituée : d'une racine de noeud identifiés par des labels dont les informations sont stockées dans une base de données Les labels portés par les noeuds font entre 0 et 63 octets, sachant que l'identifiant de longueur zéro est réservé à la racine. Deux noeuds " frère " ne peuvent pas porter le même identifiant, néanmoins, deux noeuds peuvent avoir le même label dans le cas où il n'on aucun lien de " fratrie ". Le nom de domaine d'un noeud est constitué des identifiants situés entre ce noeud à la racine de l'arborescence. Lorsqu'un utilisateur doit entrer un nom de domaine, la longueur de chaque identifiant est omise et les identifiants devront être séparés par des points ("."). Un nom de domaine complet atteignant toujours la racine, la forme écrite exacte de tout domaine entièrement qualifié se termine par un point. Nous utiliserons cette propriété pour distinguer les cas : d'une chaîne de caractères représentant un nom de domaine complet (souvent appelé "absolu" ou "entièrement qualifié"). Par exemple, "www.FRAMEIP.COM" d'une chaîne de caractères représentant les premiers identifiants d'un nom de domaine incomplet, et devant être complété par l'application locale avec un complément absolu (expression appelée "relative"). Par exemple, "www", à utiliser relativement au domaine FRAMEIP.COM. 4.2 - Formation des zonesLa base de données est divisée en sections appelées zones, lesquelles sont
distribuées sur l'ensemble des serveurs de noms. De plus, elle est divisée selon
deux méthodes : en classes et par "découpage" de l'espace des noms de domaines. 4.3 - Principes des zonesDans une classe, des "coupes" dans l'espace de noms peuvent être faites entre
deux noeuds adjacents quelconques. Un fois toutes les coupes définies, chaque
groupe de noeuds interconnectés devient une zone indépendante. La zone est alors
définie comme étant la "sphère d'autorisation" pour tout nom à l'intérieur de la
zone. Notez que les "coupes" dans l'espace de noms peuvent être à des endroits
différents de l'arbre suivant la classe, les serveurs de noms associés peuvent
être différents, etc. 4.4 - Description techniques pour les zonesLes données qui décrivent chaque zone sont organisées en quatre parties : Les données générales sur chaque noeud de la zone Les données qui définissent le noeud supérieur de la zone Les données qui décrivent les sous-zones Les données qui permettent d'accéder aux serveurs de noms qui gèrent les sous-zones Toutes ces données sont stockées dans des RRs, donc une zone peut être
entièrement décrite par un jeu de RRs. Les informations sur des zones entières
peuvent donc être transmises d'un serveur à l'autre, tout simplement en
échangeant ces RRs. 4.5 - Type de serveurs et autoritésPar le découpage en zone on a donc trois types de serveurs de noms. 4.5.1 - Le serveur primaireLe serveur primaire est serveur d'autorité sur sa zone : il tient à jour un fichier appelé "fichier de zone", qui établit les correspondances entre les noms et les adresses IP des hosts de sa zone. Chaque domaine possède un et un seul serveur primaire. 4.5.2 - Le serveur secondaireUn serveur de nom secondaire obtient les données de zone via le
réseau, à partir d'un autre serveur de nom qui détient l'autorité pour
la zone considérée. L'obtention des informations de zone via le réseau
est appelé transfert de zone (voir partie 2.4). Il est capable de
répondre aux requêtes de noms Ip (partage de charge), et de secourir le
serveur primaire en cas de panne. Le nombre de serveurs secondaires par
zone n'est pas limité. Ainsi il y a une redondance de l'information. Le
minimum imposé est un serveur secondaire et le pré requis mais pas obligatoire
est de le situer sur un segment différent du serveur primaire. 4.5.3 - Le serveur cacheLe serveur cache ne constitue sa base d'information qu'à partir des
réponses des serveurs de noms. Il inscrit les correspondances nom /
adresse IP dans un cache avec une durée de validité limitée (Ttl) ; il
n'a aucune autorité sur le domaine : il n'est pas responsable de la mise
à jour des informations contenues dans son cache, mais il est capable de
répondre aux requêtes des clients Dns. Un serveur de nom, en terme de physique, peux très bien jouer le rôle de plusieurs de ces fonctions. On trouvera par exemple, beaucoup d'entreprise qui héberge leurs domaine sur le serveur Dns primaire servant aussi de cache pour les requêtes sortantes des utilisateurs interne. 4.6 - La diffusion des modifications"Le transfert de zones" 4.7 - Les pannesLorsqu'un serveur primaire est indisponible, le serveur secondaire ne reçoit pas de réponse à ses interrogations sur le numéro de version du fichier de zone. Il continue ses tentatives jusqu'à expiration de la validité des enregistrements de son fichier de zone ('Expire Time'). Lorsqu'un serveur primaire redevient disponible, aucun mécanisme de synchronisation entre le fichier de zone des serveurs secondaires et celui du serveur primaire n'a été normalisé. 5 - Recherche de ressources5.1 - Les RésolveursLes "résolveurs" sont des programmes qui interfacent les applications
utilisateur aux serveurs de noms de domaines. En effet, ce n'est pas
l'utilisateur qui effectue les requêtes directement. Dans le cas le plus simple,
un résolveur reçoit une requête provenant d'une application (ex., applications
de courrier électronique, Telnet, Ftp) sous la forme d'un appel d'une fonction
de bibliothèque, d'un appel système etc., et renvoie une information sous une
forme compatible avec la représentation locale de données du système. 5.2 - Les RequêtesLa principale activité d'un serveur de noms est de répondre aux requêtes standard. La requête et sa réponse sont toutes deux véhiculées par un message standardisé décrit dans la Rfc 1035. La requête contient des champs QTYPE, QCLASS, et QNAME, qui décrivent le(s) type(s) et les classes de l'information souhaitée, et quel nom de domaine cette information concerne. Les requêtes sont des messages envoyés aux serveurs de noms en vue de consulter les données stockées par le serveur. Par exemple avec Internet, on peut utiliser aussi bien Udp que Tcp pour envoyer ces requêtes. 5.2.1 - Structure des requêtesParmi les champs fixes on trouve 4 bits très importants appelé code d'opération (OPCODE). Le code d'opération permet de donner des informations sur la nature du message (requête, réponse, ...). Les quatre possibilités sont : Question, Contient la question (nom d'hôte ou de domaine sur lequel on cherche des renseignements et type de renseignements recherchés). Answer, Contient les RRs qui répondent à la question. Authority, Contient des RRs qui indiquent des serveurs ayant une connaissance complète de cette partie du réseau. Additional, Contient des RRs supplémentaires pouvant être utiles pour exploiter les informations contenues dans les autres sections. Voici un exemple de requête où l'on souhaite connaître le nom du serveur de courrier s'occupant de frameip.com :
5.2.2 - Le mode ItératifCe mode est le plus simple du point de vue du serveur. Les serveur répondent
directement à la
requête sur la base seule de ses informations locales. La réponse peut contenir
la réponse demandée, ou bien donne la référence d'un autre serveur
qui sera "plus susceptible " de disposer de l'information demandée. Il est
important que tous les serveurs de noms puissent implémenter ce mode itératif et
désactive la fonction de récursivité. Dans le cas d'une implémentation simplifiée d'un résolveur qui ne sait exploiter d'autres réponses qu'une réponse directe à la question. Dans le cas d'une requête qui doit passer à travers d'autres protocoles ou autres "frontières" et doit pouvoir être envoyée à un serveur jouant le rôle d'intermédiaire. Dans le cas d'un réseau dans lequel intervient une politique de cache commun plutôt qu'un cache individuel par client. Le service non-récursif est approprié si le résolveur est capable de façon autonome de poursuivre sa recherche et est capable d'exploiter l'information supplémentaire qui lui est envoyée pour l'aider à résoudre son problème. 5.2.3 - Le mode RécursifLe mode récursif une fois est plus simple du point de vue du client. Dans ce
mode, le premier serveur prend le rôle de résolveur. Le bit Ra (Récursion admissible), est marqué ou non par le serveur dans toutes les réponses. Ce bit est marqué si le serveur accepte à priori de fournir le service récursif au client, que ce dernier l'ait demandé ou non. Autrement dit, le bit RA signale la disponibilité du service plutôt que son utilisation. Les requêtes disposent d'un bit Rd (pour "récursion désirée"). Ce bit indique que le requérant désire utiliser le service récursif pour cette requête. Les clients peuvent demander le service récursif à n'importe quel serveur de noms, bien que ce service ne puisse leur être fourni que par les serveurs qui auront déjà marqué leur bit RA, ou des serveurs qui auront donné leur accord pour ce service par une négociation propriétaire ou tout autre moyen hors du champ du protocole Dns. Le mode récursif est mis en oeuvre lorsqu'une requête arrive avec un bit RD
marqué sur un serveur annonçant disposer de ce service, le client peut vérifier
si le mode récursif a été utilisé en constatant que les deux bits Ra et Rd ont
été marqués dans la réponse. La réponse à la requête, éventuellement préfacée par un ou plusieurs RR CNAME qui indiquent les alias trouvés pendant la recherche de la réponse. Une erreur de nom indiquant que le nom demandé n'existe pas. Celle-ci peut inclure des RR CNAME qui indiquent que la requête originale pointait l'alias d'un nom qui n'existe pas. Une indication d'erreur temporaire. Si le service récursif n'est pas requis, ou n'est pas disponible, la réponse non-récursive devra être l'une des suivantes : Une réponse d'erreur "autorisée" indiquant que le nom n'existe pas. Une indication temporaire d'erreur. Une combinaison : Les RR que le serveur de nom pense être utile au requérant pour continuer sa recherche. 5.2.4 - Exemple de résolution de nomsNous allons voir avec un exemple comment se fait le parcours de l'arborescence pour la résolution de noms. On prend par exemple l'adresse suivante : www.frameip.com Il faut alors : Trouver le NS de la racine Interroger pour trouver le NS des .com Poser la question finale au NS de frameip.com qui identifiera l'entrée www 5.3 - Les Requêtes inverses5.3.1 - FonctionnementDans le cas d'une requête inverse, le solveur envoie une
demande à un serveur
de noms afin que celui-ci renvoie le nom d'hôte associé à une adresse Ip connue.
C'est utile surtout pour des questions de sécurité, pour savoir avec qui on
échange. La mise en place de la résolution inverse est un peu plus compliquée, car l'adressage
par nom est basé sur la notion de domaine qui souvent n'a rien à voir avec la
structure des adresses Ip. Par conséquent, seule une recherche approfondie
portant sur tous les domaines peut garantir l'obtention d'une réponse exacte. Deux moyens existent pour convertir une adresse IP en nom d'hôte : l'usage de
requêtes Dns inversées (Au sens Opcode=Iquery où Iquery = 1) ou les requêtes Dns
de type Ptr (Classe IN et Opcode=Query).
Pour répondre aux requêtes inverses en évitant des recherches exhaustives dans tous les domaines, un domaine spécial appelé in-addr.arpa a été créé. Une fois le domaine in-addr.arpa construit, des enregistrements de ressources spéciaux sont ajoutés pour associer les adresses IP au noms d'hôte qui leur correspondent. Il s'agit des enregistrements pointeurs (PTR), ou enregistrements de références. Par exemple pour connaître le nom de la machine dont l'adresse est 137.194.206.1, on envoie une requête dont la question contient QNAME=1.206.194.137.IN-ADDR.ARPA. 5.3.2 - ExempleLigne de commande permettant d'établir
la requête 6 - La sécurité6.1 - FragilitéSans le Dns, la majorité des applications d'Internet s'arrêtent! De plus le Dns est souvent la cible favorite des dénis de service (Dos) des pirates. Il y a aussi un exemple simple avec le système de requêtes inversées vu précédemment qui entraîne une fuite d'information (ceci représentant la partie découverte de l'attaque). Jusqu'ici, nous n'avons utilisés les requêtes Dns inversées que pour faire la correspondance entre une adresse Ip et l'hostname associé (Requête de classe IN et de type A). Or, nous pouvons faire des recherches inversées sur d'autres types de ressources. Par exemple, nous pourrions émettre une requête inverse au sujet des champs HINFO1 pour se chercher toutes les machines tournant sous une version vulnérable d'un certain système d'exploitation. En effet, le champs Hinfo est sensé contenir le type et version du Système d'Exploitation de la machine. 6.2 - SécurisationLes normes de sécurisation du Dns portent sur la certification de l'origine
des données, l'authentification des transactions et des requêtes. Elles ne
portent pas sur la confidentialité des informations : les données échangées ne
sont pas chiffrées avant d'être transportées par le réseau et n'apporte aucune
protection aux en-têtes des messages Dns, ou aux trames de commandes (requêtes
Dns). 7 - ConclusionLe système de gestion de noms Dns est efficace et unificateur. De plus, comme
tous les systèmes cruciaux d'Internet, il y a au moins une implémentation
efficace et gratuite. C'est portable et très complet. 8 - Discussion autour de la documentationVous pouvez poser toutes vos questions, vos remarques et vos expériences à propos de DNS. Pour cela, rendez-vous sur le Forum "TCP-IP". 9 - Suivi du documentLe 21 septembre 2004, par _SebF, Création et publication. Merci à Emeline pour son coup de main.
|
|