Supposons que vous vouliez tester quelque chose dans une installation de démonstration avec 5 machines. Dans votre environnement local, vous pouvez créer les machines virtuelles nécessaires, sans toutefois pouvoir les nommer correctement. Avec 5 machines, il vous faut aussi définir les adresses IP appropriées, ce qui n'est pas très pratique.
Le plugin dnsmasq est un joyau caché de NetworkManager. Avec ce plugin, au lieu d'utiliser le serveur de noms DNS fourni par DHCP, NetworkManager configure une copie locale de dnsmasq qui peut être personnalisée.
Deux cas d'utilisation :
Le plugin dnsmasq pour NetworkManager résout ces deux problématiques :
Voici la méthode à suivre pour le configurer dans Fedora 29 : Rappelons que le domaine de l'ordinateur portable se nomme laplab et que le domaine du domicile se nomme .cscc.
Le fichier resolv.conf pointe toujours vers localhost.
Dnsmasq résout correctement les enregistrements définis au niveau local (par exemple pour le cluster OpenShift).
Une configuration plus élaborée de dnsmasq permet de transférer sélectivement les requêtes de certains domaines vers des serveurs spécifiques (par exemple, pour toujours résoudre correctement les hôtes du réseau domestique).
Quant aux autres requêtes, dnsmasq les transmet aux serveurs DNS associés au réseau actuel ou au réseau privé virtuel (VPN).
La plupart des entrées DNS de laplab sont définies dans /etc/hosts. Dnsmasq peut alors les récupérer.
Quelques entrées DNS supplémentaires sont également définies pour un DNS générique ainsi que quelques alias.
Voici les cinq fichiers à mettre en place. NetworkManager utilise un répertoire config. Vous pouvez tout à fait disposer ces fichiers différemment si vous le souhaitez :
Connaître le serveur DNS utilisé :
pi@framboise4:~$ cat /etc/resolv.conf # Generated by resolvconf nameserver fd0f:ee:b0::1
fd0f:ee:b0::1 = adresse IPV6 de la box
USER@MACHINE:~$ nmcli dev show | grep DNS IP4.DNS[1]: 192.168.0.254 IP6.DNS[1]: fd0f:ee:b0::1
192.168.0.254 = adresse IPv4 de la box
# /etc/NetworkManager/conf.d/00-use-dnsmasq.conf # # Ceci active le plugin dnsmasq. [main] dns=dnsmasq
(Exemple pour le domaine localhost)
Les fichiers contenus dans dnsmasq.d pourraient être combinés, mais ils sont séparés pour une meilleure démonstration de l'exemple.
# /etc/NetworkManager/dnsmasq.d/00-cscc.conf # # DNSmasq redirigera toute demande de résolution de noms sous le domaine .cscc # vers le serveur DNS domestique 172.31.0.20 server=/cscc/172.31.0.20
# /etc/NetworkManager/dnsmasq.d/01-laplab.conf # Définition du domaine local laplab # ainsi que de quelques alias et d'un joker. local=/laplab/ # Définition d'une entrée DNS de type "joker". address=/.ose.laplab/192.168.101.125 # Définition de quelques noms d'hôtes. address=/openshift.laplab/192.168.101.120 address=/openshift-int.laplab/192.168.101.120
# /etc/NetworkManager/dnsmasq.d/02-add-hosts.conf # Par défaut, le plugin ne lit pas le fichier /etc/hosts. # Ces lignes obligent le plugin à l'insérer dans le fichier # Pour éviter d'écrire dans le fichier /etc/hosts, # il peut pointer vers un autre fichier. addn-hosts=/etc/hosts
Un exemple de fichier hosts :
# Les noms d'hôte définis ici seront importés grâce au fichier 02-add-hosts.conf. 127.0.0.1 localhost localhost.localdomain ::1 localhost localhost.localdomain # Les hôtes sont dans le domaine .laplab, # comme configuré dans le fichier 01-laplab.conf 192.168.101.120 ose-lap-jumphost ose-lap-jumphost.laplab 192.168.101.121 ose-lap-master1 ose-lap-master1.laplab 192.168.101.122 ose-lap-master2 ose-lap-master2.laplab 192.168.101.123 ose-lap-master3 ose-lap-master3.laplab 192.168.101.125 ose-lap-infnode1 ose-lap-infnode1.laplab 192.168.101.126 ose-lap-infnode2 ose-lap-infnode2.laplab 192.168.101.127 ose-lap-infnode3 ose-lap-infnode3.laplab 192.168.101.128 ose-lap-node1 ose-lap-node1.laplab 192.168.101.129 ose-lap-node2 ose-lap-node2.laplab 192.168.101.130 ose-lap-node3 ose-lap-node3.laplab # Le nom qui ne figure pas dans .laplab sera également récupéré. # Soyez donc prudent en définissant les éléments ici. 172.31.0.88 overwrite.public.domain.com
USER@MACHINE:~$ sudo systemctl restart NetworkManager
USER@MACHINE:~$ ps -ef | grep dnsmasq dnsmasq 1835 1188 0 08:01 ? 00:00:00 /usr/sbin/dnsmasq --no-resolv --keep-in-foreground --no-hosts --bind-interfaces --pid-file=/var/run/NetworkManager/dnsmasq.pid --listen-address=127.0.0.1 --cache-size=400 --clear-on-reload --conf-file=/dev/null --proxy-dnssec --enable-dbus=org.freedesktop.NetworkManager.dnsmasq --conf-dir=/etc/NetworkManager/dnsmasq.d USER@MACHINE:~$ cat /etc/resolv.conf # Generated by NetworkManager nameserver 127.0.0.1 USER@MACHINE:~$ host ose-lap-jumphost.laplab ose-lap-jumphost.laplab has address 192.168.101.120
Cette configuration survit aux redémarrages et, d'après ses tests, fonctionne avec presque tous les réseaux et VPN que Clark Hale a essayés.
Si on installe dnsmasq comme serveur DNS pour un réseau local, dnsmasq écoute sur le port 53 qui est déjà utilisé par systemd-resolved.
Arrêter simplement systemd-resolved puis le redémarrer après l'exécution de dnsmasq, résout ce problème mais il revient après un redémarrage : systemd-resolved est démarré d'abord et dnsmasq ne démarre pas car le port 53 est déjà utilisé.
Comment faire comprendre à systemd-resolved qu'il ne doit pas démarrer l'écoute et donc conserver le port 53 pour une utilisation par dnsmasq ?
Il est plus intéressant de savoir comment les deux services peuvent fonctionner ensemble. Peuvent-ils travailler côte à côte ou ne sont-ils résolus que par systemd si l'on utilise dnsmasq ?
Voici la solution pour (X)Ubuntu 18.04 Bionic :
USER@MACHINE:~$ sudo apt install {dnsmasq,}
USER@MACHINE:~$ sudo mkdir /etc/systemd/resolved.conf.d
[Resolve] DNSStubListener=no
USER@MACHINE:~$ sudo systemctl restart systemd-resolved.service
USER@MACHINE:~$ sudo rm /etc/resolv.conf USER@MACHINE:~$ sudo touch /etc/resolv.conf
[main] dns=none
USER@MACHINE:~$ sudo systemctl restart NetworkManager.service
resolv-file=/var/run/NetworkManager/resolv.conf
address=/pc1.mondomaine/192.168.0.1 address=/framboise.mondomaine/192.168.0.31 address=/framboise4.mondomaine/192.168.0.32
USER@MACHINE:~$ sudo systemctl restart dnsmasq
# Use local dnsmasq for resolving nameserver 127.0.0.1
Basé sur « Using the NetworkManager’s DNSMasq plugin|Network Manager and DNSmasq plug-in » par Clark Hale's Blog.