Aller au contenu

Fondamentaux DNS

La hiérarchie DNS

Le DNS est un système distribue et hierarchique. Chaque nom de domaine se lit de droite a gauche, du plus général au plus spécifique :

graph LR
    app["app"] --- production["production"] --- internal["internal"] --- company["company"] --- io["io"] --- root["Racine (.)"]
    app -.- lbl1["Sous-domaine"]
    production -.- lbl2["Sous-domaine"]
    internal -.- lbl3["Domaine"]
    io -.- lbl4["TLD"]

Pour un DNS interne d'entreprise, on définit généralement un domaine prive (par exemple internal.company.io ou un domaine reserve comme .internal) qui n'est resolu que par les serveurs DNS internes.

Types d'enregistrements

Type Fonction Exemple Usage interne typique
A Nom → adresse IPv4 app.internal10.30.1.42 Résolution standard
AAAA Nom → adresse IPv6 app.internalfd00::1:42 Résolution IPv6
CNAME Alias vers un autre nom api.internalapp.internal Abstraction de noms
SRV Service + port + priorité _ldap._tcp.internaliam.internal:636 Service discovery
TXT Texte libre _acme-challenge.internalabc123 DNS-01 challenge, SPF, DKIM
PTR Adresse → nom (reverse) 42.1.30.10.in-addr.arpaapp.internal Résolution inverse, debug
NS Serveur de noms de la zone internalns1.internal Délégation de zone
SOA Autorité sur la zone Parametres de zone Configuration de zone
MX Serveur mail internalmail.internal Routage mail interne

Enregistrements SRV en detail

L'enregistrement SRV est fondamental pour le service discovery interne :

_service._proto.name  TTL  IN  SRV  priority  weight  port  target

# Exemples concrets
_ldap._tcp.internal.      300  IN  SRV  10  60  636  iam-1.internal.
_ldap._tcp.internal.      300  IN  SRV  10  40  636  iam-2.internal.
_kerberos._udp.internal.  300  IN  SRV  10  0   88   kdc.internal.

Les champs priority et weight permettent le load balancing et le failover : les clients contactent d'abord les serveurs de priorité la plus basse, et repartissent la charge selon les poids.

Résolution : recursive vs authoritative

sequenceDiagram
    participant C as Client
    participant R as Resolver recursif
    participant A as Serveur autoritatif
    C->>R: Requete: app.internal
    R->>A: Requete a l'autoritatif
    A->>R: Reponse: 10.30.1.42
    Note over R: Mise en cache
    R->>C: Reponse: 10.30.1.42
Rôle Fonction Exemple
Serveur autoritatif Detient les enregistrements d'une zone CoreDNS avec les zones internes
Resolver recursif Interroge les autoritatifs pour le compte du client Unbound, CoreDNS en mode forward
Cache Stocke les réponses pour eviter des requêtes répétées Integre au resolver

En pratique

CoreDNS peut jouer les deux rôles simultanément : autoritatif pour les zones internes et forwarder (resolver) pour les zones externes. C'est la configuration la plus courante en environnement Kubernetes.

DNS interne vs DNS public

Aspect DNS public DNS interne
Visibilité Accessible depuis Internet Accessible uniquement depuis le réseau interne
Enregistrements Domaines publics, IP publiques Noms internes, IP privées (RFC 1918)
Gestion Registrar, API cloud provider Auto-heberge, contrôle total
Sécurité DNSSEC, CAA records DNS-over-TLS, isolation réseau
Performance Latence variable (Internet) Latence faible (réseau local)

Split-horizon DNS

Le split-horizon permet de repondre differemment selon l'origine de la requête :

graph LR
    CI["Client interne"] --> DNS["DNS interne<br/>(split-horizon)"]
    VPN["Client VPN"] --> DNS
    Ext["Client Internet"] --> DNS
    DNS -->|Client interne/VPN| Priv["10.30.1.42<br/>(IP privee)"]
    DNS -->|Client Internet| Pub["203.0.113.42<br/>(IP publique)"]

Cas d'usage : un service comme api.company.io résout vers l'IP privee pour les clients internes (performance, pas de NAT hairpin) et vers l'IP publique pour les clients externes.

TTL et caching

Le TTL (Time To Live) définit combien de temps un enregistrement est cache :

Scenario TTL recommande Justification
Services stables 3600 s (1 h) Reduire la charge DNS
Services avec failover 60-300 s Basculement rapide
Enregistrements dynamiques 30-60 s Mise à jour fréquente
Migration en cours 30 s Propagation rapide des changements
Enregistrements statiques (NS, SOA) 86400 s (24 h) Changent tres rarement

Impact du TTL sur le failover

Un TTL de 3600 s signifie qu'en cas de panne, les clients continueront a utiliser l'ancienne adresse pendant jusqu'a 1 heure. Pour les services critiques avec failover, preferez un TTL de 60 a 300 secondes.

Service discovery

Le DNS est le mécanisme de service discovery le plus universel. Deux approches dominent :

Kubernetes CoreDNS

Dans un cluster Kubernetes, CoreDNS résout automatiquement les noms de services :

# Service dans le namespace "production"
app-api.production.svc.cluster.local  →  10.96.42.10

# Headless service (resolution vers les pods individuels)
pod-0.app-api.production.svc.cluster.local  →  10.244.1.15
pod-1.app-api.production.svc.cluster.local  →  10.244.2.23

Consul DNS

HashiCorp Consul expose un DNS de service discovery :

# Service enregistre dans Consul
app-api.service.consul         →  10.30.1.42, 10.30.1.43
app-api.service.dc1.consul     →  10.30.1.42 (datacenter specifique)

# Health-checked : seuls les services sains sont retournes

Comparaison des approches

Approche Perimetre Enregistrement Health check
DNS statique (fichiers de zone) Infra stable Manuel Non
Kubernetes CoreDNS Cluster K8s Automatique Via readiness probes
Consul DNS Multi-datacenter API/agent Integre (TCP, HTTP, script)

DNS-over-TLS et DNS-over-HTTPS

Le DNS classique (port 53/UDP) transmet les requêtes en clair. Pour protéger la confidentialite :

Protocole Port Usage Support CoreDNS
DNS classique 53/UDP+TCP LAN de confiance Natif
DNS-over-TLS (DoT) 853/TCP Entre zones internes Plugin tls
DNS-over-HTTPS (DoH) 443/TCP Clients distants (VPN) Plugin doh (communautaire)

Recommandation

Pour un DNS interne, DNS-over-TLS entre les resolvers et les serveurs autoritatifs est le bon compromis : il protège les requêtes en transit sans la complexité du DoH. Le DNS classique reste acceptable à l'intérieur d'un même segment réseau isole.

Synthese

Le DNS interne est un service invisible mais critique. Une panne DNS paralyse l'ensemble de l'infrastructure. Les chapitres suivants detaillent le choix de solution, l'architecture, le déploiement et les bonnes pratiques pour un service DNS resilient.