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.internal → 10.30.1.42 | Résolution standard |
| AAAA | Nom → adresse IPv6 | app.internal → fd00::1:42 | Résolution IPv6 |
| CNAME | Alias vers un autre nom | api.internal → app.internal | Abstraction de noms |
| SRV | Service + port + priorité | _ldap._tcp.internal → iam.internal:636 | Service discovery |
| TXT | Texte libre | _acme-challenge.internal → abc123 | DNS-01 challenge, SPF, DKIM |
| PTR | Adresse → nom (reverse) | 42.1.30.10.in-addr.arpa → app.internal | Résolution inverse, debug |
| NS | Serveur de noms de la zone | internal → ns1.internal | Délégation de zone |
| SOA | Autorité sur la zone | Parametres de zone | Configuration de zone |
| MX | Serveur mail | internal → mail.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.