Ce qui se passe
nss-userhosts est une extension au Name Service Switch de la glibc, écrite
en Rust, publiée cette semaine sur Codeberg. Elle permet à un utilisateur non
privilégié de définir ses propres entrées de résolution de noms, au format
/etc/hosts, dans son dossier personnel.
Le dépôt est jeune : première version fonctionnelle et publication le 22 août 2026. C'est un projet d'une personne, quelques centaines de lignes, annoncé comme « à un stade précoce mais utilisable ».
Le problème qu'il attaque
/etc/hosts appartient à root. Toute association nom-adresse pour du
développement local — api.monprojet.test vers 127.0.0.1, un alias vers un
conteneur, l'adresse d'une machine de test sur le réseau — suppose donc sudo.
Deux situations où ça coince :
- le poste géré par une DSI, où l'on n'a pas les privilèges ;
- la machine partagée, où chaque modification est globale : une entrée ajoutée pour soi change la résolution de tous les comptes, et une faute de frappe casse celle des autres.
Les contournements existent — un résolveur local, un proxy, un conteneur qui
porte son propre hosts — mais ils ajoutent tous une pièce mobile.
Comment ça marche
Le Name Service Switch de la glibc est le mécanisme qui décide dans quel
ordre les sources de résolution sont consultées : fichiers, DNS, mDNS, etc.
Chaque source est un module chargeable. nss-userhosts en est un.
Une fois déclaré, il lit les fichiers $HOME/.config/userhosts/*.conf, au
format hosts habituel, et combine tous les enregistrements trouvés. IPv4 et
IPv6 sont pris en charge.
L'installation, elle, demande bien les droits d'administration :
cargo build --release
# la bibliothèque doit être renommée pour que glibc la trouve
mv libnss_userhosts.so libnss_userhosts.so.2
sudo cp libnss_userhosts.so.2 /usr/lib/ # /usr/local/lib ne fonctionne pasPuis on place le module en tête de la ligne hosts de /etc/nsswitch.conf :
hosts: userhosts mymachines resolve [!UNAVAIL=return] files myhostname dnsChaque utilisateur crée ensuite son dossier et ses entrées, sans aucun privilège :
mkdir --parents ~/.config/userhosts
echo "192.168.1.79 catfeeder" > ~/.config/userhosts/pets.conf
getent ahosts catfeederUn paquet est fourni pour Arch (cd packaging && makepkg), et la variable
NSS_USERHOSTS_LOG active des messages de débogage sur la sortie d'erreur.
Les limites, et elles comptent
Trois, à connaître avant d'espérer :
L'installation reste un geste root. Le titre est donc à lire correctement :
ce n'est pas « du DNS sans administrateur », c'est un geste d'administrateur
fait une fois, qui rend ensuite la main aux utilisateurs. Sur un poste
d'entreprise verrouillé, il faudra passer par l'équipe qui gère les machines —
mais l'argument est plus facile à défendre qu'une demande de sudo permanent.
Seuls les programmes qui passent par le résolveur de la glibc sont
concernés. C'est la limite technique de fond. Un binaire Go, qui embarque
souvent son propre résolveur, ou un navigateur qui fait de même, ignorera
purement et simplement ces entrées. Autrement dit : curl et la plupart des
outils système suivront, votre application compilée statiquement peut-être pas.
À vérifier avant d'en dépendre.
Le projet est jeune. La résolution inverse (adresse vers nom) n'est pas
implémentée, l'emplacement du dossier ne suit pas encore la spécification XDG,
et l'auteur annonce avoir peu de temps à y consacrer. À tester dans un
conteneur — un Containerfile et une recette just test sont fournis pour
ça — avant de le déployer sur une machine dont on dépend.