Utiliser DNScrypt sur l'ensemble de son réseau local.

Pour vivre heureux, vivons caché

Sommaire

Edit du 17 mars 2018: le proxy utilisé dans ce tuto a été abandonné, il existe désormais une version en go à cette page. Pour ma part je n’utilise plus dnscrypt que j’ai trouvé de moins en moins fiable, sur fond de rumeur d’abandon du projet. À la place je vous recommande plutôt Unbound.

Contexte

Ce papier fait suite au précédent Chiffrer ses requêtes DNS avec DNScrypt et le complète en donnant une recette afin d’installer DNScrypt. Contrairement à ce que je déclarai dans ce papier, je suis revenu à une installation à la main, plutôt que de recourir à un script. Ce qu’on gagne en solution clé en main, on le perd en apprentissage et en maîtrise… Et je n’aime pas trop ça. Avec ce tuto, en quelques étapes, vous devriez pouvoir utiliser chez vous un résolveur DNS chiffré: - Que ce soit: pour un usage sur le poste où le soft est installé; - Ou bien plus intéressant: pour un usage à destination de tous les dispositifs connectés au réseau local; il faudra dans ce cas installer un serveur DNS local en plus. J’utilise pour ma part dnsmasq, mais vous être libre d’en prendre un autre (le wiki d’arch, vachement bien fichu - comme d’habitude - sera votre ami dans ce cas).

Alors comment on fait? C’est ce que nous allons voir.

Installation de DNScrypt et dépendance

Sur ubuntu il existe un PPA, mais si comme moi vous préférez debian, il faudra procéder à une installation plus manuelle. Il sera d’abord nécessaire de récupérer deux dépendances non disponibles sur Jessie à cette date, puis de dl le soft lui-même. Rassurez-vous, ce ne sont que des .deb. Je vous donne le lien pour les .deb à jour “ce jour”, et en dessous le lien vers le repo. Ainsi il vous sera possible de vérifier s’il n’existe pas une version “plus à jour” que celle proposée au moment de la rédaction de ce billet.

~$ wget http://cdn-fastly.deb.debian.org/debian/pool/main/libt/libtool/libltdl7_2.4.6-2_amd64.deb

http://http.debian.net/debian/pool/main/libt/libtool/

~$ wget http://cdn-fastly.deb.debian.org/debian/pool/main/libs/libsodium/libsodium18_1.0.11-1_amd64.deb

http://http.debian.net/debian/pool/main/libs/libsodium/

~$ wget http://cdn-fastly.deb.debian.org/debian/pool/main/d/dnscrypt-proxy/dnscrypt-proxy_1.9.4-1_amd64.deb

http://http.debian.net/debian/pool/main/d/dnscrypt-proxy/

Les .deb récupérés, un triple dpkg -i suffira à installer DNScrypt:

~$ dpkg -i libltdl7_2.4.6-2_amd64.deb
~$ dpkg -i libsodium18_1.0.11-1_amd64.deb
~$ dpkg -i dnscrypt-proxy_1.9.4-1_amd64.deb

Configuration de DNScrypt

On commence par régler le port d’écoute du soft afin qu’il n’empiète pas sur dnsmasq (on l’installera juste après celui-là). Si vous souhaitez n’utiliser DNScrypt que pour un seul pc, cette étape n’est pas nécessaire; il faudra donc garder le port d’écoute par défault des DNS qui est le 53.

~$ nano /lib/systemd/system/dnscrypt-proxy.socket
      [Socket]
      ListenStream=
      ListenDatagram=
      ListenStream=127.0.0.1:5353
      ListenDatagram=127.0.0.1:5353
      #127.0.0.1:5353 correspond à l'ip locale de votre machine, sur le port 5353.

On va ensuite choisir les DNS chiffrés qu’on souhaite utiliser ici. Comme je l’ai expliqué précédemment ma préférence va au choix de prendre un serveur de type random, qui fera ses requêtes dans différent serveur DNScrypt; ce qui vous garantira - puisque ce ne sera pas le même serveur qui recevra toutes vos requêtes - une meilleur confidentialité.

~$ nano /etc/dnscrypt-proxy/dnscrypt-proxy.conf
      #et pas /etc/dnscrypt-proxy.conf comme écrit à pas mal d'endroit sur internet, et qui m'a fait perdre un temps certain!
      ResolverName d0wn-random-ns2
      ResolverName d0wn-random-ns2-ipv6
      LocalAddress 127.0.0.1:5353

On active DNScrypt dans systemctl:

~$ systemctl enable dnscrypt-proxy.service
~$ systemctl enable dnscrypt-proxy.socket

Et on lance le service:

~$ systemctl start dnscrypt-proxy.service
~$ systemctl start dnscrypt-proxy.socket

Pour avoir des infos, il suffit de mettre status:

~$ systemctl status dnscrypt-proxy.service
~$ systemctl status dnscrypt-proxy.socket


Pour un usage uniquement sur l’hôte de l’installation de DNScrypt, il suffira de modifier dans vos paramètres réseaux l’adresse du DNS, c’est à dire de renseigner l’ip 127.0.0.1

Pour les autres, il faut à présent passer à l’installation et à la configuration de dnsmasq qui va desservir en DNS votre réseau local en faisant le pont avec votre DNScrypt; mais aussi stocker les requêtes précédentes localement (ce qui est relativement sympa).

Installation et configuration de dnsmasq

Pour éviter que dnsmasq ne touche à resolv.conf, c’est à dire qu’il ne joue - c’est ce qu’on cherche - que le rôle de relais de DNScrypt, il faut:

~$ nano /etc/resolv.conf
      nameserver 127.0.0.1

Puis interdire la modification de ce fichier avec:

~$ chattr +i /etc/resolv.conf  
      #si besoin chattr -i pour reprendre le droit de modification

Ensuite vient le moment d’installer le soft, et d’y mettre ces paramètres:

~$ apt install dnsmasq
~$ nano /etc/dnsmasq.conf
      port=53                                                
      domain-needed
      bogus-priv
      dnssec                          
      proxy-dnssec                
      no-resolv
      server=127.0.0.1#5353      
      interface=eth0                   
      listen-address=192.168.XXX.XXX
      expand-hosts
      cache-size=6000
      #port=53: port d'écoute de dnsmasq
      #dnssec: pour une validation dnssec, optionnelle
      #proxy-dnssec: pour une validation dnssec, optionnelle
      #server=127.0.0.1#5353: ip et port de votre DNScrypt
      #interface=eth0: l'interface réseau de votre pc
      #listen-address=192.168.XXX.XXX: l'ip du serveur où vous avez installé DNScrypt: c'est l'adresse locale que vos autres machines vont joindre pour faire leur requête DNS
      #Cache-size=6000: cela va stocker 6000 requêtes en cache local, c'est sans doute beaucoup, mais quand on aime on ne compte pas.

On active dnsmasq et on relance tout!

~$ systemctl enable dnsmasq.service
~$ systemctl restart dnscrypt-proxy.socket
~$ systemctl restart dnscrypt-proxy.service
~$ systemctl restart dnsmasq.service

Il ne vous reste plus qu’à indiquer l’ip 192.168.XXX.XXX dans l’interface web de votre box, ou dans les paramètres réseaux de vos/votre pc.


Ensuite il vous faudra redémarer pour permettre la mise à jour du service DNS de votre machine, puis tester si tout fonctionne à l’aide de ces deux sites:
- Dnsleaktest: pour vérifier que vous utilisez bien des serveurs dnscrypt, plutôt que ceux de votre opérateur.
- Dnssec: pour vérifier que vos requêtes sont bien signées gpg.

Bonus 1 : Ajouter de l’entropie pour garantir un niveau de chiffrement suffisant

Pour ceux installant ce service sur une machine virtuelle, il est très possible que rapidement vous ne disposiez plus d’une réserve d’entropie suffisante pour vous permettre de garantir un chiffrement efficace. Une solution simple est d’installer haveged.

edit 24 mars 2017: Suite à la sagacité d’un lecteur j’édite afin de mettre en garde avant de faire le choix d’utiliser Haveged edit 10 avril 2017: Pour aller plus loin sur l’entropie et son utilité

~$ apt-get install haveged
~$ nano /etc/default/haveged
      DAEMON_ARGS="-w 4096"
~$ service haveged start
~$ update-rc.d haveged defaults

Bonus 2 : Pour forcer ubuntu 16.04 à utiliser le DNS qu’on lui dit

~$ nano /etc/network/interfaces
      dns-nameservers 192.168.XXX.XXX

Sources

https://wiki.archlinux.org/index.php/DNSCrypt
https://blog.milne.it/2017/02/05/dnscrypt-proxy-alternative-install-method-for-debian-raspbian-jessie/
http://www.drazzib.com/docs/admin/dnsmasq.html
https://www.skyminds.net/serveur-dedie-produire-une-meilleure-reserve-dentropie-avec-haveged/