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>
This commit is contained in:
parent
16e87bfd41
commit
cdac6d0ea5
5 changed files with 323 additions and 26 deletions
24
CHANGELOG.md
24
CHANGELOG.md
|
|
@ -1,3 +1,27 @@
|
|||
## 2026-10-14 (153) — La doc du DNS rattrape les deux sites, avec ses schémas
|
||||
|
||||
**95 preuves.** `make verifier` passe (site de Chezlepro). Documentation seulement : aucun
|
||||
rôle, gabarit ni script ne change.
|
||||
|
||||
`docs/dns-interne.md` s'arrêtait au 2026-09-16 : un seul serveur de noms, et `technolibre.ca`
|
||||
qui « attend que `dns1.chezlepro.ca` soit publié ». Il couvre désormais l'interne et le public
|
||||
(titre « DNS : interne et public »), avec cinq schémas Mermaid, que la forge dessine :
|
||||
- **vue d'ensemble** : les primaires cachés des locataires, les deux serveurs publics, leurs
|
||||
chemins depuis l'Internet (WAN de `bifrost-1` ; relais puis `requin`) ;
|
||||
- **le chemin d'une requête interne** : plancher, Unbound, PowerDNS sur la boucle locale,
|
||||
résolveur du site pour un locataire neuf, `resolution_interne` ;
|
||||
- **publier une zone** (séquence) : rendu depuis le plan, NOTIFY, SOA, AXFR TSIG vers chaque
|
||||
site, dont l'autre par le lien entre les sites ;
|
||||
- **une requête de l'Internet** (séquence) : frontière, dnsdist, PowerDNS, `reply-to` du relais ;
|
||||
- **les NS d'une zone** : `dns_public_nom` de chaque site, par le contrat, jusqu'au gabarit.
|
||||
|
||||
Et les tableaux des flux, de ce qui se déclare et où, des gardes, et l'ordre de bascule chez
|
||||
un registraire (colle de chaque `dns1`, puis NS, puis DS).
|
||||
|
||||
Les README de `serveur_powerdns` (de juin : ni zones publiques, ni DNSSEC, ni pairs) et de
|
||||
`serveur_dns_public` (« la réplication passera par le tunnel, plus tard » ; « rien n'est
|
||||
exposé ») sont à jour ; la page DNS du wiki y renvoie.
|
||||
|
||||
## 2026-10-14 (152) — L'administration du site de TechnoLibre, par le lien entre les sites
|
||||
|
||||
**95 preuves.** `make verifier` passe (site de Chezlepro), `devis_opnsense.py --verifier` est
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
# DNS interne
|
||||
# DNS : interne et public
|
||||
|
||||
> **Pour qui :** le **mainteneur** du DNS interne.
|
||||
> **Pour qui :** le **mainteneur** du DNS, et l'**exploitant** d'un site qui publie les noms
|
||||
> de ses locataires. Le nom du fichier date du temps où il ne couvrait que l'interne.
|
||||
|
||||
Le service DNS interne est la premiere capacite de plateforme.
|
||||
|
||||
|
|
@ -10,6 +11,51 @@ Le service DNS interne est la premiere capacite de plateforme.
|
|||
> que PowerDNS ne soit la). PowerDNS devient une **commodite** (zone, externe,
|
||||
> dynamique), plus un point de defaillance.
|
||||
|
||||
## Vue d'ensemble
|
||||
|
||||
Deux services distincts, qui ne se parlent pas :
|
||||
|
||||
- **la résolution interne** — chaque écosystème résout ses propres noms (`*.internal`) et
|
||||
l'Internet pour ses machines. Rien n'en sort.
|
||||
- **le DNS public** — les zones publiques des locataires (`chezlepro.ca`, `technolibre.ca`),
|
||||
écrites chez le locataire, servies à l'Internet par **deux sites**, sous deux noms.
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
NET(("Internet"))
|
||||
subgraph LOC["Les locataires — vivent au site de Chezlepro"]
|
||||
direction TB
|
||||
P1["infra-dns-01 · OPS-Chezlepro · 10.17.19.11<br/>pdns@public :5300<br/>primaire caché, signe DNSSEC"]
|
||||
P2["infra-dns-01 · OPS-Technolibre · 10.23.19.11<br/>pdns@public :5300<br/>primaire caché, signe DNSSEC"]
|
||||
end
|
||||
subgraph SC["Site de Chezlepro"]
|
||||
direction TB
|
||||
BIF["bifrost-1<br/>WAN 69.70.26.62:53"]
|
||||
S1["site-dnspub-01 · 10.37.37.21<br/>dnsdist :1053 → PowerDNS :53<br/><b>dns1.chezlepro.ca</b>"]
|
||||
BIF -- "redirection :1053" --> S1
|
||||
end
|
||||
subgraph ST["Site de TechnoLibre"]
|
||||
direction TB
|
||||
REL["relais · VPS OVH<br/>51.79.45.193"]
|
||||
REQ["requin<br/>opt9 RELAIS · opt10 lien"]
|
||||
S2["site-dnspub-01 · 10.31.37.21<br/>dnsdist :1053 → PowerDNS :53<br/><b>dns1.technolibre.ca</b>"]
|
||||
REL -- "tunnel WireGuard" --> REQ
|
||||
REQ -- "redirection :1053" --> S2
|
||||
end
|
||||
P1 & P2 -- "NOTIFY · AXFR signé TSIG" --> S1
|
||||
P1 & P2 -. "NOTIFY · AXFR signé TSIG<br/>par le lien entre les sites" .-> S2
|
||||
NET -- "53" --> BIF
|
||||
NET -- "53" --> REL
|
||||
```
|
||||
|
||||
| Pièce | Rôle | Où | Section |
|
||||
|---|---|---|---|
|
||||
| plancher `/etc/hosts` | résout la flotte, DNS éteint | chaque VM | [Trois couches](#trois-couches-et-une-seule-est-optionnelle) |
|
||||
| Unbound | LE résolveur d'un écosystème | `infra-dns-01` (locataire), `site-dns-01` (site) | idem |
|
||||
| PowerDNS principal | autorité sur la zone `.internal` | boucle locale, derrière Unbound | idem |
|
||||
| PowerDNS `pdns@public` | primaire caché des zones publiques | `infra-dns-01` du locataire, `:5300` | [Zones publiques](#zones-publiques) |
|
||||
| PowerDNS + dnsdist | serveur de noms public du site, secondaire | `site-dnspub-01` de chaque site | [Deux sites](#deux-sites-deux-serveurs-de-noms) |
|
||||
|
||||
## Trois couches, et une seule est optionnelle
|
||||
|
||||
> **Ce paragraphe decrivait le modele d'avant le 2026-08-24** — un Unbound *sur chaque VM*,
|
||||
|
|
@ -36,6 +82,31 @@ lui-meme. L'ancien nom (`client_unbound`) mentait des lors qu'il n'installait pl
|
|||
l'ecosysteme garde la resolution d'amorcage de cloud-init. C'est un choix valide, pas une
|
||||
panne.
|
||||
|
||||
### Le chemin d'une requête interne
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
Q["Une machine du locataire<br/>cherche un nom"] --> H{"/etc/hosts<br/>le plancher"}
|
||||
H -- "machine de la flotte" --> A1["adresse — sans DNS"]
|
||||
H -- "autre nom" --> U["Unbound · infra-dns-01:53<br/>serveur_resolveur"]
|
||||
U -- "*.internal et zone inverse<br/>stub-zone" --> PA["PowerDNS principal<br/>127.0.0.1:5300"]
|
||||
U -- "tout le reste<br/>récursion depuis la racine" --> NET(("Internet"))
|
||||
Q -. "locataire neuf, sans résolveur à lui" .-> SD["site-dns-01<br/>le résolveur du site<br/>serveur_resolveur_site"]
|
||||
```
|
||||
|
||||
- **Le résolveur est la seule porte.** Quand PowerDNS partage l'hôte d'Unbound, il écoute
|
||||
sur la boucle locale (`5300`) : personne ne l'interroge directement (port `derive`,
|
||||
`roles/serveur_powerdns/meta/flux.yml`).
|
||||
- **Le site prête ses noms aux locataires neufs.** Tant qu'un locataire n'a pas son
|
||||
résolveur, `client_resolveur` le fait interroger celui du site (`serveur_resolveur_site`,
|
||||
dont la liste d'autorisation se dérive des locataires hébergés), puis le bascule chez lui.
|
||||
- **Où mène un nom exposé, vu de l'intérieur** : `resolution_interne` dans
|
||||
`plan/domaines.yml`. `service` (le site) : la zone mène au service lui-même — l'edge est
|
||||
pour les personnes. `edge` (défaut, les locataires) : la machine passe par l'edge, parce
|
||||
que certains services n'existent en HTTPS que derrière lui (Keycloak).
|
||||
- **Une machine qui naît** interroge `dns_amorcage` (la patte de la frontière) tant que le
|
||||
résolveur de son site n'existe pas.
|
||||
|
||||
## Groupes
|
||||
|
||||
```text
|
||||
|
|
@ -196,9 +267,13 @@ publiquement, et il en faut **deux** (exigence du registre `.ca`). Une mesure qu
|
|||
« mesure impossible », jamais « absent ». Sa limite est écrite à chaque rapport : sans
|
||||
transfert de zone, un export chez le fournisseur actuel reste la seule preuve d'exhaustivité.
|
||||
|
||||
Au 2026-09-16 : `chezlepro.ca` reproduit la production (rien ne serait perdu) ;
|
||||
`technolibre.ca` est **préparée, pas basculée** — la décision revient au responsable désigné
|
||||
de TechnoLibre, et elle attend que `dns1.chezlepro.ca` soit publié.
|
||||
Le devis sonde aussi **la colle de chaque serveur désigné** — ceux du site et ceux des pairs
|
||||
([Deux sites](#deux-sites-deux-serveurs-de-noms)).
|
||||
|
||||
Au 2026-10-14 : les deux zones sont servies par les deux sites, signées, au même serial ;
|
||||
**aucune n'est basculée chez son registraire**. `chezlepro.ca` reproduit la production
|
||||
(rien ne serait perdu). La décision pour `technolibre.ca` revient au responsable désigné de
|
||||
TechnoLibre.
|
||||
|
||||
### Signature DNSSEC : le locataire signe, avec la clé de sa voûte
|
||||
|
||||
|
|
@ -239,3 +314,147 @@ La sonde `zones-publiques` du site alerte sur une zone signée servie **nue**, a
|
|||
**Ordre de la mise en service** : basculer les serveurs de noms (zone signée, sans DS : le
|
||||
domaine reste « non sécurisé », pas cassé), vérifier, **puis** remettre le DS au registraire.
|
||||
Jamais l'inverse.
|
||||
|
||||
## Deux sites, deux serveurs de noms
|
||||
|
||||
> Ajouté le 2026-10-14. Le registre des `.ca` exige deux serveurs de noms ; deux serveurs
|
||||
> sur le même réseau tomberaient ensemble. Le second est au site de TechnoLibre, tenu par une
|
||||
> autre organisation, sur un autre réseau.
|
||||
|
||||
**Chaque site sert les zones publiques de tous les locataires qu'il connaît : les siens, et
|
||||
ceux de son pair.** Les deux serveurs sont **secondaires** l'un comme l'autre, et tirent
|
||||
chacun la zone **directement du primaire du locataire** — jamais l'un de l'autre
|
||||
(`disable-axfr=yes` au site). Un site qui tombe n'emporte donc pas la copie de l'autre.
|
||||
|
||||
| Site | Serveur | Nom public | Adresse publique | Chemin depuis l'Internet |
|
||||
|---|---|---|---|---|
|
||||
| Chezlepro | `site-dnspub-01` · `10.37.37.21` | `dns1.chezlepro.ca` | `69.70.26.62` | WAN de `bifrost-1` → `:1053` |
|
||||
| TechnoLibre | `site-dnspub-01` · `10.31.37.21` | `dns1.technolibre.ca` | `51.79.45.193` | relais (VPS) → tunnel `opt9` de `requin` → `:1053` |
|
||||
|
||||
### Publier une zone
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
autonumber
|
||||
participant X as Exploitant du locataire
|
||||
participant P as pdns@public<br/>infra-dns-01 du locataire
|
||||
participant C as site-dnspub-01<br/>site de Chezlepro
|
||||
participant T as site-dnspub-01<br/>site de TechnoLibre
|
||||
X->>P: rôle serveur_powerdns — la zone est rendue depuis le plan
|
||||
Note over P: SOA et NS = dns1 du site + dns1 de chaque pair<br/>serial = suit le contenu · signée avec la clé de la voûte
|
||||
P-)C: NOTIFY (only-notify : les seuls serveurs du contrat)
|
||||
P-)T: NOTIFY, par le lien entre les sites
|
||||
C->>P: SOA ? (UDP 5300)
|
||||
C->>P: AXFR signé TSIG (TCP 5300)
|
||||
P-->>C: zone déjà signée — servie telle quelle (PRESIGNED)
|
||||
T->>P: SOA ? puis AXFR signé TSIG, par le lien
|
||||
P-->>T: zone déjà signée
|
||||
```
|
||||
|
||||
- **Le locataire écrit, les sites servent.** Les deux sites ne détiennent ni la zone en
|
||||
source, ni la clé DNSSEC.
|
||||
- **`only-notify` et `also-notify`** bornent les notifications aux adresses du contrat du
|
||||
site (`dns_public_site` et `dns_public_pairs`). Sans eux, le primaire notifierait les
|
||||
adresses publiques de ses NS, depuis l'intérieur du locataire.
|
||||
- **Le transfert passe par le lien** quand le secondaire est sur l'autre site : la frontière
|
||||
du site où vit le locataire laisse entrer le transfert et sortir les NOTIFY ; celle du site
|
||||
qui réplique pose une route `/32` vers chaque primaire. Le devis les dérive de la fiche que
|
||||
porte chaque locataire (où il vit), et P24 juge ces routes à part.
|
||||
|
||||
### Une requête de l'Internet
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant R as Résolveur sur Internet
|
||||
participant F as Frontière<br/>bifrost-1 ou requin
|
||||
participant D as dnsdist :1053
|
||||
participant A as PowerDNS :53
|
||||
R->>F: chezlepro.ca MX ? (port 53)
|
||||
Note over F: TechnoLibre : arrive par le relais et le tunnel opt9,<br/>et repart par lui (reply-to RELAIS_GW)
|
||||
F->>D: redirection vers :1053
|
||||
Note over D: refuse NOTIFY, UPDATE, AXFR · tronque ANY en UDP<br/>débit borné par /24
|
||||
D->>A: requête admise
|
||||
A-->>D: réponse signée
|
||||
D-->>R: réponse
|
||||
```
|
||||
|
||||
**Sans `reply-to`, la réponse du site de TechnoLibre se perdrait** : elle repartirait par la
|
||||
route par défaut, le WAN, qui n'a qu'une adresse privée en amont (mesuré le 2026-10-13).
|
||||
|
||||
### Les flux
|
||||
|
||||
| Flux | De | Vers | Port | Chemin |
|
||||
|---|---|---|---|---|
|
||||
| Requête publique | Internet | dnsdist du site | 53 → 1053, UDP et TCP | redirection de la frontière ; par le relais au site de TechnoLibre |
|
||||
| Requête admise | dnsdist | PowerDNS du site | 53, boucle de l'hôte | local |
|
||||
| NOTIFY | `pdns@public` du locataire | PowerDNS de chaque site | 53/UDP | local ; par le lien vers l'autre site |
|
||||
| SOA, puis AXFR TSIG | PowerDNS de chaque site | `pdns@public` du locataire | 5300, UDP puis TCP | local ; par le lien depuis l'autre site |
|
||||
| Résolution interne | machine du locataire | Unbound de son écosystème | 53 | dans l'écosystème |
|
||||
| Zone `.internal` | Unbound | PowerDNS principal | 5300, boucle locale | local |
|
||||
| Récursion | Unbound | Internet | 53 | sortie de la frontière |
|
||||
|
||||
Ces flux sont déclarés par les rôles (`meta/flux.yml` de `serveur_dns_public`,
|
||||
`serveur_powerdns`, `serveur_resolveur`) et par le lien (`opnsense_liens_sites`) ; le devis
|
||||
de la frontière et le pare-feu Proxmox en dérivent leurs règles. Aucun n'est écrit à la
|
||||
main sur une frontière.
|
||||
|
||||
### Ce qui se déclare, et où
|
||||
|
||||
| Clé | Fichier | Ce qu'elle décide |
|
||||
|---|---|---|
|
||||
| `autorite: primaire-cache`, `dnssec`, `enregistrements` | `plan/domaines.yml` du **locataire** | la zone est publique, signée, et ce qu'elle porte |
|
||||
| `dns_public_nom` | `plan/10-intrants.yml` du **site** | le nom de SON serveur de noms (`dns1.<domaine de l'organisation>`) |
|
||||
| `dns_public_pairs` | plan du **site**, des deux côtés | le site pair qui réplique ; `inactif` n'émet rien |
|
||||
| `opnsense_liens_sites` | `opnsense.yml` du **site** | le tunnel que prennent NOTIFY et transferts |
|
||||
| `opnsense_wan_ip` | `opnsense.yml` du **site** | l'adresse publique de son serveur de noms |
|
||||
|
||||
Le **contrat du site** (`make site-intrants`) en tire, pour chaque locataire, ce qu'il
|
||||
dépose dans sa fiche (`fiche-site.yml`) : `dns_public_site`, `dns_public_pairs`,
|
||||
`dns_public_nom` et `dns_public_noms_pairs` (le nom et l'adresse publique du serveur de
|
||||
chaque pair, lus dans **son** plan et **sa** carte, par les mêmes fonctions que pour le site
|
||||
lui-même).
|
||||
|
||||
### Les NS d'une zone
|
||||
|
||||
```mermaid
|
||||
flowchart LR
|
||||
PC["plan du site de Chezlepro<br/>dns_public_nom: dns1.chezlepro.ca"] --> K["contrat du site<br/>fiche du locataire"]
|
||||
PT["plan du site de TechnoLibre<br/>dns_public_nom: dns1.technolibre.ca<br/>+ opnsense_wan_ip"] -- "dns_public_noms_pairs" --> K
|
||||
K --> Z["zone-publique.db.j2<br/>chez le locataire"]
|
||||
Z --> NS["chezlepro.ca — NS dns1.chezlepro.ca, NS dns1.technolibre.ca<br/>A de dns1.chezlepro.ca : seulement dans chezlepro.ca<br/>A de dns1.technolibre.ca : seulement dans technolibre.ca"]
|
||||
```
|
||||
|
||||
- **Un site, un nom** : `dns1` sous le domaine de l'organisation qui tient le site. Pas
|
||||
`ns1`/`ns2`, qui existent en production à d'autres adresses.
|
||||
- **Seule la zone qui contient un nom en porte le A**, à l'adresse publique de **son** site.
|
||||
Les autres zones ne le désignent que par son nom.
|
||||
- **Sans pair, le rendu est identique octet pour octet** à celui d'un site seul.
|
||||
|
||||
### Les gardes
|
||||
|
||||
| Garde | Où | Ce qu'elle refuse |
|
||||
|---|---|---|
|
||||
| relation des deux côtés | P82 (`prouver._dns_paires`) | un pair déclaré d'un seul côté — le second serveur serait vide sans que personne le voie |
|
||||
| un pair nomme son serveur | P82 (`prouver._dns_paires`) | un pair actif sans `dns_public_nom` — ses zones n'en désigneraient qu'un, alors qu'il les sert |
|
||||
| signé avant exposé | P82 | exposer un serveur public dont une zone n'est pas signée |
|
||||
| nom et adresse du pair | `serveur_powerdns` (`zones-publiques.yml`) | un nom mal formé, une adresse privée, un nom égal au nôtre, un nom redéclaré |
|
||||
| contrat déposé | `make site-intrants-verifier` | une fiche de locataire qui diffère du contrat (une adresse faussée la rend NON CONFORME) |
|
||||
| routes du lien | P24 | une route `/32` qu'aucune règle du lien n'utilise |
|
||||
| zone servie nue | sonde `zones-publiques` | une zone signée servie sans signature ; signatures sous 6 jours (avertit), sous 3 (alerte) |
|
||||
|
||||
### Basculer chez un registraire
|
||||
|
||||
L'ordre, pour chaque domaine :
|
||||
|
||||
1. **`make dns-bascule-devis`** — rien ne serait perdu, et chaque serveur désigné résout déjà
|
||||
publiquement.
|
||||
2. **La colle** chez le registraire du domaine qui contient le nom : `dns1.chezlepro.ca`
|
||||
chez celui de `chezlepro.ca`, `dns1.technolibre.ca` chez celui de `technolibre.ca`.
|
||||
3. **Les deux NS** chez le registraire de la zone basculée. Zone signée, sans DS : le domaine
|
||||
reste « non sécurisé », pas cassé.
|
||||
4. **Vérifier** depuis l'Internet, sur les deux adresses.
|
||||
5. **Puis seulement le DS** (`make dnssec-ds`). Jamais l'inverse.
|
||||
|
||||
**État au 2026-10-14** : les deux sites servent `chezlepro.ca` et `technolibre.ca` au même
|
||||
serial, chacune avec deux NS signés. **Ni la colle ni les NS ne sont encore chez les
|
||||
registraires.**
|
||||
|
|
|
|||
|
|
@ -10,8 +10,9 @@ site la 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 ◄──────────────┘
|
||||
(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
|
||||
|
|
@ -37,8 +38,9 @@ Deux instances jetables, sept vérifications, avant d'écrire une ligne de ce r
|
|||
## 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.
|
||||
- **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
|
||||
|
|
@ -46,12 +48,18 @@ Deux instances jetables, sept vérifications, avant d'écrire une ligne de ce r
|
|||
- **Pas de récursion** : PowerDNS Authoritative ne récurse pas — vérifié, il répond
|
||||
`REFUSED`.
|
||||
|
||||
## Ce que la phase 1 n'expose pas
|
||||
## Exposé à l'Internet (phase 2)
|
||||
|
||||
**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 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)
|
||||
|
||||
|
|
|
|||
|
|
@ -1,17 +1,62 @@
|
|||
# Role `serveur_powerdns`
|
||||
# Rôle `serveur_powerdns`
|
||||
|
||||
Installe et configure PowerDNS Authoritative comme service DNS interne initial.
|
||||
> **Pour qui :** le mainteneur du DNS d'un écosystème. La vue d'ensemble, avec ses schémas,
|
||||
> est dans `docs/dns-interne.md`.
|
||||
|
||||
Ce premier jalon utilise le backend BIND et une zone generee par Ansible depuis
|
||||
l'inventaire. Cela evite de rendre DNS dependant de PostgreSQL avant que le
|
||||
service `serveur_postgresql` soit disponible.
|
||||
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.
|
||||
|
||||
Variables principales :
|
||||
| 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 |
|
||||
|
||||
- `serveur_powerdns_zone`
|
||||
- `serveur_powerdns_nameserver`
|
||||
- `serveur_powerdns_contact`
|
||||
- `serveur_powerdns_records`
|
||||
**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`.
|
||||
|
||||
Les hotes actifs portant `ansible_host` sont ajoutes automatiquement dans la
|
||||
zone par le template.
|
||||
## 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.
|
||||
|
|
|
|||
|
|
@ -87,4 +87,5 @@ Tu as appris **la hiérarchie de résolution** (hosts → récursif → autorita
|
|||
## Pour aller plus loin *(dépôt)*
|
||||
- Rôles : `roles/hosts_statiques` (le plancher), `roles/serveur_powerdns`, `roles/client_resolveur`.
|
||||
- Conception des 3 couches + frontière publique : `docs/dns-interne.md`.
|
||||
- Le DNS **public** — le locataire écrit sa zone, deux sites la servent (`dns1.chezlepro.ca`, `dns1.technolibre.ca`) : schémas des processus et des flux dans `docs/dns-interne.md`, et `roles/serveur_dns_public`.
|
||||
- Note : `client_resolveur` est une **intégration universelle** (elle suit l'existence de `serveur_resolveur`) — voir l'unité *Liaisons* et `docs/integrations-vm.md`.
|
||||
|
|
|
|||
Loading…
Reference in a new issue