2026-09-16 18:08:20 -04:00
# serveur_dns_public
> **Pour qui :** l'hébergeur qui publie les noms de ses locataires sur Internet.
**Le serveur DNS public du site.** Il est **secondaire** de toutes les zones publiques des
locataires qu'il héberge. Il ne porte aucune donnée à lui : le locataire écrit sa zone, le
site la sert.
## Le locataire écrit, le site sert
```
LOCATAIRE infra-dns-01 primaire caché de chezlepro.ca ─┐ NOTIFY
2026-10-14 21:16:11 -04:00
(autorite: primaire-cache) │ AXFR signé TSIG, tiré par chaque site
SITE site-dnspub-01 secondaire public ◄──────────────┤
SITE PAIR site-dnspub-01 secondaire public ◄──────────────┘ par le lien entre les sites
2026-09-16 18:08:20 -04:00
```
- **Le primaire reste chez le locataire.** Quand il part, il emporte sa zone, et le site
n'a qu'à cesser d'être secondaire. Écrire les zones au site ferait de l'hébergeur la
source des données du client.
- **La liste des zones se dérive** de tous les locataires du site, dans
`scripts/site_inventaire.py` . Jamais une liste tenue à la main.
- **Uniquement `autorite: primaire-cache` .** Le rôle refuse une zone `.internal` : ce
serveur répond à Internet.
## Ce que l'épreuve de l'outil a appris (2026-09-16, PowerDNS 4.9.17)
Deux instances jetables, sept vérifications, avant d'écrire une ligne de ce rôle.
| Constat | Ce que le rôle en fait |
|---|---|
| ** `allow-axfr-ips` et TSIG sont alternatifs, pas cumulatifs** : une adresse listée obtient la zone *sans signature* | le primaire n'autorise **aucune** adresse ; seule la clé ouvre le transfert |
| `allow-axfr-ips` autorise la boucle locale **par défaut** | un test négatif depuis la boucle locale n'en est pas un |
| le backend `bind` seul ne stocke **aucune** métadonnée | `bind-dnssec-db` porte les clés TSIG |
| la syntaxe exige `masters { ip:port; };` | sans accolades, **tout** le fichier est refusé |
| le primaire notifie **aussi les adresses de ses NS** | le primaire restreint ses notifications au seul serveur public du site |
## Durcissement
- **Secondaire seulement** : `secondary=yes` , `primary=no` .
2026-10-14 21:16:11 -04:00
- **Aucun transfert sortant** (`disable-axfr=yes`). Le site pair ne copie pas ce serveur :
il tire chaque zone **du primaire du locataire** , par le lien entre les sites (2026-10-14).
Un site qui tombe n'emporte pas la copie de l'autre.
2026-09-16 18:08:20 -04:00
- **Notifications acceptées des seuls primaires déclarés.**
- **`version-string=anonymous`** : la version est la première chose qu'un balayage demande.
- **`security-poll-suffix=`** vide : PowerDNS interroge par défaut un domaine de l'éditeur
à chaque démarrage. Un serveur souverain n'appelle pas un tiers.
- **Pas de récursion** : PowerDNS Authoritative ne récurse pas — vérifié, il répond
`REFUSED` .
2026-10-14 21:16:11 -04:00
## Exposé à l'Internet (phase 2)
2026-09-16 18:08:20 -04:00
2026-10-14 21:16:11 -04:00
Le 53 public arrive par la redirection de la frontière vers le frontal (`dnsdist`, `1053` ),
après DNSSEC signé chez le locataire, CAA, et la limitation de débit — P82 refuse l'inverse.
Au site de TechnoLibre, il arrive par le relais et le tunnel `opt9` de `requin` .
## Deux sites, deux serveurs
`dns_public_pairs` (plan du site, déclaré des deux côtés) fait de chaque site le second
serveur de noms de l'autre. Chaque zone désigne les deux (`dns1.chezlepro.ca`,
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:34 -04:00
`dns1.technolibre.ca` ). Schémas, flux et ordre de bascule : `docs/conception/dns-interne.md` , section
2026-10-14 21:16:11 -04:00
« Deux sites, deux serveurs de noms ».
2026-09-16 22:29:19 -04:00
## Le frontal public : dnsdist (2026-09-16, phase 2)
L'Internet ne frappe jamais PowerDNS directement. `dnsdist` écoute
`<hôte>:serveur_dns_public_frontal_port` (1053) — la frontière y redirige son 53 public — et
relaie à PowerDNS, qui garde le 53 de la machine pour les NOTIFY des primaires et le site.
| Règle | Effet | Éprouvé |
|---|---|---|
| opcode ≠ QUERY | REFUSED (NOTIFY, UPDATE venus de dehors) | NOTIFY → REFUSED |
| AXFR / IXFR | REFUSED | « Transfer failed » |
| ANY en UDP | tronqué (RFC 8482) | `dig +notcp` → `tc` |
| débit UDP > 20 q/s par /24 (/48) | tronqué : le client légitime passe en TCP | rafale 300 → 70 réponses, 230 tronquées |
| débit TCP > 40 q/s par /24 (/48) | abandon | — |
Piège de mesure : `dig` envoie ANY **en TCP** par défaut. Sans `+notcp` , la règle semble
inopérante. La sonde `zones-publiques` interroge **par le frontal** : c'est le chemin de
l'Internet, et le seul qui voit PowerDNS et dnsdist ensemble.