Le système DNS
Afin de communiquer sur Internet, il est nécessaire de contacter un serveur avec une adresse IP. Or, cela pose des inconvénients :
- Cela est difficile à retenir et peu pratique
- Si le serveur change d'hébergeur, l'adresse IP peut changer
Pour remédier à cela, nous utilisons des noms de domaines. Ces derniers sont associés aux adresses IP.
Le DNS (Domain Name System) est un mécanisme distribué permettant de traduire les noms de domaine (tels que google.fr, fr.wikipedia.org, etc.) en adresse IP. Cependant, d'autres informations peuvent également y être renseignées, nous les verrons plus loin. Le DNS s'apparente au carnet d'adresses en associant un nom de contact à un numéro de téléphone.
Il remplace le fichier hosts (RFC 608), encore présent aujourd'hui sur les systèmes d'exploitation. Ce fichier contient l'association adresse IP ↔ nom de domaine. Il fut créé pour ARPANET et remplissait cette tâche à une époque où les équipements sur le réseau étaient peu nombreux.
La très forte augmentation du nombre d'équipements sur le réseau rendit sa mise à jour et sa diffusion compliquées (transmis par FTP). Un système décentralisé et hiérarchique devenait nécessaire et c'est dans ce cadre que le système DNS est né.
Le service DNS écoute sur le port UDP 53.
Composition d'un nom de domaine
Le système DNS fonctionne de manière hiérarchique. Voici la position du nom de domaine dans une URL Web :
https:// | fr | . | wikitionary | . | org | /wiki/DNS |
Protocole | 3e niveau | Séparateur | 2e niveau | Séparateur | TLD | Ressource |
Le domaine dans une adresse de messagerie se trouve après le symbole arobase (@) :
alain@ | example | . | com |
Identifiant | 2e niveau | Séparateur | TLD |
Le nom de domaine se décompose en partant de la fin.
L'arborescence du DNS
Le système DNS est une hiérarchie au sommet de laquelle on retrouve la racine représentée par le symbole point (.). Il est souvent implicite lors de l'écriture des noms de domaine, mais il doit apparaître lors de la désignation d'un nom de domaine absolu, notamment dans la configuration des serveurs DNS.
Chaque sous-domaine est rattaché à son domaine parent. Ainsi, les TLD ont des sous-domaines rattachés directement à la racine. Chaque niveau de domaine est séparé du précédent par un point (.). Voici une représentation graphique de l'arborescence DNS.
Chaque nœud possède une base de données qui détaille les nœuds enfants (sous-domaines, machines, etc.). Ce qui permet une gestion décentralisée de l'ensemble du système.
Les Top Level Domains (TLD)
Le domaine de premier niveau est situé le plus à droite du nom de domaine. Les TLD sont gérés par l'ICAAN. On y retrouve deux types de domaines :
- Les domaines nationaux
- Ce sont des domaines dédiés à un pays ou territoire (.fr pour la France, .be pour la Belgique, .re pour La Réunion, etc.).
- Les domaines génériques
- Ils visent à regrouper les domaines partageant une caractéristique autre que géographique (.com initialement prévu pour les organismes à but lucratif, .museum pour les musées, etc.)
Chaque TLD est géré par un registre, qui peut être une association, un état ou tout autre organisme (Le .fr est géré par l'AFNIC, une association loi 1901). Chaque registre peut à son tour déléguer la vente des domaines à des sociétés (OVH est habilité par l'AFNIC pour la vente de domaines en .fr).
Chaque TLD possède des conditions et des tarifs propres afin d'attribuer un domaine (pour le .fr, l'AFNIC impose que la personne morale ou physique demandant un nom de domaine soit résident de l'UE, de la Suisse, de la Norvège, de l'Islande ou du Liechtenstein).
Les sous-domaines
Le DNS fonctionnant de manière hiérarchique, chaque niveau est un sous-domaine du niveau précédant. Ainsi, les TLD sont des sous-domaines de la racine. Il est possible d'avoir plusieurs niveaux de sous-domaines. Voici un exemple :
fr | .www | .example | .com | . |
4e niveau | 3e niveau | 2e niveau | TLD (1e niveau) | Racine |
Fonctionnement de la résolution de nom de domaine
La résolution du nom de domaine commence par le TLD et remonte jusqu'au sous-domaine. Le schéma ci-dessous décrit l'ordre des requêtes et des réponses entre le client, le serveur DNS récursif et les serveurs DNS des différentes composantes du nom de domaine demandé.
Serveurs DNS racine
Le domaine racine est géré par les 13 grappes de serveurs racines contrôlés par 12 autorités de noms différentes. Les domaines de premier niveau sont des sous-domaines du domaine racine. Ces grappes de serveurs sont nommées lettre.root-servers.net avec lettre compris entre A et M.
Leur liste ainsi que leurs adresses IP sont disponibles en ligne sur https://root-servers.org
Résolution inverse
Ce mécanisme permet de trouver le nom de domaine associé à une adresse IP. Cette information est retournée par un enregistrement PTR. Comme la partie désignant le plus grand ensemble d'une adresse IP se situe à gauche (premier octet d'une IPv4), et non à droite pour le nom de domaine (TLD), on cherche a résoudre le domaine composé de l'IP inversée concaténée avec in-addr.arpa. Ainsi, pour l'IPv4 10.104.12.31, on résout le domaine 31.12.104.10.in-addr.arpa.
Un enregistrement PTR correct pour les domaines est indispensable pour les services exposés derrière des IP publiques. Par exemple, un courriel provenant d'un serveur SMTP n'ayant pas de PTR valide a de grandes chances d'être considéré comme indésirable et être bloqué.
Types courants d'enregistrements DNS
Voici les types les plus courants d'enregistrements DNS :
Enregistrement | Description |
---|---|
A | Associe un nom de domaine à une IPv4 |
AAAA | Associe un nom de domaine à une IPv6 |
NS | Identifie le serveur DNS associé à chaque zone |
SOA | Fournit des informations sur la zone de domaine (serveur principal, courriel de contact, TTL, etc.) |
CNAME | Définit un alias pour un autre domaine |
MX | Définit les serveurs SMTP pour le domaine |
PTR | Associe une adresse IP à un nom de domaine pour le reverse DNS |
TXT | Permet de renseigner un texte dans un enregistrement DNS, cela est utilisé par exemple pour la spécification SPF de la messagerie |
Dans un enregistrement DNS, un nom de domaine pleinement qualifié (en anglais FQDN pour Fully Qualified Domain Name), c'est-à-dire défini de manière absolue, se termine par un point (.) qui représente la racine. Sinon, il est relatif au domaine.
Il est possible de faire de l'équilibrage de charge par le DNS avec le mécanisme DNS round-robin en inscrivant pour un même domaine, plusieurs enregistrements différents. La réponse à la requête comportera les enregistrements dans un ordre aléatoire. Cela permet de répartir la charge sur les serveurs. Un exemple est donné avec des enregistrements A ci-dessous.
Les exemples suivants sont donnés pour le domaine example.com.
Enregistrement A
Voici la syntaxe d'un enregistrement A pour le sous-domaine cloud. Les deux enregistrements possèdent les mêmes informations :
cloud IN A 10.104.12.31 cloud.example.com. IN A 10.104.12.31
Le premier enregistrement est relatif car il ne possède pas de point à la fin du domaine. Le second est absolu.
Voici ci-dessous un exemple de répartition de charge par le DNS :
cloud IN A 10.104.12.31 cloud IN A 10.104.12.32 cloud IN A 172.16.85.204 cloud IN A 192.168.14.52
Enregistrement AAAA
De la même manière que pour un enregistrement A, voici la syntaxe pour un enregistrement AAAA relatif et absolu :
cloud IN AAAA 2001:412f:c1::1 cloud.example.com. IN AAAA 2001:412f:c1::1
Enregistrement NS
L'enregistrement NS désigne quel(s) serveur(s) DNS est en charge du sous-domaine demandé :
example.com. IN NS ns0.example.com. example.com. IN NS ns1.example.com.
Enregistrement SOA
Un enregistrement SOA permet de renseigner les informations officielles sur la zone DNS :
- Le serveur DNS principal
- Une adresse courriel de contact technique dont le @ est remplacé par un point.
- Un numéro de série de la configuration de la zone. Il doit être incrémenté à chaque version. Par convention, le numéro de série est la date au format YYYYMMDDNN soit l'année, le mois, le jour de la modification et le numéro de révision de la journée.
- Le temps de rafraîchissement entre le serveur principal et les serveurs secondaires exprimé en secondes.
- Le temps d'attente, après un essai infructueux de rafraîchissement depuis les serveurs secondaires vers le serveur principal exprimé en secondes.
- Le temps d'expiration, si les serveurs secondaires ne peuvent pas joindre le serveur principal, exprimé en secondes, durée au-delà de laquelle la zone est considérée comme invalide.
- Le TTL des enregistrements dans les caches DNS, en secondes.
La syntaxe est la suivante :
example.com. IN SOA ns0.example.com. root.example.com. 2020120401 43200 7200 259200 3600
Enregistrement CNAME
L'enregistrement CNAME permet de faire un alias vers un autre domaine :
web IN CNAME cloud.example.com. fr.example.com. IN CNAME web
Enregistrement MX
Cet enregistrement désigne le serveur SMTP auquel il faut envoyer un courriel destiné à une adresse du domaine. Un serveur SMTP va tenter de contacter le serveur dont le numéro de préférence (situé après MX) est le plus petit. Un équilibrage de charge est possible si le numéro de préférence est identique à plusieurs enregistrements :
example.com. IN MX 10 mail1.example.com. example.com. IN MX 20 mail2.example.com. example.com. IN MX 20 mail3.example.com.
Enregistrement PTR
Cet enregistrement, également appelé Reverse DNS Record, associe une adresse IP à un domaine.
L'adresse IPv4 10.104.12.31 doit être au format 31.12.104.10.in-addr.arpa. L'adresse IPv6 2001:412f:c1::1 doit être saisie (bonne chance !) au format 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.c.0.0.f.2.1.4.1.0.0.2.ip6.arpa :
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.c.0.0.f.2.1.4.1.0.0.2.ip6.arpa. IN PTR cloud.example.com. 31.12.104.10.in-addr.arpa. IN PTR cloud.example.com.
Enregistrement TXT
Cet enregistrement permet de renseigner du texte dans un enregistrement DNS. Nous verrons dans le chapitre SMTP certains de ses usages :
example.com. IN TXT "Lorem ipsum dolor sit amet"
Aller à l'exercice 2 Aller à l'exercice 3
Interroger manuellement un serveur DNS
GNU/Linux
La commande dig affiche les informations renvoyées par le serveur DNS :
$ dig iutdijon.u-bourgogne.fr ; <<>> DiG 9.16.1-Ubuntu <<>> iutdijon.u-bourgogne.fr ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3728 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 65494 ;; QUESTION SECTION: ;iutdijon.u-bourgogne.fr. IN A ;; ANSWER SECTION: iutdijon.u-bourgogne.fr. 360 IN A 193.52.232.67 ;; Query time: 68 msec ;; SERVER: 127.0.0.53#53(127.0.0.53) ;; WHEN: mer. nov. 04 22:46:50 CET 2020 ;; MSG SIZE rcvd: 68
Windows
La commande nslookup dans l'invité de commandes permet d'effectuer une requête DNS :
> nslookup fr.wikipedia.org Serveur : UnKnown Address: 192.168.1.254 Réponse ne faisant pas autorité : Nom : dyna.wikimedia.org Addresses: 2620:0:862:ed1a::1 91.198.174.192 Aliases: fr.wikipedia.org
Sécurité du DNS
Au-delà de l'attaque par déni de service, le service DNS est vulnérable à plusieurs types d'attaques :
Interception et attaque man in the middle
L'absence de chiffrement des requêtes et réponses DNS permet l'interception de la communication entre le client et le serveur, voire l'altération de la requête ou de la réponse par l'attaquant. Le but est d'obtenir des informations sur les domaines requêtes et de renvoyer de fausses informations (par exemple, renvoyer l'IP d'un serveur malveillant au lieu de l'IP du serveur de votre banque).
Empoisonnement du cache DNS
Cette technique consiste à fournir une mauvaise information à un serveur DNS afin que celui-ci l'insère dans son cache. Cette information erronée sera renvoyée à tout utilisateur du serveurs DNS demandant le même domaine.
DNSSEC
Le DNSSEC permet de résoudre ces problèmes : une signature cryptographique est associée à chaque enregistrement d'un serveur doté de ce protocole. Ce qui permet au client de vérifier avec la clef publique du serveur que l'enregistrement retourné est bien valide et n'a pas été altéré.
Ce protocole permet également de déléguer les signatures. Un domaine peut déclarer qu'un sous-domaine est signé et ainsi établir une chaîne de confiance jusqu'à la racine.
Noms de domaine internationalisés
Initialement, les noms de domaine ne pouvaient être composés uniquement des caractères alpha-numériques (a-z et 0-9) sans casse (les majuscules et les minuscules ne sont pas différenciées), ainsi que du trait d'union (-).
La syntaxe punycode a été introduite par les RFC 3490, 3491 et 3492 et permet d'encoder des caractères Unicode en chaînes de caractères ASCII afin d'être compatible avec le système DNS.