Le Système de Noms de Domaine (DNS) sous Linux : Configuration et Résolution
Le DNS (Domain Name System) est un système fondamental qui assure la traduction des noms de domaine, tels que www.exemple.com, en adresses IP numériques (par exemple, 192.0.2.1) que les ordinateurs utilisent pour se connecter les uns aux autres sur un réseau. En résumé, la fonction principale du service de résolution DNS est de convertir ces noms de domaine lisibles par l'homme en adresses IP compréhensibles par les machines.
Le Processus de Résolution DNS
Le processus de résolution DNS implique plusieurs rôles clés et suit une séquence d'étapes bien définie :
Rôles dans la Résolution DNS :
- Le nom de domaine à résoudre : L'adresse textuelle que l'utilisateur souhaite atteindre.
- Le client DNS : Un programme sur la machine de l'utilisateur qui initie la requête de résolution.
- Le serveur DNS : Un serveur spécialisé qui détient les informations pour traduire les noms de domaine en adresses IP.
- L'adresse IP correspondant au nom de domaine : La destination numérique une fois la résolution effectuée.
Étapes du Processus de Résolution DNS :
- L'utilisateur saisit un nom de domaine dans une application (par exemple, un navigateur web).
- L'application appelle le client DNS pour initier une demande de résolution de domaine.
- Le client DNS interroge un serveur DNS configuré.
- Le serveur DNS recherche l'adresse IP correspondante. S'il ne la connaît pas, il peut interroger d'autres serveurs DNS récursivement jusqu'à obtenir la réponse.
- Le serveur DNS renvoie l'adresse IP au client DNS.
- Le client DNS transmet l'adresse IP à l'application.
- L'application utilise l'adresse IP pour établir la connexion avec le serveur de destination.
Ce processus peut être optimisé grâce à la mise en cache des résultats de résolution DNS pour accélérer les requêtes futures et réduire la charge sur les serveurs DNS.

Gestion de la Résolution DNS sous Linux
Sous Linux, la gestion de la résolution DNS peut être assurée par différents services et configurations. Historiquement, le fichier /etc/resolv.conf était le principal moyen de configurer les serveurs DNS. Cependant, avec l'évolution des systèmes, des gestionnaires de réseau plus sophistiqués comme systemd-resolved sont devenus courants.
systemd-resolved : Un Gestionnaire Moderne
systemd-resolved est un service réseau qui gère la résolution de noms de domaine. Il offre des fonctionnalités avancées telles que la gestion du cache DNS, la prise en charge de DNSSEC (DNS Security Extensions) et la résolution de noms locaux.
Activation et Gestion de systemd-resolved :
Le service systemd-resolved est activé par défaut sur de nombreux systèmes basés sur systemd. Il est possible de vérifier son statut et de le gérer à l'aide de la commande systemctl :
- Pour vérifier le statut : systemctl status systemd-resolved
- Pour démarrer le service : systemctl start systemd-resolved
- Pour arrêter le service : systemctl stop systemd-resolved
- Pour activer le service au démarrage : systemctl enable systemd-resolved
- Pour désactiver le service au démarrage : systemctl disable systemd-resolved
Les explications détaillées des commandes systemctl ne sont pas incluses ici, mais elles permettent de contrôler le cycle de vie des services système.
Configuration de systemd-resolved :
Le fichier de configuration principal pour systemd-resolved est /etc/systemd/resolved.conf. Ce fichier permet de définir des paramètres tels que les serveurs DNS à utiliser, les politiques de résolution DNS, la taille du cache et l'état de validation DNSSEC. Après avoir modifié ce fichier, il est nécessaire de redémarrer le service systemd-resolved pour que les changements prennent effet.
Fichiers resolv.conf et systemd-resolved :
Sous systemd-resolved, le fichier /etc/resolv.conf est souvent un lien symbolique généré dynamiquement. Il peut pointer vers différents fichiers qui sont gérés par systemd-resolved, tels que :
- /run/systemd/resolve/stub-resolv.conf : Ce fichier configure un résolveur de stub DNS. Il agit comme un proxy local, redirigeant toutes les requêtes DNS vers le service systemd-resolved. Il est conçu pour être très rapide et pour simplifier la configuration pour les applications qui s'attendent à trouver des serveurs DNS dans ce fichier.
- /run/systemd/resolve/resolv.conf : Ce fichier contient la liste réelle des serveurs DNS et des options de recherche de domaine, tels qu'obtenus par systemd-resolved à partir des configurations réseau ou des serveurs DHCP.
Le lien symbolique /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf indique que le système utilise le mode "stub resolver" de systemd-resolved. Cela signifie que toutes les requêtes DNS sont d'abord envoyées à systemd-resolved, qui se charge ensuite de les traiter ou de les relayer aux serveurs DNS appropriés.

Outils de Test et de Diagnostic
Pour vérifier le bon fonctionnement de la résolution DNS, plusieurs outils sont disponibles :
- resolvectl : Cet outil fait partie de systemd-resolved et permet d'interroger et de gérer l'état du résolveur. Par exemple, resolvectl status affiche des informations détaillées sur les interfaces réseau, les serveurs DNS utilisés et l'état du cache. La commande resolvectl query
permet de tester manuellement la résolution d'un domaine. La sortie affiche l'adresse IP résolue et le temps de résolution. - dig : Un outil puissant pour interroger les serveurs DNS. Il fournit des informations détaillées sur les enregistrements DNS (A, MX, NS, etc.). Par exemple, dig www.exemple.com affichera l'adresse IP associée au domaine.
- nslookup : Un autre utilitaire couramment utilisé pour interroger les serveurs DNS. Bien que dig soit souvent préféré pour sa richesse d'informations, nslookup reste utile pour des requêtes simples.
Configuration Manuelle et Alternatives
Dans certains cas, notamment sur des systèmes plus anciens ou pour des besoins spécifiques, la configuration manuelle de la résolution DNS peut être nécessaire. Le fichier /etc/resolv.conf est le fichier de configuration DNS principal. Il contient des lignes telles que :
- nameserver
: Spécifie l'adresse IP d'un serveur DNS à interroger. - search
... : Définit une liste de domaines à ajouter automatiquement aux requêtes de noms de domaine incomplets. - domain
: Définit le domaine local.
Utilisation de resolvconf
resolvconf est un utilitaire qui gère la mise à jour du fichier /etc/resolv.conf à partir de diverses sources (interfaces réseau, VPN, etc.). Il permet d'éviter les conflits entre différentes applications qui pourraient tenter de modifier ce fichier simultanément. L'utilisation de resolvconf est recommandée lorsque le système n'utilise pas systemd-resolved pour la gestion DNS.
Configuration par Interface Réseau
Il est possible de définir des serveurs DNS spécifiques pour chaque interface réseau. Par exemple, avec le système ifupdown et son fichier de configuration /etc/network/interfaces, on peut utiliser des scripts up (ou post-up) pour configurer le fichier /etc/resolv.conf de manière dynamique en fonction de l'interface active. Ceci est particulièrement utile lorsque l'on se connecte à différents réseaux avec des serveurs DNS distincts.
Exemple avec ifupdown :
Dans la configuration d'une interface dans /etc/network/interfaces, on peut ajouter une commande post-up pour exécuter un script qui met à jour /etc/resolv.conf. Ce script peut tester des éléments spécifiques au réseau, comme l'adresse MAC du routeur, pour déterminer la configuration DNS appropriée.
Gestion avec wicd (Connexions WiFi) :
Pour les gestionnaires de réseau comme wicd, il est possible d'ajouter des scripts dans le répertoire /etc/wicd/scripts/postconnect/. Ces scripts s'exécutent après la connexion à un réseau et peuvent être utilisés pour ajuster la configuration DNS en fonction de l'adresse MAC du point d'accès WiFi (BSSID).
Utilisation du Client DHCP
Si le système utilise un client DHCP pour obtenir automatiquement une configuration réseau, ce dernier peut également fournir les adresses des serveurs DNS. Avec le client DHCP de l'Internet Software Consortium (ISC), il est possible d'utiliser des scripts "hook" (par exemple, pour l'événement BOUND ou RENEW) pour personnaliser la manière dont le fichier /etc/resolv.conf est mis à jour lors du renouvellement du bail DHCP. Ces scripts sont une méthode plus robuste pour gérer la configuration DNS dynamique.

Défis et Considérations Spécifiques
Résolution DNS via TCP
Par défaut, la résolution DNS utilise la couche transport UDP. Cependant, dans certains environnements réseau, notamment avec des connexions WiFi instables, des délais de résolution importants (timeouts) peuvent survenir. L'utilisation de la couche transport TCP peut améliorer la fiabilité, bien que tous les serveurs DNS ne la supportent pas. L'option use-vc (non documentée dans certains contextes) peut être utilisée pour forcer l'utilisation de TCP. Google Public DNS, par exemple, supporte cette option.
Gestion des DNS IPv4 et IPv6
Dans les environnements utilisant à la fois IPv4 et IPv6, il est crucial que le système puisse gérer les deux types d'adresses DNS. Sans un outil comme resolvconf, il peut y avoir des conflits si différentes sources (par exemple, dhclient pour IPv4 et rdnssd pour IPv6) tentent de modifier le fichier /etc/resolv.conf. resolvconf assure que les deux ensembles d'adresses DNS sont conservés.
Le rôle de NetworkManager (NM)
NetworkManager (NM) est un autre gestionnaire de réseau courant sous Linux. Par défaut, NM peut ne pas gérer les interfaces configurées dans /etc/network/interfaces. Cependant, une option permet de modifier ce comportement. NM peut automatiquement configurer le fichier /etc/resolv.conf pour les interfaces qu'il gère, y compris les interfaces réseau virtuelles.
Interactions et conflits potentiels
Il est important de comprendre comment les différents outils interagissent :
- /etc/network/interfaces vs NM : Si NM est installé, il peut commenter la configuration des interfaces dans /etc/network/interfaces.
- DHCP et resolv.conf : Les serveurs DHCP annoncent les serveurs DNS, mais le client DHCP est libre de les utiliser ou de les ignorer. Des outils comme resolvconf et NM offrent des options pour contrôler ce comportement.
- resolvconf et sa pertinence : Ne pas installer resolvconf peut rendre les options dns-nameserver(s) dans /etc/network/interfaces inefficaces et entraîner l'écrasement des configurations DNS par la dernière source à écrire dans /etc/resolv.conf.
- Avahi et mDNS : Le démon avahi gère le Multicast DNS (mDNS) pour les domaines .local. Il est distinct du DNS traditionnel et n'affecte pas directement la configuration de /etc/resolv.conf, bien qu'il existe des scripts dans /etc/resolvconf/update-libc.d/ pour gérer des cas spécifiques liés à .local.
Visualisation des Serveurs DNS Actifs
Pour connaître les serveurs DNS actuellement utilisés par votre machine, en particulier avec systemd-resolved, vous pouvez utiliser la commande :
systemd-resolve --status | grep 'Current DNS Server'
Pour obtenir une sortie plus complète incluant tous les serveurs DNS configurés, vous pouvez utiliser des commandes plus complexes avec awk, par exemple pour extraire les informations de la section "DNS Servers" :
systemd-resolve --status | awk 'BEGIN {aff=0} {if (aff==1) { print $0 }; if ($0 ~ /DNS Servers/) { aff=1 } else { aff=0 }}'
Il est important de noter que le "serveur DNS courant" peut varier d'une requête à l'autre, car il s'agit généralement du dernier serveur utilisé en fonction de sa disponibilité.
Configure DNSOverTLS with systemd-resolved - see description
tags: #role #du #fichier #etc #resolv #conf
