Set-OPS-Public/roles/serveur_resolveur
Daniel Allaire e5841ea684
Some checks are pending
verifier / verifier (push) Waiting to run
dns : quatre zones inverses pour le site, et rien de plus
Le site ne servait aucun PTR. `serveur_powerdns_zone_inverse` derivait d'un
supernet /16 — la forme d'un TENANT, qui tire tout de son index. Un site ne
derive pas : il declare plusieurs /24 et n'a pas de supernet unique, si bien que
la derivation rendait une chaine vide et qu'aucune zone n'etait generee.

Le site revendique desormais exactement ce qu'il occupe :

  31.0.10.in-addr.arpa   32.0.10.in-addr.arpa
  33.0.10.in-addr.arpa   34.0.10.in-addr.arpa

Revendiquer `0.10.in-addr.arpa` d'un seul geste aurait ete plus simple et faux :
cette zone couvre aussi la frontiere, le transit et les hyperviseurs, qui ne sont
pas a lui. Une autorite qu'on s'attribue sans l'exercer est une panne differee —
le resolveur repondrait NXDOMAIN pour des adresses qu'un autre sait nommer.

LA DERIVATION VIT DANS UN FILTRE (`zones_inverses`) parce qu'elle a DEUX
appelants : `serveur_powerdns` ecrit ces zones, `serveur_resolveur` les delegue a
l'autoritatif. Deux calculs separes finiraient par diverger, et la divergence ne
se verrait qu'au premier PTR interroge. Le nom d'une zone dit sa profondeur —
trois etiquettes numeriques valent un /24, deux valent un /16 — et le modele en
deduit seul la forme du PTR.

DEUX CHEMINS MORTS TROUVES EN ROUTE.

Les zones etaient servies, et personne ne les demandait. `serveur_resolveur`
deleguait la zone directe par une `stub-zone` mais pas les inverses : `dig -x`
rendait vide depuis les cinq machines alors que la meme requete posee directement
a l'autoritatif repondait juste. Un service correct derriere un chemin que rien
n'emprunte.

Puis, les stubs poses, Unbound repondait toujours NXDOMAIN avec le drapeau `aa` —
une reponse AUTORITAIRE, sans jamais consulter le stub. Il embarque des
`local-zone` pour tout l'espace RFC1918 inverse. `nodefault` n'y change rien : ce
mode n'agit que si le nom correspond EXACTEMENT a une zone par defaut, et la
sienne est `10.in-addr.arpa`, le /8 entier. C'est `transparent` qui laisse la
requete suivre son cours — pour nos quatre zones seulement, la ou
`unblock-lan-zones` aurait ouvert tout l'espace prive.

Rien ne distinguait ce blocage d'une absence : le meme NXDOMAIN qu'un nom qui
n'existe pas.

AUSSI : les zones inverses sont desormais validees par `named-checkzone` comme la
directe (un fichier mal forme etait refuse en silence par PowerDNS), et une zone
qu'un ecosysteme cesse de revendiquer est retiree du repertoire.

VERIFICATION. Les cinq PTR resolvent depuis les cinq hotes par le resolveur, les
huit noms directs par le plancher ET par le DNS, et les deux roles sont
idempotents (changed=0).

P47 evalue la derivation sur cinq cas — un site a quatre zones, un tenant a une,
deux machines d'un meme /24 qui n'en font qu'une, aucune adresse, une adresse
illisible. Controle negatif verifie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-25 20:58:50 -04:00
..
defaults dns : quatre zones inverses pour le site, et rien de plus 2026-08-25 20:58:50 -04:00
handlers resolveur : un par tenant, et non plus un par machine 2026-08-24 16:59:34 -04:00
meta resolveur : un par tenant, et non plus un par machine 2026-08-24 16:59:34 -04:00
tasks resolveur : un par tenant, et non plus un par machine 2026-08-24 16:59:34 -04:00
templates dns : quatre zones inverses pour le site, et rien de plus 2026-08-25 20:58:50 -04:00
README.md resolveur : un par tenant, et non plus un par machine 2026-08-24 16:59:34 -04:00

serveur_resolveur

Le résolveur de l'écosystème : un seul Unbound pour tout le tenant, récursif depuis les serveurs racine, qui délègue la zone souveraine à PowerDNS.

Pourquoi un seul, et pourquoi ici

Avant le 2026-08-24, client_unbound posait un Unbound sur chaque VM. Ça marchait et c'était parfaitement étanche — mais c'était N démons identiques pour un service unique.

Mesure prise avant de décider : ~21 Mo de RSS par VM, et 28 à 189 requêtes servies depuis le démarrage. Le gain de cache mutualisé est donc négligeable ; ce qu'on récupère, c'est un démon au lieu de quatorze, et un endroit à regarder au lieu de quatorze.

Pourquoi pas sur la frontière

Un résolveur partagé par tout le SITE — l'OPNsense — aurait été le geste le plus économe. Il devrait alors connaître la zone interne de chaque tenant : sans vues par réseau soigneusement réglées, le tenant A résoudrait les noms du tenant B. C'est l'étanchéité qu'on protège partout ailleurs.

Et un tenant dont le résolveur vit chez l'hébergeur ne peut plus s'émanciper avec (voir docs/filiation-emancipation.md).

La récursion est générique ; la zone interne ne l'est pas. C'est ce qui fait du résolveur un service de tenant, et non de fabric.

La cohabitation avec l'autoritatif

Les deux vivent sur infra-dns-01 et voudraient le port 53. Le partage est dérivé, pas déclaré — l'exploitant n'a pas à se souvenir de déplacer un port parce qu'il a ajouté un rôle :

resolveur (Unbound)    10.29.19.11:53  +  127.0.0.1:53     la seule porte
autoritatif (PowerDNS) 127.0.0.1:5300                      derrière lui

Personne n'interroge l'autoritatif directement. Le résolveur le prend en stub-zone.

Aucun transitaire

forward-addr reste vide : Unbound récurse depuis la racine. Poser un transitaire reviendrait à confier chaque question de l'écosystème à un tiers — ce que la bascule du 2026-08-23 avait justement supprimé.

Ce qu'il vérifie avant de se déclarer bon

Il interroge sa propre adresse pour la zone interne et pour un nom de l'Internet. Un résolveur « active » qui ne répond pas est le pire des cas : toute la flotte pointe vers lui, et découvre la panne en essayant de résoudre — c'est-à-dire au moment où le diagnostic lui-même devient impossible.

Variables principales

Variable Défaut Rôle
serveur_resolveur_ecoutes loopback + IP du tenant où il répond
serveur_resolveur_reseaux_autorises le supernet du tenant qui a le droit de demander
serveur_resolveur_autoritatif 127.0.0.1:5300 la zone souveraine
serveur_resolveur_transitaires [] vide = récursion depuis la racine

Ce que ce rôle ne fait pas

Il ne bascule aucun /etc/resolv.conf — c'est le travail de client_resolveur, qui valide que ce service répond avant de désigner qui que ce soit.