# client_unbound **Résolveur local** par nœud (Unbound) : cache + récursion, avec une **stub-zone** vers l'autoritatif interne (PowerDNS). Rend la résolution *dynamique* sans casser Internet. Troisième et dernière couche du DNS interne (`docs/dns-interne.md`). ## Les trois couches 1. `hosts_statiques` — plancher `/etc/hosts`, toujours là, indépendant de tout service ; 2. `serveur_powerdns` — autoritatif de la zone interne ; 3. **ce rôle** — résolveur local, **opt-in**, qui rend la résolution dynamique par nœud. ## Rôle - Installe `unbound` et `bind9-dnsutils` (`dig`, pour valider **avant** de basculer). - Déploie `setops.conf` : écoute sur `127.0.0.1`, stub-zone vers l'autoritatif interne, récursion (ou transitaires) pour le reste d'Internet. - Valide la configuration (`unbound-checkconf`), active le service. - **Bascule** `/etc/resolv.conf` vers `127.0.0.1` — protégée (voir ci-dessous). ## Garde-fou de bascule (anti-coupure) Changer le résolveur d'un nœud à distance, c'est risquer de le rendre muet. Le rôle exige donc **deux** interrupteurs, et vérifie avant d'agir : ```yaml client_unbound_apply: true client_unbound_confirm: true ``` Sans les deux, le rôle installe et démarre Unbound mais **ne touche pas** à `/etc/resolv.conf` (refus explicite). Avec les deux, il applique d'abord les redémarrages en attente, puis **valide qu'Unbound résout réellement** (un nom interne *et* un nom Internet) — et ne bascule qu'ensuite. Même doctrine que la règle 4 d'`AGENTS.md` : action risquée = confirmation explicite. ## Variables | Variable | Défaut | Rôle | | --- | --- | --- | | `client_unbound_ecoute` | `127.0.0.1` | Écoute (boucle locale) | | `client_unbound_zone_interne` | `{{ domaine_interne }}` | Zone en stub | | `client_unbound_dns_autoritatif` | dérivé du groupe `serveur_powerdns` | Cible de la stub-zone | | `client_unbound_transitaires` | `[]` | Vide = récursion propre (racine + DNSSEC) | | `client_unbound_apply` / `_confirm` | `false` / `false` | Bascule de `/etc/resolv.conf` | ## Flux (`meta/flux.yml`) `53/udp` entrant en **localhost** · `53/tcp` sortant vers `serveur_powerdns`. ## Notes / limites - Transitaires vides = Unbound **récurse lui-même** (racine + DNSSEC). Si la récursion sortante est bloquée par le réseau, renseigner `client_unbound_transitaires`. - Le rôle exige l'IP de l'autoritatif interne (assertion) : `serveur_powerdns` doit être dans l'inventaire avec un `ansible_host`. - DoT (DNS chiffré) n'est pas encore branché — c'est un des flux restants du zéro-confiance. ## Prérequis - `serveur_powerdns` actif. Couche **agents**.