Set-OPS-Public/roles/serveur_powerdns/README.md

63 lines
3.3 KiB
Markdown
Raw Normal View History

# Rôle `serveur_powerdns`
> **Pour qui :** le mainteneur du DNS d'un écosystème. La vue d'ensemble, avec ses schémas,
> est dans `docs/conception/dns-interne.md`.
PowerDNS Authoritative, backend BIND, zones générées par Ansible depuis l'inventaire et le
plan. Pas de dépendance à PostgreSQL. Le rôle porte **deux instances**, qui ne se voient pas.
| Instance | Ce qu'elle sert | Écoute | Qui l'interroge |
|---|---|---|---|
| `pdns` (principale) | la zone interne (`.internal`) et ses zones inverses | `5300` sur la boucle locale quand le résolveur partage l'hôte, `53` sinon (port `derive`) | le résolveur de l'écosystème, seul |
| `pdns@public` | les zones `autorite: primaire-cache` du plan — primaire **caché** | `<hôte>:5300` | le serveur DNS public de chaque site, en TSIG |
**Une instance à part pour le public** : faire écouter la principale sur l'adresse de l'hôte
aurait permis au serveur public du site d'interroger la zone `.internal`.
## La zone interne
- Chaque hôte actif qui porte `ansible_host` reçoit son A, sans déclaration.
- Les noms exposés (`serveur_powerdns_expositions`) mènent au service ou à l'edge selon
`resolution_interne` du domaine.
- Les enregistrements en plus : `serveur_powerdns_records`.
## Les zones publiques (`tasks/zones-publiques.yml`)
Joué seulement là où le site a un serveur public à servir (`dns_public_site` non vide).
- **SOA et NS** : le serveur du site (`serveur_powerdns_dns_public_nom`) **et celui de
chaque pair** (`serveur_powerdns_dns_public_noms_pairs`). Seule la zone qui contient un de
ces noms en porte le A, à l'adresse publique de son site. Sans pair, le rendu est identique
octet pour octet.
- **Enregistrements** : ceux du plan (`plan/domaines.yml`), déjà passés au crible par
`valider_domaines`.
- **Le serial suit le contenu**, et l'état DNSSEC fait partie du contenu.
- **DNSSEC** : une clé CSK par zone, tenue dans la voûte du locataire
(`vault_dnssec_<zone>`), jamais créée sur la machine. Servie à l'heure (`SOA-EDIT EPOCH`).
- **Transfert** : TSIG seul l'ouvre (`allow-axfr-ips` ne garde que la boucle locale, parce
qu'une adresse listée obtiendrait la zone sans signature).
- **Notifications** : `only-notify` et `also-notify` limités à `dns_public_site` et
`dns_public_pairs` — les adresses que le contrat du site dépose dans la fiche.
- **Gardes** : nom de pair bien formé, adresse publique, distinct du nôtre, jamais
redéclaré.
## Variables
Celles qu'on règle, les autres se dérivent :
| Variable | Défaut | Source |
|---|---|---|
| `serveur_powerdns_zone` | `domaine_interne` | plan |
| `serveur_powerdns_records` | `[]` | inventaire |
| `serveur_powerdns_dns_public_site` | `dns_public_site` | contrat du site |
| `serveur_powerdns_dns_public_pairs` | `dns_public_pairs` | contrat du site |
| `serveur_powerdns_dns_public_nom` | `dns_public_nom` | contrat du site |
| `serveur_powerdns_dns_public_noms_pairs` | `dns_public_noms_pairs` | contrat du site |
| `serveur_powerdns_public_port` | `5300` | — |
## Flux
`meta/flux.yml` : l'entrée de la zone interne (port `derive`), la résolution sortante de
l'autoritatif pour ses propres besoins (il est exempté de `client_resolveur`), et l'entrée
`5300` UDP/TCP depuis le serveur public du site, seulement là où `pdns@public` existe.