ANY UDP tronque, AXFR/NOTIFY/UPDATE refuses depuis dehors, debit par /24 (rafale 300 -> 70 reponses, 230 tronquees). PowerDNS garde le 53 pour les primaires ; le frontal ecoute 1053, ou la frontiere redirigera. Sonde par le frontal. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| defaults | ||
| handlers | ||
| meta | ||
| tasks | ||
| templates | ||
| README.md | ||
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 le site
SITE site-dnspub-01 secondaire public ◄──────────────┘
- 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 en phase 1 (
disable-axfr=yes). La réplication vers le site pair passera par le tunnel WireGuard, plus tard. - 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.
Ce que la phase 1 n'expose pas
Aucun flux depuis Internet. Le port 53 public viendra en phase 2, par la redirection
de la frontière — et seulement après DNSSEC signé chez le locataire, CAA, et la limitation
de débit des réponses. Le déclarer aujourd'hui dans meta/flux.yml ferait émettre au
devis une règle sur le WAN que personne n'aurait décidée.
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.