Dnscrypt permet de chiffrer et d'authentifier les requêtes DNS entre votre ordinateur et le serveur DNS.
Il sera couplé avec Pdnsd afin d'avoir un cache persistent.
Au cas ou le serveur DNS tombe, nous verrons comment mettre en place un second serveur.
L'installation suivante est réalisée sur une Arch Linux.
Rien de bien compliqué, taper dans un terminal :
# pacman -S dnscrypt-proxy pdnsd
DNSCrypt est lancé en root, mieux vaut créer un utilisateur pour le lancer :
# useradd -r -d /var/dnscrypt -m -s /sbin/nologin dnscrypt
Il suffira de modifier le service en utilisant –user=dnscrypt
Le fichier /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv
contient la liste des résolveurs utilisables en première colonne, on peut lister avec :
$ cat /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv | cut -d"," -f1
Il ne se met pas à jour automatiquement, pour avoir une liste à jour voir https://github.com/jedisct1/dnscrypt-proxy/blob/master/dnscrypt-resolvers.csv
Il faut modifier le fichier /etc/resolv.conf
, il doit contenir cela :
# vim /etc/resolv.conf nameserver 127.0.0.1 options edns0
Certains programmes peuvent modifier ce fichier, afin de les en empêcher :
# chattr +i /etc/resolv.conf
Commençons par créer le service suivant dans /etc/systemd/system/
:
# vim /etc/systemd/system/dnscrypt-proxy@.service
Insérer ces lignes :
[Unit] Description=DNSCrypt client proxy Documentation=man:dnscrypt-proxy(8) Requires=dnscrypt-proxy@%i.socket [Service] Type=notify NonBlocking=true ExecStart=/usr/bin/dnscrypt-proxy --user=dnscrypt --resolver-name=%i Restart=always
Ce service permettra de lancer un dnscrypt-proxy dont le nom sera spécifié derrière l'@.
Mettons en place le premier proxy en écoute sur 127.0.0.1 et le port 40. J'ai choisi fvz-anyone, alias OpenNic.
Copier /lib/systemd/system/dnscrypt-proxy.socket
sur /etc/systemd/system/dnscrypt-proxy@fvz-anyone.socket
.
# cp /lib/systemd/system/dnscrypt-proxy.socket /etc/systemd/system/dnscrypt-proxy@fvz-anyone.socket
On met à jour le nouveau socket :
# systemctl enable dnscrypt-proxy@fvz-anyone.socket # systemctl daemon-reload
Par défaut il est en écoute sur le port 53, pour qu'il écoute sur le port 40 il faut le modifier :
# systemctl edit dnscrypt-proxy@fvz-anyone.socket
Et insérer ces lignes :
[Socket] ListenStream= ListenDatagram= ListenStream=127.0.0.1:40 ListenDatagram=127.0.0.1:40
Cette fois j'ai choisi fvz-anytwo, il devra écouter sur le port 41.
# cp /lib/systemd/system/dnscrypt-proxy.socket /etc/systemd/system/dnscrypt-proxy@fvz-anytwo.socket # systemctl enable dnscrypt-proxy@fvz-anytwo.socket # systemctl daemon-reload # systemctl edit dnscrypt-proxy@fvz-anytwo.socket
Et on y colle ces lignes :
[Socket] ListenStream= ListenDatagram= ListenStream=127.0.0.1:41 ListenDatagram=127.0.0.1:41
On pourrait en ajouter autant qu'on veut du moment que les ports d'écoute soient différent les uns des autres.
# systemctl start dnscrypt-proxy@fvz-anyone.socket dnscrypt-proxy@fvz-anytwo.socket
Modifier le fichier /etc/pdnsd.conf
pour qu'il contienne ceci :
# vim /etc/pdnsd.conf
global { perm_cache = 16384; cache_dir = "/var/cache/pdnsd"; run_as = "pdnsd"; server_ip = 127.0.0.1; status_ctl = on; query_method = udp_tcp; min_ttl = 8h; max_ttl = 1w; timeout = 10; neg_domain_pol = on; udpbufsize = 1024; neg_rrs_pol=on; par_queries=1; } server { label = "fvz-anyone"; ip = 127.0.0.1; port = 40; timeout = 2; proxy_only = on; purge_cache = off; } server { label = "fvz-anytwo"; ip = 127.0.0.1; port = 41; timeout = 2; proxy_only = on; purge_cache = off; } source { owner = localhost; file = "/etc/hosts"; }
On active Pdnsd au démarrage et on le lance :
# systemctl enable pdnsd # systemctl start pdnsd
Vérifions si les proxys fonctionnent :
drill www.google.com 127.0.0.1 -p 40
;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 9340 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;; 127.0.0.1. IN A ;; ANSWER SECTION: ;; AUTHORITY SECTION: . 3600 IN SOA ns0.opennic.glue. hostmaster.opennic.glue. 2017011806 1800 900 604800 3600 ;; ADDITIONAL SECTION: ;; Query time: 102 msec ;; EDNS: version 0; flags: ; udp: 1252 ;; SERVER: 127.0.0.1 ;; WHEN: Wed Jan 18 08:53:38 2017 ;; MSG SIZE rcvd: 100
Et pdnsd :
drill www5.yahoo.com
;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 10351 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;; www5.yahoo.com. IN A ;; ANSWER SECTION: ;; AUTHORITY SECTION: yahoo.com. 28797 IN SOA ns1.yahoo.com. hostmaster.yahoo-inc.com. 2017011806 3600 300 1814400 600 ;; ADDITIONAL SECTION: ;; Query time: 145 msec ;; SERVER: 127.0.0.1 ;; WHEN: Wed Jan 18 09:07:06 2017 ;; MSG SIZE rcvd: 93
Lançons cette requête une deuxième fois, le temps de réponse doit être proche de zéro.
drill www5.yahoo.com
;; ->>HEADER<<- opcode: QUERY, rcode: NXDOMAIN, id: 10351 ;; flags: qr rd ra ; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;; www5.yahoo.com. IN A ;; ANSWER SECTION: ;; AUTHORITY SECTION: yahoo.com. 28797 IN SOA ns1.yahoo.com. hostmaster.yahoo-inc.com. 2017011806 3600 300 1814400 600 ;; ADDITIONAL SECTION: ;; Query time: 0 msec ;; SERVER: 127.0.0.1 ;; WHEN: Wed Jan 18 09:07:06 2017 ;; MSG SIZE rcvd: 93