
Suite du précédent billet et retours. Et oui, Network Manager peut-être cabalistique, à moins qu'il ne faille ingurgiter toute la documentation ? 
Sinon, pourquoi s'entête-t-il, par défaut, à placer l'adresse de ma passerelle dans les nameserver de mon resolv.conf, là où dhclient ne commet pas une erreur aussi sotte ? Extrait de la sortie générée par nm-tool :
nm-tool | grep 'IPv4 Settings' -A9
IPv4 Settings:
Address: 192.168.1.196
Prefix: 24 (255.255.255.0)
Gateway: 192.168.1.1
DNS: 127.0.0.1
DNS: 192.168.1.1
DNS: 192.168.1.102
DNS: 8.8.4.4
Et, un extrait des informations envoyées par mon serveur DHCP :
dhcptool -i eth0 -o discover | egrep '192\.168(\.1){2}($|[[:blank:]])'
sip: 192.168.1.1
gip: 192.168.1.1
Option 054: 192.168.1.1
Option 003: 192.168.1.1
Option 006: 192.168.1.1 192.168.1.102 8.8.4.4
J'ai pas mal cherché, et ce, à de nombreuses reprises si il n'y avait pas un souci avec dhclient, par exemple, ou autre… pourquoi Network Manager s'entête-t-il à utiliser l'adresse de la passerelle dans les nameserver ? D'autant que, celle-ci n'est définitivement pas, dans mon cas, un serveur DNS.
De plus Network Manager semble outrepasser la configuration de dhclient, si bien que la seule seule solution pour manipuler les nameserver semble être d'utiliser un script… comme je l'avais déjà fait dans le précédent billet. Cependant, comme on l'a vu, précédemment, Network Manager utilise l'adresse de la passerelle en tant que nameserver, aussi aurait-il été nécessaire de modifier le script précédent… le problème, c'est que les scripts « shell » sont peu adaptés (dépendances et, surtout, évolutivité).
trouver une alternative à dnsmasq
Par dessus le marché, le fonctionnement de dnsmasq a fini par ne plus me satisfaire ; notamment parce que dnsmasq essaie aussi de faire serveur DHCP… que c'est un peu contraire à la philosophie UNIX ; et c'est, surtout, une source de problèmes avec network-manager. Les solutions de cache DNS ne manquent, heureusement, pas… on pourra, au moins, citer djbdns et nscd, après avoir rapidement testé l'une puis l'autre, aucune des deux ne m'a convaincu de prime abord. Finalement, j'ai décidé de me pencher sur pdnsd.
installer pdnsd depuis les sources
Pour l'installation de pdnsd, n'étant pas satisfait par le « paquet debian » disponible via le gestionnaire de paquets, notamment parce que cette installation est source de problèmes et un peu « bloated » de par les dépendances plus ou moins inutiles, j'ai donc choisi d'installer pndsd depuis les sources git. À cela peu de complications, si ce n'est de lire les options du ./configure ; et, donc, nul besoin d'aller sur Clubic pour apprendre à compiler ou installer un logiciel depuis les sources
:
groupadd pdnsd
useradd -d /var/cache/pdnsd -g pdnsd -s /bin/false pdnsd
sudo apt-get build-dep pdnsd
git clone git://gitorious.org/pdnsd/pdnsd.git
cd pdnsd
./configure --sysconfdir=/etc --with-default-id=pdnsd
make
sudo make install
Après çà, reste la configuration, on pourra s'aider, comme bien souvent, de l'ArchWiki, mais de nombreuses autres ressources sont disponibles.
Un exemple de fichier de configuration /etc/pdnsd.conf minimal :
global {
cache_dir="/var/cache/pdnsd";
run_as="pdnsd";
server_ip = 127.0.0.1; // Use eth0 here if you want to allow other
// machines on your network to query pdnsd.
paranoid=on;
// query support for this to work.
min_ttl=15m; // Retain cached entries at least 15 minutes.
max_ttl=1w; // But at most one week
timeout=10; // Global timeout option (10 seconds).
}
server {
// dbc (preferred)
ip=172.20.1.62;
ip=193.111.162.131;
// tdc (normal)
ip=193.162.153.164;
ip=194.239.134.83;
// diku (backup)
ip=130.225.96.4;
ip=130.225.96.3;
timeout = 5;
uptest = query;
interval = 30m; // Test every half hour.
}
source {
owner=localhost;
file="/etc/hosts";
}
Je vous fais grâce des commandes éculées pour vérifier que le cache est fonctionnel ; à la place, je donnerai deux commandes pour démarrer pdnsd, rapidement et sans avoir la nécessité d'utiliser un « service ». La première commande démarre pdnsd en mode verbeux dans un terminal :
sudo pdnsd -v3 -g
L'option -g peut être remplacée par debug=on (dans la section global).
La seconde commande, plus simple, pour démarrer en mode démon :
sudo pdnsd -d
Donc, en l'absence de script installé dans /etc/init.d/, on peut se contenter de démarrer pdnsd à l'aide de /etc/rc.local :
#!/bin/sh
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
. /lib/lsb/init-functions
log_daemon_msg 'Starting dns proxy daemon...'
test -x /usr/local/sbin/pdnsd && {
test -f /var/cache/pdnsd/pdnsd.status || /usr/local/sbin/pdnsd -d
}
log_end_msg 0
exit 0
L'inconvénient, mais aussi l'avantage, d'utiliser le script /etc/rc.local est, comme ça l'est indiqué dans ses commentaires, il est exécuté après que l'ensemble des scripts de démarrage l'aient été. Si l'on veut altérer les DNS utilisés, et notamment utiliser 127.0.0.1 correspondant à notre pdnsd, il est nécessaire de lancer un script supplémentaire ou de redémarrer network-manager.
un script pour le « nettoyage » de resolv.conf
Le script peut se télécharger ainsi :
wget http://devblog.homeunix.me/share/linux/scripts/resolv-cleaner.py -O resolv-cleaner
Par défaut, il vérifie que les DNS renseignés dans le fichier /etc/resolv.conf sont bien joignables sur le port 53 (scan de port), si ce n'est pas le cas ceux-ci seront retirés du fichier. Il tente la même opération avec 127.0.0.1, si celui-ci répond il sera placé en première position, facilitant ainsi la mise en place d'un résolveur en local. Pour finir, il retire l'ensemble des lignes de commentaire, à l'exception de la première.
Un exemple de résultat attendu après l'exécution du script :
# Generated by NetworkManager
domain private
search private
nameserver 127.0.0.1
nameserver 192.168.1.102
nameserver 8.8.8.8
Exemple d'installation, de façon à utiliser le script via NetworkManager :
wget http://devblog.homeunix.me/share/linux/scripts/resolv-cleaner.py -O resolv-cleaner
chmod +x resolv-cleaner
sudo cp resolv-cleaner /usr/local/bin/
sudo ln -sf $(which resolv-cleaner) /etc/NetworkManager/dispatcher.d/02ifup