Set-OPS-Public/wiki/DNS-et-résolution.md
Daniel Allaire aab1bcc83a doc : rangee par lecteur, trois portes d'entree (architecture, setup, usage) et un index
README reduit au role du projet et au demarrage rapide. docs/architecture.md (schemas
Mermaid), docs/setup.md, docs/usage.md (154 cibles en 13 familles), docs/README.md (index).
Documents ranges en conception/, exploitation/, hebergement/, projet/ ; 598 chemins suivis.
QUICKSTART.md, SOLUTION.md, architecture-set-ops.md et la carte fondus puis retires.

Preuves : P48 lit l'index et conception/mecanismes.md ; les gardes parcourent docs/ sous-
dossiers compris (_documents) ; usage.md suit le Makefile dans les deux sens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 01:01:54 -04:00

91 lines
4.9 KiB
Markdown

# DNS & résolution de noms
> **Unité d'apprentissage.** Moule : ① concept → ② Set-OPS → ③ transférable → ④ à toi de jouer.
---
## ① Le concept *(générique)*
Les machines se parlent par **adresses IP** ; les humains (et les configs) utilisent des **noms**.
La **résolution de noms** fait le pont : `keycloak.chezlepro.internal` → `10.17.17.11`.
Plusieurs couches, de la plus locale à la plus globale :
- **Fichier hosts** (`/etc/hosts`) : une table statique, locale, **consultée en premier**, **sans
aucun réseau**. Increvable, mais manuelle.
- **DNS autoritatif** : le serveur qui **détient la vérité** d'une zone (ex. `chezlepro.internal`)
et répond pour ses noms (enregistrements **A**, **SOA**…).
- **DNS récursif (résolveur)** : celui que tes machines interrogent ; il **cherche pour toi**
(cache local, puis interne, puis Internet).
Distinction-clé souvent floue : **autoritatif** (« je *possède* ce nom ») ≠ **récursif** (« je *vais
chercher* la réponse pour toi »).
---
## ② Comment Set-OPS le fait — **trois couches**
| Couche | Pièce | Propriété |
|---|---|---|
| **1. Le plancher** | `hosts_statiques` (socle) → `/etc/hosts` sur **chaque** nœud | résout **même DNS éteint**, dès le bootstrap. Le filet en dessous de tout. |
| **2. Autoritatif** | `serveur_powerdns` (PowerDNS) | la zone interne, les enregistrements **A**. |
| **3. Récursif** | `serveur_resolveur` — **un** Unbound pour tout le tenant | récurse depuis la racine, délègue la zone souveraine à PowerDNS. |
| *(l'intégration)* | `client_resolveur` — **universelle**, sur chaque nœud | n'installe rien : écrit `/etc/resolv.conf` pour désigner le résolveur ci-dessus. |
> **Le récursif n'est plus « local », et il n'est plus optionnel.** Avant le 2026-08-24,
> `client_resolveur` posait un Unbound sur *chaque* VM — N démons identiques pour un service
> unique. Il n'installe plus rien, et son intégration est **universelle, sans aucune
> exemption** : pas même l'hôte qui porte le résolveur, qui se sert lui-même.
Le **plancher** est le cœur pédagogique : parce que chaque nœud connaît *tout l'écosystème* par
`/etc/hosts`, **rien ne dépend du DNS pour démarrer** — PowerDNS devient une *commodité*, pas un
point de défaillance unique. On construit la robustesse **de bas en haut**.
C'est aussi ce que **tu** utilises depuis ta machine : mettre
`10.17.16.11 keycloak.chezlepro.internal` dans ton `/etc/hosts`, c'est exactement le même
« plancher ».
---
## ③ Pourquoi c'est transférable
| Set-OPS | Équivalents ailleurs |
|---|---|
| `/etc/hosts` | identique sur tout OS (Linux, macOS, Windows) |
| PowerDNS autoritatif | BIND · Knot · NSD · Route 53 / Cloud DNS (autoritatifs) |
| Unbound récursif | `systemd-resolved` · dnsmasq · le résolveur de ton FAI · 1.1.1.1 |
Tu as appris **la hiérarchie de résolution** (hosts → récursif → autoritatif) et la distinction
**autoritatif/récursif** — pas « PowerDNS ». Ça vaut partout.
---
## ④ À toi de jouer
1. **Le plancher, sans DNS.** Sur un nœud :
```bash
getent hosts keycloak.chezlepro.internal # répond via /etc/hosts, zéro DNS
grep chezlepro /etc/hosts | head
```
2. **Interroge l'autoritatif.** Demande à PowerDNS directement :
```bash
dig @infra-dns-01.chezlepro.internal keycloak.chezlepro.internal A +short
dig @infra-dns-01.chezlepro.internal chezlepro.internal SOA +short
```
3. **Vois les couches.** Compare `getent hosts` (plancher) et `dig` (DNS) : **deux chemins**, même IP.
4. **Casse & répare.** Vide `/etc/hosts` de ses entrées `chezlepro` (garde une sauvegarde !)
**et** pointe `/etc/resolv.conf` ailleurs : la résolution interne **échoue**. Restaure
`/etc/hosts` seul : ça remarche **sans DNS**. Tu viens de *sentir* pourquoi le plancher
est le filet de sécurité.
5. **Le piège du récursif.** Demande un nom qui n'existe pas sous `internal.`, puis
redemande un nom qui existe. Si le résolveur répond NXDOMAIN aux deux, tu viens de
reproduire la panne de deux jours du 2026-09-02 : la racine étant signée, elle *prouve*
que `internal.` n'existe pas, et Unbound étend ce « non » à tout ce qui est dessous —
sans jamais interroger la stub-zone. Remède : `harden-below-nxdomain: no`.
---
## Pour aller plus loin *(dépôt)*
- Rôles : `roles/hosts_statiques` (le plancher), `roles/serveur_powerdns`, `roles/client_resolveur`.
- Conception des 3 couches + frontière publique : `docs/conception/dns-interne.md`.
- Le DNS **public** — le locataire écrit sa zone, deux sites la servent (`dns1.chezlepro.ca`, `dns1.technolibre.ca`) : schémas des processus et des flux dans `docs/conception/dns-interne.md`, et `roles/serveur_dns_public`.
- Note : `client_resolveur` est une **intégration universelle** (elle suit l'existence de `serveur_resolveur`) — voir l'unité *Liaisons* et `docs/conception/integrations-vm.md`.