Dans un article précédent, nous avons vu comment configurer DNSCrypt combiné à un cache local géré par Bind. Un gentil commentateur m’a indiqué l’existence de Dnsmasq, qui semble en effet plus adapté.

Suite à l’article concernant la sécurisation des DNS, un lecteur (AP) m’a pointé Dnsmasq comme alternative à Bind. J'étais déjà tombé dessus lors de mes recherches de cache DNS, mais sa capacité à faire serveur DHCP et TFTP m’avait rapidement détourné de lui. Honte à moi, j’aurais dû creuser plus que 3 minutes.

L’intérêt principal par rapport à Bind est sa légèreté. Bind est une référence en terme de serveur DNS, mais c’est le canon pour tuer la mouche. Dnsmasq, simplement configuré, permet de jouer efficacement le rôle de cache DNS. Petit bonus : il s’intègre très bien avec Resolvconf et DNSCrypt. Dans cet article, on y apprend que Resolvconf va fournir à Dnsmasq les serveurs de noms (nameserver) externes. En effet, Resolvconf va générer un fichier spécifique (/var/run/dnsmasq/resolv.conf) qui contient l’ensemble des adresses des serveurs de noms. Dnsmasq va utiliser automatiquement ce fichier à la place du classique /etc/resolv.conf. Et ça, c’est très bien quand on utilise DNSCrypt : en effet, le script init.d de DNSCrypt va utiliser Resolvconf pour s’annoncer en tant que serveur de noms. Du coup, il ne faudra plus modifier ce script init.d comme avec Bind. Youpi !

Si vous voulez combiner DNSCrypt et Dnsmasq, vous pouvez suivre l’ article précédent jusqu’au point “Configuration avancée : serveur DNS aléatoire” inclus, puis continuer cet article.

Installation

Une vraie promenade de santé :

apt-get install dnsmasq

Par défaut, le service va écouter sur l’adresse 127.0.0.1, port 53. Il suffit donc de paramétrer cette adresse dans vos DNS (aussi en IPv6), et le tour est joué.

Attention : par défaut, Bind utilise la même adresse/port. Il vous faudra donc soit virer Bind, soit changer l’interface de l’un ou l’autre.

Configuration

La configuration se trouve dans “/etc/dnsmasq.conf”. Sous Ubuntu, le fichier est déjà très complet, et entièrement commenté. On va dé-commenter uniquement ces lignes :

domain-needed
bogus-priv
expand-hosts
cache-size=500

Explication des paramètres utilisés :

  • domain-needed : ne transmet pas les requêtes ne contenant pas un nom de domaine complet. Par exemple, “google” ne sera pas transmis aux serveurs de noms, alors que “google.com” le sera.
  • bogus-priv : fausse résolution inverse pour les réseaux privés. Toutes les requêtes DNS inverses pour des adresses IP privées (par exemple 192.168.x.x) qui ne sont pas trouvées dans /etc/hosts ou dans le fichier de baux DHCP se voient retournées une réponse “pas de tel domaine” au lieu d’être transmises aux serveurs de noms.
  • expand-hosts : utilise le contenu de /etc/hosts.
  • cache-size=500 : augmente la taille du cache DNS à 500 entrées au lieu de 150 par défaut.

Il suffit de redémarrer le service. On peut aussi vérifier que le serveur DNSCrypt, par défaut 127.0.2.1, est bien utilisé dans /var/run/dnsmasq/resolv.conf. Si vous n’utilisez pas DNSCrypt, vous pouvez utiliser le paramètre server= pour indiquer les serveurs de noms à utiliser, par exemple 8.8.8.8 pour celui de Google.

On va tester l’efficacité de notre cache :

for i in {1..10}; do dig youporn.com | grep time ; done
;; Query time: 169 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec
;; Query time: 0 msec

C’est même nettement moins que ce qu’on obtenait avec Bind pour la première requête : avec cette configuration, la première requête prend moins de 200 ms, alors qu’avec Bind on en était à plus de 2 secondes.

comments powered by Disqus