13 KiB
% Introduction au DNS % Sylvain Eliade — S.C.O.P. Cadoles % Mai 2019
Introduction au DNS
- Domain Name System
- Service de base sur Internet
- Permet d'obtenir l'adresse IP d'une machine à partir d'un nom intelligible (résolution de nom)
- Exemple :
www.cesi.fr -> 178.170.102.194
- Sur le port 53, en UDP (+ TCP pour les réponses de plus de 512 octets) : plus rapide !
Un nom DNS
www.cesi.fr
comporte trois parties :
fr
est le TLD (Top Level Domain)cesi
est le nom de domainewww
est un sous-domaine
Le FQDN (Fully Qualified Domain Name) est le nom intégral, suivi d'un point final (= la racine), indiquant que le nom est complet : www.cesi.fr.
L'ensemble des enregistrements d'un nom de domaine s'appelle une zone.
Les TLD
Plusieurs types :
- pour les pays (
.fr
,.be
,.nz
, etc.) = ccTLD (Country-Code) - génériques (gTLD) :
.com
,.info
, et les nouveaux :.paris
,.ovh
et des centaines d'autres - infrastructure
.arpa
: ne sert que pour les reverse DNS (trouver un nom à partir d'une IP)
État des TLDs
Plus de 1500 TLD à ce jours. Expansion depuis l'ouverture à la vente des gTLD en 2012 (100.000$ pour déposer un dossier).
TLD réservés : .example
, .invalid
, .localhost
, .test
, .local
(multicast), .onion
(Tor).
Attention à ne pas utiliser des TLD perso en interne : exemple du .dev
acheté par Google.
Résolution DNS
Le DNS est un système hiérarchique. On commence par la racine (root) et on descend les niveaux.
Ainsi pour résoudre le nom fr.wikipedia.org
on va demander :
- aux serveur racine : quel serveur est responsable du TLD
org
? - au serveur responsable de
org
: qui est responsable du domainewikipedia.org
? - au serveur responsable du domaine
wikipedia.org
: quelle est l'adresse IP defr.wikipedia.org
?
On obtient enfin l'adresse IP du serveur associé à fr.wikipedia.org
, ou si celui-ci n'existe pas, le serveur DNS renvoie NXDOMAIN
(Non-eXistent domain).
Les outils d'inspection DNS
host
renvoie des réponses courtes et simples. Pratique pour scripter.dig
est plus complet. Mieux pour diagnostiquer des problèmes DNS.nslookup
: simpliste, mais dispo sous Windows et Linux, déconseillé.
Pour leur utilisation : man dig
et man host
% host eliade.net
eliade.net has address 91.121.181.110
eliade.net has IPv6 address 2001:41d0:1:f66e::1
eliade.net mail is handled by 10 mail.kd2.org.
% dig eliade.net
…
;; ANSWER SECTION:
eliade.net. 201 IN A 91.121.181.110
;; Query time: 1 msec
;; SERVER: 192.168.5.253#53(192.168.5.253)
;; WHEN: Mon May 13 10:45:34 CEST 2019
;; MSG SIZE rcvd: 55
Attention, par défaut les deux outils utilisent le résolveur configuré dans /etc/resolv.conf
(ici 192.168.5.253
). Bien utiliser leurs options si on veut faire des requêtes directement sur les serveurs racine, de TLD, ou autoritaires.
Exemple de résolution de domaine : fr.wikipedia.org
On peut reproduire le travail d'un résolveur avec l'outil dig
.
On demande au serveur racine qui est responsable pour le TLD org
:
% dig NS org +short
a0.org.afilias-nst.info.
c0.org.afilias-nst.info.
b0.org.afilias-nst.org.
b2.org.afilias-nst.org.
d0.org.afilias-nst.org.
a2.org.afilias-nst.info.
On sait que a0.org.afilias-nst.info
est responsable de la zone .org
, on va lui demander qui est responsable de la zone wikipedia.org
% dig wikipedia.org @a0.org.afilias-nst.info
…
wikipedia.org. 86400 IN NS ns0.wikimedia.org.
wikipedia.org. 86400 IN NS ns2.wikimedia.org.
wikipedia.org. 86400 IN NS ns1.wikimedia.org.
…
Reste plus qu'à demander au serveur responsable de wikipedia.org
quelle est l'adresse de fr.wikipedia.org
:
% dig fr.wikipedia.org @ns0.wikimedia.org
…
fr.wikipedia.org. 3600 IN CNAME dyna.wikimedia.org.
…
Ah c'est un CNAME
donc un alias, vers dyna.wikimedia.org
!
Donc il nous faut aller voir à quoi correspond dyna.wikimedia.org
:
% dig dyna.wikimedia.org @ns0.wikimedia.org
…
dyna.wikimedia.org. 600 IN A 91.198.174.192
…
Et voilà on a notre adresse IP !
(Ici on a pris un raccourci, normalement on aurait dû aller demander quel était le serveur responsable de wikimedia.org
mais c'est le même que wikipedia.org
).
Attention au cache !
Évidemment on ne va pas re-demander au serveur racine à chaque fois quels sont les serveurs responsables de chaque TLD, si on a déjà l'information, elle est mise en cache pour un certain temps, à plusieurs niveaux (application, OS, serveur DNS local, etc.).
Syntaxe d'enregistrement
dyna.wikimedia.org. 600 IN A 91.198.174.192
Chaque enregistrement indique :
- son nom (
dynam.wikimedia.org
) - son TTL (Time-To-Live) : limite de temps avant qu'un résolveur ne doive aller re-demander l'enregistrement au serveur autoritaire (
600
secondes = 10 minutes) IN
pour INternet- le type de l'enregistrement (
A
) - la valeur (
91.198.174.192
)
Types d'enregistrements
- SOA = Infos sur le domaine (Start of Authority)
- A = Adresse IPv4
- AAAA = Adresse IPv6
- CNAME = Alias vers un autre nom
- MX = Serveur de mail responsable de la zone
- NS = Serveur DNS responsable de la zone
- TXT = Commentaire
Attention : le CNAME ne peut pas être utilisé pour un nom de domaine, seulement pour un sous-domaine ! (car il doit être le seul enregistrement !)
Priorité d'enregistrements
Les enregistrements de type MX
permettent de spécifier la priorité de chaque enregistrement :
% dig MX fastmail.fm +short
20 in2-smtp.messagingengine.com.
10 in1-smtp.messagingengine.com.
Ainsi ici les serveurs de mail vont essayer in1-smtp.messagingengine.com
en premier, et s'il ne répond pas, ils essaieront in2-smtp.messagingengine.com
.
La syntaxe du SOA
Le SOA est l'enregistrement le plus important avec NS. Il a une syntaxe spécifique : MNAME RNAME SERIAL REFRESH RETRY EXPIRE TTL
- MNAME = adresse du serveur DNS primaire (Master)
- RNAME = adresse email du Responsable (en remplaçant le
@
par un point.
) - SERIAL = numéro de dernière modification de la zone, doit être incrémenté à chaque modification de la zone (en général on utilise la date du jour + un nombre qui s'incrémente). C'est ce qui indique aux serveurs secondaires qu'ils doivent
- REFRESH = nombre de secondes avant que les serveurs secondaires ne doivent aller re-vérifier si le serial a changé. En général c'est 86400 (24 heures).
- RETRY = nombre de secondes avant que les secondaires ne relancent une requête si le primaire ne répond pas (générallement 7200 = 2 heures)
- EXPIRE = nombre de secondes avant que les secondaires doivent arrêter de relayer la zone si le primaire ne répond pas (en général 1000 heures = 41,6 jours)
- TTL = Time To Live = nombre de secondes avant qu'un résolveur doive ré-essayer si le serveur a répondu
NXDOMAIN
Exemple pour octopuce.fr
:
ubal.octopuce.fr. support.octopuce.fr.
2019051305 21600 3600 604800 3600
Les différents types de serveurs DNS
- Serveur racine : 13 serveurs (13 lettres) en Anycast (= 13 adresses IP, mais 600+ serveurs physiques répartis dans le monde), indique le serveur autoritaire d'un TLD
- Serveur responsable de TLD : serveur qui indique le serveur autoritaire d'un nom de domaine
- Serveur autoritaire de nom de domaine
- Serveur récursif : en général celui de votre FAI, ou de votre réseau local, c'est lui qui va faire les requêtes vers les serveurs racine, de TLD et autoritaire et renvoyer directement la réponse finale au client
Le serveur autoritaire
C'est celui qu'on est susceptible de mettre en place en tant que sysadmin, il répond aux requêtes pour un ou plusieurs domaines particuliers.
- C'est lui qui fait autorité sur un/des domaines (
AUTHORITY
) - Son autorité ne vaut rien si le serveur du TLD n'indique pas ce serveur comme étant responsable du domaine
Donc bien vérifier auprès du registrar (auquel vous avez payé le nom de domaine), que le domaine est bien configuré.
Serveur autoritaire primaire et secondaire
Il est possible de n'avoir qu'un seul serveur autoritaire pour un domaine, mais si celui-ci devient injoignable, tous vos noms de domaines sont aussi injoignables. En général on a donc un serveur primaire et un ou plusieurs serveurs secondaires.
Les serveurs secondaires enregistrent une copie de la zone depuis le serveur primaire. Pour faire cette copie ils envoient une requête AXFR
au serveur primaire qui leur renvoie tous les enregistrements de la zone.
Les clients eux iront demander à n'importe quel serveur listé comme NS
pour la zone, au hasard, qu'il soit primaire ou secondaire.
Notification des serveurs secondaires
Il existe deux manières pour un serveur secondaire de savoir s'il a besoin de mettre à jour une zone :
- le serveur primaire notifie les serveurs secondaires (message
NOTIFY
) - les secondaires vont demander le
SOA
toutes les x secondes (spécifié dans le paramètreREFRESH
duSOA
), et regarder si leSERIAL
duSOA
a changé depuis la dernière fois
De nos jours on utilise plutôt le NOTIFY
car ça permet d'avoir une répercussion immédiate des changements.
Le serveur récursif (résolveur)
C'est celui à qui on parle en général ! (enfin à qui son OS et ses applications parlent)
Il enregistre dans son cache les réponses qu'il a faites (en fonction )
Exemple pratique : mise en place d'un nom de domaine
- Achat du domaine
miammiammiam.com
auprès d'un registrar (par exemple OVH) - Configuration du domaine chez le registrar pour pointer sur nos serveurs DNS :
ns1.superboite.fr
etns2.superboite.fr
- Installation d'un serveur DNS sur nos deux serveurs NS1 et NS2
- Configuration de notre zone
miammiammiam.com
sur NS1 en master, et configuration de NS2 en secondaire - Vérification du fonctionnement : le SOA renvoyé par NS1 doit être le même que celui envoyé par NS2, et le serveur DNS de
.fr
doit bien indiquer nos deux serveurs DNS
Problèmes courants
- Mauvais serveur DNS indiqué auprès du registrar
- Problème de synchronisation entre le DNS primaire et un ou plusieurs DNS secondaires (le serial du SOA est-il identique ?)
- Problème de cache dans le résolveur de l'entreprise
Le résolveur envoie ses requêtes au hasard sur le DNS primaire ou l'un des DNS secondaires ! Il n'envoie pas déjà sur le primaire et ensuite sur les secondaires, c'est pas comme ça que ça marche !
Serveurs DNS
- Bind (le plus répandu)
- PowerDNS (très puissant et versatile)
Les deux permettent de faire résolveur et/ou serveur autoritaire. Pour 90% des cas, Bind suffit amplement.
Il est conseillé de séparer les deux fonctions toutefois. Je conseille de mettre un serveur résolveur qui n'écoute qu'en local sur 127.0.0.1
(ou sur une IP du réseau interne), et le serveur autoritaire sur l'IP publique (accessible depuis Internet). Perso je met un bind en local, et un PowerDNS (avec MySQL) en public.
Le futur
DNS n'est pas très sécurisé… Plusieurs solutions sont disponibles :
- DNSSEC : signature des zones, permet de valider que la réponse DNS n'a pas été modifiée par le résolveur en cours de route. N'empêche pas d'espionner les requêtes et réponses DNS.
- DNS over TLS, DNS over HTTPS : chiffrement de la connexion entre le client et le résolveur
- DNSCrypt : chiffrement et signature entre résolveur et client
DNSSEC peut être combiné avec DoT, DoH et DNSCrypt.
Comparaison DoH, DoT et DNSCrypt : https://dnscrypt.info/faq/
Aller plus loin
Exercice 1
Identifier le parcours DNS d'un résolveur récursif pour www.cesi.fr
avec dig
. (Copier/coller chaque étape)
Exercice 2
Identifier les adresses IP du serveur de mail le plus prioritaire pour gmail.com
.
Exercice 3
J'ai créé un nouveau site web sur dns1.sylvain.eliade.net
mais il ne marche pas.
Identifier la ou les erreurs commises et indiquer une solution.
Exercice 4
Identifier le reverse DNS de l'adresse IP correspondant au serveur de www.cesi.fr
Exercice 5 (facultatif)
Créer une zone Bind pour un domaine fictif avec un A et un AAAA sur le domaine lui-même, deux serveurs DNS, un SOA valide, deux serveurs de mail, et un CNAME de www qui redirige sur le domaine lui-même. Exemple :
$TTL 3600
@ IN SOA ns1.domain.tld. hostmaster.domain.tld. (
2017090401 ; SERIAL (DATE+NUMBER)
86400 ; REFRESH (SEC)
3600 ; RETRY (SEC)
3600000 ; EXPIRE (SEC)
300 ) ; MINIMUM (SEC)
@ IN NS ns1.domain.tld.
@ IN NS ns2.domain.tld.
ns1 IN A 10.1.2.2
ns2 IN A 10.1.2.3
@ IN A 127.0.0.1
@ IN AAAA ::1
@ IN MX 10 mx1.domain.tld.
@ IN MX 20 mx2.domain.tld.
mx1 IN A 10.1.1.1
mx2 IN A 10.1.1.2
www IN CNAME domain.tld.
Les point-virgules indiquent les commentaires
Exercice 6 (facultatif)
Installer bind (apt install bind9
). Par défaut il est configuré comme résolveur récursif local. L'utiliser pour faire des requêtes locales, par exemple : dig www.cesi.fr @localhost
Exercice 7 (facultatif)
Mettre en place la zone bind créée à l'exercice 6 dans l'installation du Bind local. Un tuto utile : https://www.adrienfuret.fr/2017/09/04/debian-dns-bind/
Tester le fonctionnement avec dig : dig domain.tld @localhost