Set-OPS-Public/roles/serveur_powerdns/templates/pdns-public.conf.j2
Daniel Allaire 968caed3b1 inter-sites : le second serveur de noms, sur l'autre site, par le tunnel
- underlay.py : sites pairs lus dans leur depot frere (sites_pairs_actifs, sur_le_site,
  dns_public_des_pairs).
- Contrat du site : dns_public_pairs ; serveur_powerdns notifie et admet le pair ;
  resoudre_flux l'admet sur 5300.
- devis_opnsense : opnsense_liens_sites (regles et routes selon ou vit chaque locataire) ;
  P24 juge les routes du lien a part ; noms d'alias < 32 caracteres gardes ; le refus du
  groupe wireguard ne tranche plus (quick=0), et la garde le verifie.
- appliquer_opnsense : quick=0 transmis et dans l'identite d'une regle.
- proxmox_api : SETOPS_PROXMOX_API pour joindre l'API par un rebond.

Temoin depuis l'Internet : les deux zones repondent sur 51.79.45.193, signees.
95 preuves (make verifier), make test passe. CHANGELOG 149.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 03:26:52 -04:00

54 lines
2.8 KiB
Django/Jinja

# GENERE par Set-OPS (role serveur_powerdns). Ne pas editer a la main.
#
# L'INSTANCE PUBLIQUE DU LOCATAIRE — `pdns@public`, primaire cache de ses zones publiques.
#
# Elle ne sert QUE les zones `autorite: primaire-cache`. La zone `.internal` reste a
# l'instance principale, sur la boucle locale : le serveur public du site peut interroger
# celle-ci, jamais celle-la.
#
# Une instance nommee ne lit pas `pdns.d/` : tout ce dont elle a besoin est dit ici.
launch=bind
bind-config={{ serveur_powerdns_public_bind_config }}
bind-dnssec-db={{ serveur_powerdns_public_dnssec_db }}
# LE SOCKET DE CONTROLE VIT OU L'UNITE LE MET (mesure le 2026-09-16, en production).
#
# `pdns@.service` cree `RuntimeDirectory=pdns-%i`, soit `/run/pdns-public`. Sans ce reglage,
# `pdns_control --config-name=public` cherchait `/var/run/pdns/pdns-public.controlsocket`,
# ne le trouvait pas — et la notification du site echouait. Le handler l'avalait en silence.
socket-dir=/run/pdns-public
# LA SEULE INSTANCE QUI ECOUTE L'ADRESSE DE L'HOTE. Le pare-feu de la machine ne laisse
# frapper que le serveur public du site (flux `dns_public_site`).
local-address={{ ansible_host }}
local-port={{ serveur_powerdns_public_port }}
primary=yes
secondary=no
# LE TRANSFERT S'OUVRE A LA CLE, PAS A L'ADRESSE (eprouve le 2026-09-16).
#
# `allow-axfr-ips` et TSIG sont ALTERNATIFS : une adresse listee obtient la zone sans
# signature. Seule la boucle locale y figure — le serveur public du site n'y est jamais,
# et ne recoit la zone que signee par `TSIG-ALLOW-AXFR`.
#
# MESURE EN PRODUCTION (2026-09-17) : une fois `TSIG-ALLOW-AXFR` pose sur la zone, meme la
# boucle locale est refusee (« Transfer failed »). Pour imprimer la zone depuis la machine,
# signer la demande avec la cle en place :
# K=$(sudo -u pdns pdnsutil --config-name=public list-tsig-keys | awk '/^tsig-/{sub(/\.$/,"",$1); print $1":"$3; exit}')
# dig -y "hmac-sha256:$K" @{{ ansible_host }} -p {{ serveur_powerdns_public_port }} <zone> AXFR
disable-axfr=no
allow-axfr-ips=127.0.0.1/32
# NOTIFIER LE SEUL SERVEUR PUBLIC DU SITE (decouvert le 2026-09-16, dans les journaux).
#
# Par defaut, un primaire notifie AUSSI les adresses de ses enregistrements NS. Ici, ce
# sont les adresses PUBLIQUES des serveurs de noms : le primaire enverrait des
# notifications vers Internet depuis l'interieur du locataire. `only-notify` les borne.
# ET CEUX DES SITES PAIRS (2026-10-14) : le second serveur de noms tire la zone par le tunnel
# entre les sites, et doit apprendre qu'elle a change comme le premier.
only-notify={{ ([serveur_powerdns_dns_public_site] + serveur_powerdns_dns_public_pairs) | map('regex_replace', '$', '/32') | join(',') }}
also-notify={{ ([serveur_powerdns_dns_public_site] + serveur_powerdns_dns_public_pairs) | join(',') }}
version-string=anonymous
security-poll-suffix=