Table des matières

, ,

Configurer un serveur DNS pour son poste de travail avec Dnsmasq

DnsMasq est un petit serveur DNS (cache DNS). Peu gourmand en ressources et très simple à configurer, il est bien adapté à une installation pour installer un petit serveur DNS sur son poste de travail.

Pour la résolution des noms, il se base sur les DNS déclarés dans la configuration réseau (/etc/resolv.conf) ou sur le fichier /etc/hosts. Ce qui est bien pratique pour configurer une petite zone lan : il suffit d’éditer le fichier /etc/hosts comme nous le ferions pour une seule machine.

Installer une interface réseau virtuelle pour le serveur DNS

Éditer /etc/systemd/network/10-virtualeth0.netdev

[NetDev]
Name = virtualeth0
Kind = dummy

Éditer /etc/systemd/network/10-virtualeth0.network

[Match]
Name = virtualeth0

[Network]
Address = 10.10.10.1/24
Address = fd00::/8
systemctl start systemd-networkd.service
systemctl enable systemd-networkd.service
reboot

Après le redémarrage vérifier la présence de l'interface réseau virtuelle.

ip a
…
3: virtualeth0: <BROADCAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc noqueue state UNKNOWN group default qlen 1000
    link/ether 9a:3c:56:42:f5:c9 brd ff:ff:ff:ff:ff:ff
    inet 10.10.10.1/24 brd 10.10.10.255 scope global virtualeth0
       valid_lft forever preferred_lft forever
    inet6 fd00::/8 scope global
       valid_lft forever preferred_lft forever
    inet6 fe80::983c:56ff:fe42:f5c9/64 scope link
       valid_lft forever preferred_lft forever
…

Configuration du client DHCP

Pour pouvoir ajouter le serveur DNS local à /etc/resolv.conf, il faut renseigner l’option prepend qui permet l’ajout du serveur DNS local en début de la liste des serveurs DNS fournit automatiquement par DHCP.

Vérifier les DNS présents :

$ nmcli dev show | grep DNS
IP4.DNS[1]:                    yyy.yyy.yyy.yyy
IP4.DNS[1]:                    yyy.yyy.yyy.yyy
IP6.DNS[1]:                    yyyy:yyyy:yyyy::yyyy
IP6.DNS[2]:                    yyyy:yyyy:yyyy::yyyy
IP6.DNS[3]:                    yyyy:yyyy:yyyy::yyyy
$ resolvectl dns
Global:
Link 2 (enp0sxx):
Link 3 (wlx803xxxxx): yyyy:yyyy:yyyy::yyyy yyyy:yyyy:yyyy::yyyy yyyy:yyyy:yyyy::yyyy yyy.yyy.yyy.yyy
Link 4 (wlo1): yyy.yyy.yyy.yyy
Link 6 (virtualeth0):

Éditer /etc/dhcp/dhclient.conf

prepend domaine-perso.fr 10.10.10.1 fd00::;

Domaine local du poste de travail

Voir le domaine local du poste de travail

$ hostname -d

Définir le domaine local de la machine Ubuntu

$ sudo hostnamectl set-hostname MachineUbuntu.domaine-perso.fr --static
$ hostname -d
domaine-perso.fr

Installation de Dnsmasq

Installer les applications de base pour Dnsmasq et sa gestion

$ sudo apt install dnsmasq net-tools

Configuration serveur DNS de Dnsmasq

Éditer /etc/dnsmasq.conf

# Ne transmet pas les requêtes ne contenant pas un nom de domaine complet
domain-needed
# "no such domain" pour des adresses IP privées non référencées dans dnsmasq
bogus-priv
# Corrige du spam DNS Microsoft
filterwin2k
# Formate les requêtes DNS suivant l’interface réseau utilisée
localise-queries

# Domaine dns local
local = /domaine-perso.fr/
# Interfaces DNS
interface = virtualeth0
exept-interface = lo
exept-interface = enp0sxx
exept-interface = wlx803xxxxx
exept-interface = wlox
# Adresses écoutées
listen-address = 127.0.0.1
listen-address = 10.10.10.1
listen-address = fd00::
# Toutes les interfaces réseau sont en mode serveur DNS c’est ce qui permet de démarrer le serveur DNS
bind-interfaces
# Ajoute le nom de domaine DNS aux entrées /etc/hosts
expand-hosts
# Non de domaine pour extensions "expand-hosts"
domain=domaine-perso.fr
# Taille du cache DNS
cache-size = 1000
# Désactive le "cache négatif" sur réponses "no such domain"
no-negcache

Ajout du server DNS local à la liste des serveurs DNS de systemd-resolved. Éditer /etc/systemd/resolved.conf

DNS=10.10.10.1 fd00::

Relance de Dnsmasq

$ systemctl restart dnsmasq.service
$ systemctl enable dnsmasq.service
$ systemctl restart systemd-resolved.service
$ nmcli general reload

Ouvrir avec le pare feu les ports DNS pour les rendre accessibles depuis le réseau lan

Ouvrir le port DNS sur l'interface d'ip xxx.xxx.xxx.xxx avec UFW. Si UFW est activé, ouvrez le port DNS 53, UDP.

$ sudo ufw allow from xxx.xxx.0.0/16 to any port 53 proto udp

Tests du serveur DNS

Vérifier que le port 53 est utilisé par Dnsmasq

$ sudo lsof -i:53
COMMAND     PID            USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 53916 systemd-resolve   12u  IPv4  99537      0t0  UDP localhost:domain
systemd-r 53916 systemd-resolve   13u  IPv4  99538      0t0  TCP localhost:domain (LISTEN)
dnsmasq   53732         dnsmasq    4u  IPv4  95141      0t0  UDP MachineUbuntu:domain
dnsmasq   53732         dnsmasq    5u  IPv4  95142      0t0  TCP MachineUbuntu:domain (LISTEN)
dnsmasq   53732         dnsmasq    6u  IPv4  95151      0t0  UDP localhost:domain
dnsmasq   53732         dnsmasq    7u  IPv4  95152      0t0  TCP localhost:domain (LISTEN)
dnsmasq   53732         dnsmasq    8u  IPv6  95153      0t0  UDP MachineUbuntu:domain
dnsmasq   53732         dnsmasq    9u  IPv6  95154      0t0  TCP MachineUbuntu:domain (LISTEN)
dnsmasq   53732         dnsmasq   10u  IPv6  95155      0t0  UDP MachineUbuntu:domain
dnsmasq   53732         dnsmasq   11u  IPv6  95156      0t0  TCP MachineUbuntu:domain (LISTEN)

Vérifier que Dnsmasq écoute les requettes DNS sur les bonnes interfaces

$ sudo netstat -alnp | grep -i :53
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      53916/systemd-resol
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      53732/dnsmasq
tcp        0      0 10.10.10.1:53           0.0.0.0:*               LISTEN      53732/dnsmasq
tcp6       0      0 fd00:::53               :::*                    LISTEN      53732/dnsmasq
tcp6       0      0 fe80::b817:faff:fe21:53 :::*                    LISTEN      53732/dnsmasq
udp        0      0 127.0.0.53:53           0.0.0.0:*                           53916/systemd-resol
udp        0      0 127.0.0.1:53            0.0.0.0:*                           53732/dnsmasq
udp        0      0 10.10.10.1:53           0.0.0.0:*                           53732/dnsmasq
udp        0      0 0.0.0.0:5353            0.0.0.0:*                           772/avahi-daemon: r
udp6       0      0 fd00:::53               :::*                                53732/dnsmasq
udp6       0      0 fe80::b817:faff:fe21:53 :::*                                53732/dnsmasq
udp6       0      0 :::5353                 :::*                                772/avahi-daemon: r

Vérifier que le poste de travail écoute les résolution DNS de Dnsmasq

$ resolvectl dns
Global: 10.10.10.1 fd00::
Link 2 (enp0sxx): yyyy:yyyy:yyyy::yyyy yyy.yyy.yyy.yyy
Link 3 (virtualeth0):
Link 4 (wlx803xxxxx): yyyy:yyyy:yyyy::yyyy yyyy:yyyy:yyyy::yyyy yyyy:yyyy:yyyy::yyyy yyy.yyy.yyy.yyy
Link 5 (wlox): yyy.yyy.yyy.yyy

Vérifier la résolution DNS

$ dig MachineUbuntu +noall +answer
MachineUbuntu.                  0       IN      A       127.0.1.1
$ dig MachineUbuntu.domaine-perso.fr +noall +answer
MachineUbuntu.domaine-perso.fr. 0       IN      A       127.0.1.1
$ dig bidon.domaine-perso.fr +noall +answer
$ dig bidon +noall +answer

Éditer /etc/hosts pour définir les alias DNS

127.0.0.1 localhost
127.0.1.1 MachineUbuntu
…
# Alias DNS
10.10.10.5 courriel
10.10.10.10 serveur
10.10.10.20 documentation

Vérifier la résolution DNS (relancer Dnsmasq si nécessaire)

$ dig courriel.domaine-perso.fr +noall +answer
courriel.domaine-perso.fr. 0     IN     A     10.10.10.5
$ dig courriel +noall +answer
courriel.                  0     IN     A     10.10.10.5
$ dig serveur.domaine-perso.fr +noall +answer
serveur.domaine-perso.fr. 0     IN     A     10.10.10.10
$ dig serveur +noall +answer
serveur.                  0     IN     A     10.10.10.10
$ dig documentation.domaine-perso.fr +noall +answer
documentation.domaine-perso.fr. 0     IN     A     10.10.10.20
$ dig documentation +noall +answer
documentation.                  0     IN     A     10.10.10.20
$ dig bidon.domaine-perso.fr +noall +answer
$ dig bidon +noall +answer

Résolution DNS externe :

$ dig google.com +noall +answer
google.com.              16    IN     A     216.58.223.110