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>
72 lines
3.9 KiB
Markdown
72 lines
3.9 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 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.
|