Guides
Relayage DNS
Un relais DNS récursif proposé aux clients situés derrière SiHA.
SiHA peut faire office de relais DNS récursif pour les clients situés derrière
lui — la forme que VyOS expose via set service dns forwarding. Il écoute sur
des adresses sélectionnées, met les réponses en cache, achemine les requêtes par
domaine vers des serveurs amont spécifiques, filtre par préfixe source, et répond
localement aux enregistrements statiques sans solliciter d’amont.
Il s’agit d’un service que SiHA propose aux clients, et non de la résolution
de noms propre à l’appliance (le nœud résout via son /etc/resolv.conf intégré à
l’image).
Ressource
Une ressource DNSForwarders.dns.siha par périmètre d’écoute (typiquement par
VRF).
type: DNSForwarders.dns.siha
metadata:
namespace: dns
id: edge
spec:
# Empty vrf = default VRF. A non-default vrf scopes upstream egress to that
# VPP FIB table and must reference a declared routing.VRF.
vrf: ""
# Each listen address must sit on an lcp-enabled Interface (see Reach below).
listenAddresses: ["10.42.0.2"]
# Source prefixes allowed to query — REQUIRED, fail-closed: a query from
# outside every listed prefix is answered REFUSED. To deliberately serve
# everyone, set 0.0.0.0/0 (and ::/0) explicitly.
allowFrom: ["10.42.0.0/24"]
# Global upstreams, tried in order; SERVFAIL/REFUSED soft-fails to the next.
# port 0 means 53.
upstreams:
- { address: 1.1.1.1 }
- { address: 9.9.9.9, port: 5353 }
# Per-domain overrides — longest matching suffix wins over the global set.
domains:
- domain: corp.internal
nameServers:
- { address: 10.0.2.10 }
# Locally-authoritative records, answered directly without an upstream.
# `type` is any RR type mnemonic (A, AAAA, TXT, CNAME, MX, SRV, CAA, NS,
# PTR, …). Each `values` entry is that RR's RDATA in zone-presentation form.
# A CNAME must be the only record at its name (RFC 1034); an A/AAAA query for
# a CNAME'd name is chased so the client gets the alias and the target address.
staticRecords:
- { name: gw.corp.internal, type: A, values: ["10.42.0.2"] }
- { name: _acme-challenge.corp.internal, type: TXT, ttl: 30, values: ["<token>"] }
- { name: www.corp.internal, type: CNAME, ttl: 300, values: ["gw.corp.internal"] }
- { name: corp.internal, type: MX, ttl: 3600, values: ["10 gw.corp.internal."] }
- { name: corp.internal, type: CAA, values: ['0 issue "letsencrypt.org"'] }
# Response cache. Zeros use defaults (maxEntries 10 000, maxTtl 86 400 s,
# negativeTtl 30 s). minTtl/maxTtl clamp the cached TTL.
cache:
maxEntries: 5000
negativeTtl: 30
# The forwarder actively probes each upstream (~15 s) so health is live even
# with no organic traffic. Set to stop those periodic queries.
disableUpstreamProbe: false
Le pipeline de résolution de chaque requête est : allow-from → surcharge statique → cache → amont par domaine/global (premier sain, sinon SERVFAIL) → mise en cache.
DNSForwarderStatus (lecture seule) rapporte listening, les
listenAddresses effectivement liées, cacheEntries, la dernière
joignabilité observée de chaque amont, et lastError.
Joignabilité (linux-cp)
VPP possède les cartes de données ; le noyau du nœud n’a aucune route vers les
sous-réseaux de données. Une adresse d’écoute doit donc être une adresse
miroir linux-cp — déclarez lcpHostIf sur l’Interface qui la porte (le même
motif que BGP utilise pour son transport). VPP dévie (« punt ») le trafic entrant
sur :53 vers ce miroir, où la socket du relais le reçoit ; les requêtes amont
sortent en s’appuyant sur l’adresse d’écoute comme source, de sorte qu’elles
partent par le bon VRF.
config apply vérifie ce point de manière croisée : un relais dont l’adresse
d’écoute n’est pas sur une interface lcp est rejeté
(checkDNSForwarderListen).
Plusieurs relais / par VRF
Vous pouvez exécuter plusieurs relais — un par VRF, par exemple — tant que leurs
adresses d’écoute ne se recouvrent pas. Deux relais sur la même adresse
entreraient en collision au bind et sont rejetés à l’apply
(checkDNSForwarderOverlap). Le vrf de chaque relais doit référencer un
routing.VRF déclaré.
Le recouvrement d’adresses d’écoute entre VRF (la même IP dans deux tenants) est une capacité v2 conditionnée au support de linux-cp par netns.
Exploitation
S="sihactl --sihaconfig ~/.siha/config --addr <node-ip>:6443"
# List forwarders with status columns (vrf, listen addresses, upstreams,
# listening, last error). Aliases: dnsforwarders, dnsforwarder, dns.
$S get dnsfwd
# Inspect or edit one.
$S get dnsfwd edge -o yaml
$S edit dnsfwd edge
# From a client behind the appliance:
dig @10.42.0.2 example.com
dig @10.42.0.2 gw.corp.internal # static A
dig @10.42.0.2 _acme-challenge.corp.internal TXT # static TXT (ACME DNS-01)
dig @10.42.0.2 www.corp.internal # CNAME, chased to its A
La santé des amonts est rapportée sous status.upstreams dans la sortie YAML.
Sauf si disableUpstreamProbe est activé, le relais sonde chaque amont (global
et par domaine) environ toutes les 15 s et publie les résultats lors du
réconcile (~30 s).
Les métriques sont reportées. Il n’y a aucun compteur de requêtes/hits-cache/latence-amont en v1 ; les champs de statut ci-dessus sont la seule visibilité à l’exécution jusqu’à l’ajout d’une source de métriques dédiée.