docs/src/dns.md

280 lines
8.3 KiB
Markdown

# Le DNS
Le DNS (Domain Name System) est un système de distribution d'informations correspondant à des noms de domaines. Il est notamment utilisé pour obtenir des adresses IP à partir d'un nom de domaine, mais peut servir à obtenir n'importe quelle information suffisamment courte à partir d'un nom de domaine.
1. Le client DNS demande l'adresse IPv6 de `fr.wikipedia.org.` à un résolveur DNS récursif
2. Le résolveur DNS récursif demande l'adresse de `fr.wikipedia.org.` à `.`, l'un serveur racine.
3. Le serveur racine ne connait pas cette information, mais il sait comment s'en rapprocher : il répond l'adresse du serveur qui gère `org.`.
4. Le résolveur DNS récursif demande l'adresse de `fr.wikipedia.org.` au serveur de `org.`
5. Le serveur qui gère `org.` n'a pas cette information, mais sait comment s'en rapprocher et répond l'adresse du serveur qui gère `wikipedia.org.`.
6. Le résolveur DNS récursif demande l'adresse de `fr.wikipedia.org.` au serveur qui gère `wikipedia.org.`.
7. Cette information se trouve directement dans la zone servie par ce serveur, il lui répond donc l'adresse IPv6 de `fr.wikipedia.org.`.
8. Le résolveur DNS récusif répond finalement l'adresse IPv6 reçue au client DNS qui avait initié la demande.
## Les enregistrements DNS
Un enregistrement DNS est composé de plusieurs parties :
```
<domaine> <classe> <type> <ttl> <contenu>
```
`<domaine>`
: Le domaine concerné par l'enregistrement
`<classe>`
: Toujours IN (pour Internet)
`<type>`
: Le type de donnée contenue, voir description des types possible après dans la page
`<ttl>`
: Temps pendant lequel l'enregistrement peut être gardé en cache
`<contenu>`
: Dépends du type d'enregistrement
## Le cache
En réalité, un résolveur DNS récursif correct ne fera pas toutes ces requêtes à chaque fois. Il garde les données reçu des serveurs ayant autorité pendant la période de validité indiquée par ceux-ci, cette période s'appelle le TTL (Time-To-Live, temps à vivre). Cela permet de ne pas surcharger les serveurs ayant autorité les plus haut placés, qui devraient sans le cache des résolveurs répondre à beaucoup plus de requêtes.
Ce mécanisme signifie toutefois que la modification d'un enregisrement n'est assurée d'être effective partout qu'une fois que la durée du TTL précédent a expiré.
## Les enregistrements multiples
Il peut exister plusieurs valeurs pour un même type d'enregistrement et même domaine.
Ainsi, il est probable que le résolveur reçoivent plusieurs adresses de serveurs ayant autorité pour un domaine ou que le client recoive plusieurs adresses IPv6 pour le domaine demandé ; le résolveur ou le client n'utilisera alors généralement qu'une seule de ces adresses, choisie aléatoirement. Si jamais l'adresse ne fonctionne pas, l'une des autres adresses reçues sera essayée, ce qui permet une meilleure résistance aux pannes de serveurs.
## DNSSEC
DNSSEC est un système permettant de signer les données du DNS afin de permettre la vérification de leur intégrité.
Toutes les enregistrements DNS sont signés par le serveur ayant autorité dans la zone, et sa clé publique est publiée dans la zone parente. Pour la clé publique du serveur racine, qui n'a pas de zone parente, elle est préchargée dans les client DNS qui valident DNSSEC.
## Types d'enregistrements
### NS
Un enregistrements NS indique le serveur de noms qui a autorité pour un domaine. Pour s'assurer de la disponibilité du DNS, on en utilise généralement plusieus hébergés à des endroits différents, afin de mitiger les pannes.
Doit pointer vers un domaine qui dispose d'un enregistrement A/AAAA.
```
domain.exemple. 10800 IN NS ns1.dnshost.exemple.
domain.exemple. 10800 IN NS ns2.dnshost.exemple.
domain.exemple. 10800 IN NS ns3.dnshost.exemple.
```
### A et AAAA
Permet l'enregistrement d'une adresse au format IPv4 pour A et IPv6 pour AAAA
Il est recommandé d'indiquer les 2 si possible :
- l'IPv4 pour être compatible avec les infrastructures internet vétustes qui sont encore nombreuses
- l'IPv6 pour être compatible avec l'internet moderne qui offre plus de possibilités
```
host.exemple. 10800 IN AAAA 2001:db8::3
host.exemple. 10800 IN A 203.0.113.42
```
### TXT
Contient du texte.
```
antopie.org. 172800 IN TXT "v=spf1 a mx -all"
```
### CAA
Limiter les autorités de certification autorisées à émettre des certificats
```
antopie.org. 172800 IN CAA 0 issue "letsencrypt.org"
antopie.org. 172800 IN CAA 0 iodef "mailto:miraty+caa@antopie.org"
```
### SRV
Indiquer l'adresse d'un service spécifique.
Note : pour des raisons historiques et malgré la meilleure flexibilité permise par les enregistrements `SRV`, le DNS utilise les enregistrements `NS`, SMTP utilise le plus souvent les enregistrements `MX`, et HTTP utilise le plus souvent directement les enregistrements `A`/`AAAA`.
#### Syntaxe
```
_<service>._<protocole>.exemple. 10800 IN SRV <malus> <poids> <port> <cible>
```
`<service>`
: Nom arbitraire du service (exemples : `submission`, `imap`, `imaps`, `http`, `mumble`, `xmpp-server`, `xmpp-client`, `matrix`, `ldap`, `stun`, `stuns`, `turn`, `turns`...)
`<protocole>`
: Protocole de transport sur IP, selon le service généralement `tcp` ou `udp`
`<malus>` [0-65535]
: Les enregistrements avec la plus petite valeur seront utilisés d'abord
Un enregistrement ne sera utilisé que si les enregistrements avec un malus moindre ne sont pas joignables.
`<poids>` [0-65535]
: Pour des enregistrements avec le même malus, la probabilité d'être d'utilisé est proportionnelle à cette valeur
`<port>`
: Port de l'hôte du service
`<cible>`
: Domaine absolu de l'hôte du service
#### Exemples
```
_matrix._tcp.im.exemple. 86400 IN SRV 10 0 8448 a.im.exemple.
_matrix._tcp.im.exemple. 86400 IN SRV 5 50 1312 b.im.exemple.
_matrix._tcp.im.exemple. 86400 IN SRV 5 25 8448 c.im.exemple.
```
Signifie : Pour le service Matrix de `im.exemple` :
1. Utiliser avec 1 chance sur 3 `c.im.exemple:8448` et avec 2 chances sur 3 `b.im.exemple:1312`
2. Si aucun de ces 2 serveur n'est joignable, utiliser `a.im.exemple:8448`
```
_xmpp-client._tcp.im.example. 86400 IN SRV 5 0 5222 xmpp.im.example.
_xmpp-server._tcp.im.example. 86400 IN SRV 5 0 5269 xmpp.im.example.
```
### MX
Indiquer l'adresse du serveur recevant les courriels
```
example. 172800 IN MX 10 smtp.exemple.
```
### SSHFP
Indiquer les empreintes des clés SSH
#### Algorithme
1
: RSA
2
: DSA
3
: ECDSA
4
: Ed25519
6
: Ed448
#### Type
1
: SHA-1
2
: SHA-256
#### Exemples
```
ssh.example. SSHFP 4 2 7df9c981c9228fc9e4bff50e1d1ef8774a0f3496179f48fc8041ba746315c87a
```
### TLSA
Mettre en place DANE, pour permettre l'authentification des entitées nommée par le DNS
#### Usage
0 (PKIX-TA)
: Le certificat de l'entité doit être signé par ce certificat, ainsi que par une autorité de certification confiancée par le client
1 (PKIX-EE)
: Le certificat de l'entité doit être le même, et doit être signé par une autorité de certification confiancée par le client
2 (DANE-TA)
: Le certificat de l'entité doit être signé par ce certificat, et n'a pas à être signé par une autorité de certification
3 (DANE-EE)
: Le certificat de l'entité doit être le même, et n'a pas à être signé par une autorité de certification
#### Selecteur
0
: Certificat entier
1
: Seulement la clé publique du certificat
#### Méthode de correspondance
0
: Directe
1
: SHA-256
2
: SHA-512
#### Exemple
```
_443._tcp.host.example. 172800 IN TLSA 2 1 1 0B9FA5A59EED715C26C1020C711B4F6EC42D58B0015E14337A39DAD301C5AFC3
```
### CNAME
Définir un domaine comme étant l'alias d'un autre
```
blog.example. 86400 IN CNAME host.example.
www.example. 86400 IN CNAME host.example.
play.example. 86400 IN CNAME host.example.
host.example. 10800 IN AAAA 2001:db8::3
host.example. 10800 IN A 203.0.113.42
```
### DNAME
Définir les sous-domaines d'un domaine comme étant les alias des sous-domaines d'un autre domaine
### LOC
Indiquer des coordonnées géographiques
```
d1 [m1 [s1]] "N"|"S" d2 [m2 [s2]] "E"|"W" alt["m"] [siz["m"] [hp["m"] [vp["m"]]]]
```
Avec :
`d1` [0 .. 90]
: Degrés en latitude
`d2` [0 .. 180]
: Degrés en longitude
`m1`, `m2` [0 .. 59]
: Minutes
`s1`, `s2` [0 .. 59.999]:
: Secondes
`alt` [-100000.00 .. 42849672.95]
: Altitude en mètres
`siz`, `hp`, `vp` [0 .. 90000000.00]
: (size/precision in meters)
```
exemple. 172800 IN LOC 49 0 0.000 N 2 0 0.000 W 0.00m 10m 0.00m 0.00m
```