Set-OPS-Public/roles/serveur_dns_public/README.md
Daniel Allaire cdac6d0ea5 doc dns : l'interne et le public, deux sites, avec les schemas des processus et des flux
docs/dns-interne.md couvre desormais le DNS public sur deux sites : vue d'ensemble, chemin
d'une requete interne, publication d'une zone, requete de l'Internet, NS d'une zone (cinq
schemas Mermaid), et les tableaux des flux, des declarations, des gardes et de la bascule.
README de serveur_powerdns et de serveur_dns_public a jour ; le wiki y renvoie.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:16:11 -04:00

80 lines
4.3 KiB
Markdown

# 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
(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
```
- **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`.
- **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.
- **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`.
## Exposé à l'Internet (phase 2)
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`,
`dns1.technolibre.ca`). Schémas, flux et ordre de bascule : `docs/dns-interne.md`, section
« Deux sites, deux serveurs de noms ».
## 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.