La Lanterne Rouge

Warning: Geek Inside

Résolution d'hôtes single-label avec systemd-resolved

- Posted in Sans catégorie by

Dans le cas où systemd-resolved est utilisé (souvent avec systemd-networkd), les requêtes portant sur des noms d'hôtes single-label c'est-à-dire sans extension (mon-pc, nas-synology, ...) ne sont plus relayées aux serveurs DNS configurés sur le système (soit globalement dans /etc/systemd/resolved.conf soit sur le fichier de configuration de l'interface dans /etc/systemd/network/).

L'explication technique tient au fait que ces noms de sont pas des noms de domaines valides et sont donc forcément locaux, donc passent désormais de manière forcée par LLMNR, un protocole de pair-à-pair sur le LAN.

Problème : cette résolution est nécessaire sur le LAN si un serveur DNS unique était jusque là habilité à résoudre les noms d'hôtes, y compris single-label.

C'est le cas chez moi où Usul fournit la résolution DNS à l'ensemble de mon réseau, notamment afin de contourner le proxy menteur de mon FAI.

La solution de contournement la plus simple est de modifier le fichier /etc/nsswitch.conf du client concerné afin d'y retirer le plug-in resolve fourni par systemd-resolved et prenant le pas sur la résolution DNS classique (si systemd-resolved est disponible uniquement).

...
hosts: files mymachines myhostname resolve [!UNAVAIL=return] dns
networks: files
...

À remplacer par :

...
hosts: files mymachines myhostname dns
networks: files
...

⚠ L'entrée [!UNAVAIL=return] est à retirer aussi. C'est elle qui empêche la résolution DNS (dns) si systemd-resolved (resolve) est disponible.

Il faut ensuite que le chemin /etc/resolv.conf pointe bien vers le fichier contenant les serveurs DNS à utiliser et non le résolveur local de systemd-resolved (et non le stub qui pointe vers le résolveur local tournant sur 127.0.0.53:53) :

# ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
# cat /etc/resolv.conf
nameserver 192.168.1.250
nameserver 192.168.1.1

Références :