Unbound est un utilitaire de cache de DNS. il est utile pour gagner du temps sur ces requêtes de DNS, pour éviter un pistage de son FAI, pour dépasser les formes de censures nationales idiotes, pour s'éviter quelques publicités non voulues ou autres sites pollueurs, brefs pour reprendre un peu de contrôle. Notons qu'il fonctionne également sur Windows. Nous allons aborder dans cet article son installation et paramétrage sous linux Debian.

Installation

L'installation se fait simplement avec le package par défaut:

sudo apt-get install unbound  

Paramétrage

Editer le fichier de configuration /etc/unbound/unbound.conf:

# Unbound configuration file for Debian.
#
# See the unbound.conf(5) man page.
#
# See /usr/share/doc/unbound/examples/unbound.conf for a commented
# reference config file.
server:  
#de 0 à 5 en fonction de vos envies de messages ;), 0 seulement les erreurs
verbosity: 1  
interface: 0.0.0.0  
#Port sur lequel sont fait les requêtes DNS
port: 53  
#support de l'IPv4
do-ip4: yes  
#support de  l'IPv6
do-ip6: no  
#support udp
do-udp: yes  
#support tcp
do-tcp: yes  
#plages adresse ip autorisée à consulter le serveur dns
# Par défaut tout est refusé ! à part localhost.
# Possible choix :  deny (drop message), refuse (polite error reply),
# allow (recursive ok), allow_snoop (recursive and nonrecursive ok)
access-control: 127.0.0.0/8 allow  
access-control: 192.168.1.0/24 allow  
#Cacher les infos sur le serveur DNS
hide-identity: yes  
hide-version: yes  
#paramètre limitant l'usurpation de DNS
harden-glue: yes  
#Requérir les infos DNSSEC pour les zones de confiance
harden-dnssec-stripped: yes  
#Options permettant de ne pas prendre la casse en compte lors des requêtes d'url. 
#HomeServer-DIY.net sera traduit en homeserver-diy.net par le serveur et il communiquera la bonne IP
use-caps-for-id: yes  
#valeur mini de la TTL en secondes. Ne pas dépasser 1h
cache-min-ttl: 3600  
#valeur max de la TTL en secondes.
cache-max-ttl: 86400  
#activation du prefetch. Si un requête est faite lorsque la tll expire dans moins de 10% du temps qu'il lui est imparti
#le cache se mettra à jour aussitôt après avoir répondu à la requête.
prefetch: yes  
#nombre de core du serveur dns
num-threads: 2  
## Tweaks et optimisations du cache
#Nombre de slabs à utiliser . Doit être une puissance de 2 du num-threads.
msg-cache-slabs: 8  
rrset-cache-slabs: 8  
infra-cache-slabs: 8  
key-cache-slabs: 8  
#Réglage de la taille du cache en Mo:
rrset-cache-size: 51m  
msg-cache-size: 25m  
#Taille du buffer pour le port UPD en entrée. Evite la perte de message lors des requêtes
so-rcvbuf: 1m  
#Renforcer la vie privée des adresses du LAN. Ne mettre que des adresses locales
private-address: 192.168.1.0/24  
#Si non nulles, les réponses indésirables ne sont pas seulement signalés dans les statistiques, 
#mais aussi ajoutées à un total cumulé maintenu par thread. 
#Si elle atteint le seuil, un avertissement est affiché et une action défensive est prise,
#le cache est vidé pour éviter l'empoissonnement DNS. 
#Une valeur de 10000 est suggérée, la valeur par défaut est de 0 (service désactivé).
unwanted-reply-threshold: 10000  
#Autorisé à répondre aux requêtes du localhost
do-not-query-localhost: no  
#Emplacement du fichier root.key pour utilisation de DNSSEC
#auto-trust-anchor-file: "/var/lib/unbound/root.key"
# Est-ce que cette section supplémentaire, doit être conservée intacte pour les données non-sécurisées
# Utile pour protéger les utilisateurs d'une validation de données potentiellement boguées
# Toutes les données non signés dans la section supplémentaire seront retirés des messages sécurisés
val-clean-additional: yes

#
# The following line includes additional configuration files from the
# /etc/unbound/unbound.conf.d directory.
# atention à ne pas ajouter avant ou après !!!!
include: "/etc/unbound/unbound.conf.d/*.conf"

#Ajouter la zone qui transfère les requêtes DNS non effectuées par votre serveur vers le domaine racine (.)
forward-zone:  
 name: "."
 forward-addr: 208.67.222.222  #serveur DNS OpenDNS
 forward-addr: 208.67.220.220  #serveur DNS OpenDNS
 forward-addr: 8.8.8.8         #serveur DNS de google
 forward-addr: 8.8.4.4         #serveur DNS de google

Bannir certains sites

Première Méthode

Pour cela nous allons récupérer une liste de DNS des sites que nous ne souhaitons pas voir résolus, commes les sites de publicités, pornographie etc... et nous la formattons au format unbound:

wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | grep '^0\.0\.0\.0'  \  
| awk '{print "local-data: \""$2" A 0.0.0.0\""}' > /tmp/addlist.conf
wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/porn/hosts | grep '^0\.0\.0\.0' \  
 | awk '{print "local-data: \""$2" A 0.0.0.0\""}' > /tmp/pornlist.conf

Puis déplacer les fichiers .conf dans /etc/unbound/unbound.conf.d/

Seconde Méthode

on peut utilser un script disponible ici.

 wget https://raw.githubusercontent.com/jodrell/unbound-block-hosts/master/unbound-block-hosts
 chmod 755 unbound-block-hosts
unbound-block-hosts --file=/etc/unbound/unbound.conf.d/unbound-block-hosts.conf ;  

Redémarrer Unbound

Tests

Vérifier que le serveur tourne bien:

#:~$ sudo  netstat -antpu |grep unbound
tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      15745/unbound  
tcp        0      0 127.0.0.1:8953          0.0.0.0:*               LISTEN      15745/unbound  
udp        0      0 0.0.0.0:53              0.0.0.0:*                           15745/unbound  

Si vous n'avez pas la commande dig installer le package dnsutils.

sudo apt-get install dnsutils  

Faire un test sur un site, par exemple:

#:~$ dig ylegoff.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> ylegoff.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42634
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;ylegoff.com.            IN  A

;; ANSWER SECTION:
ylegoff.com.        10800   IN  A   212.83.191.142

;; AUTHORITY SECTION:
ylegoff.com.        10800   IN  NS  c.dns.gandi.net.  
ylegoff.com.        10800   IN  NS  b.dns.gandi.net.  
ylegoff.com.        10800   IN  NS  a.dns.gandi.net.

;; Query time: 204 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Oct 16 11:33:35 CEST 2016
;; MSG SIZE  rcvd: 117

Puis une seconde fois

#:~$ dig ylegoff.com

; <<>> DiG 9.10.3-P4-Ubuntu <<>> ylegoff.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4999
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;ylegoff.com.            IN  A

;; ANSWER SECTION:
ylegoff.com.        10797   IN  A   212.83.191.142

;; Query time: 0 msec
;; SERVER: 127.0.1.1#53(127.0.1.1)
;; WHEN: Sun Oct 16 11:33:38 CEST 2016
;; MSG SIZE  rcvd: 45

On peut vérifier que la seconde fois, le "Query time" a pour valeur 0 msec.
Ou utiliser dnslookup, par exemple:

#:~$ nslookup debian-fr.org
Server:        127.0.1.1  
Address:    127.0.1.1#53

Non-authoritative answer:  
Name:    debian-fr.org  
Address: 91.121.85.64  

Et vérifier que le serveur est bien 127.0.0.1.

Paramétrer le(s) poste(s)

Ensuite, il ne faut pas oublier de modifier la configuration réseau pour aller faire pointer le serveur DNS faire l'IP de la machine sur laquelle on a installé unbound, 127.0.0.1 si c'est la même.

Références

https://github.com/StevenBlack/hosts
https://doc.ubuntu-fr.org/unbound
https://abridge2devnull.com/posts/2016/03/unbound-dns-server-cache-control/
https://homeserver-diy.net/wiki