−Table des matières
Unbound : un serveur DNS local
Unbound est un serveur de noms DNS, c’est à dire qu’il traduit un nom de domaine en adresse IP. 1)
Il fait cette traduction :
- soit d’après sa propre config,
- soit en faisant appel à d’autres serveurs DNS.
Dans un souci d’efficacité, il peut mettre les résultats en cache.
Nous utiliserons Unbound en tant que serveur DNS sur le réseau local pour définir des domaines factices (comme on le ferait avec un fichiers hosts, mais en plus poussé et automatisé).
Le serveur Unbound sera installé sur un serveur du réseau local (un RPI dans cet exemple).
Pré-requis
- un réseau local.
- et une connexion à Internet active pour les tests.
Installation sur la machine du serveur
- Sous Linux : installez les paquets unbound,dnsutils,ldnsutils ou en ligne de commande (comme sur un RPI via SSH) :
...@...:~$ sudo apt install unbound dnsutils ldnsutils
- Sous Windows : Téléchargez l'installateur unbound_setup_x.x.x.exe sur la page http://unbound.net/download.html et lancez-le.
Configuration
Sous Linux
Les fichiers de configuration (nommés <xxx>.conf) sont désormais placés dans le répertoire /etc/unbound/unbound.d/.
Ainsi, le fichier /etc/unbound/unbound.conf reste inchangé.
Voici un exemple de fichier local.conf pour un serveur DNS avec déclaration automatique des sous-domaines :
- /etc/unbound/unbound.conf.d/local.conf
server: #verbosity: 1 # Répondre aux requêtes DNS sur toutes les interfaces réseau. interface: 0.0.0.0 port: 53 # ouverture à tout le monde access-control: 0.0.0.0/0 allow chroot: "" # emplacement du fichier de log logfile: "/var/log/unbound.log" # je ne souhaite pas "pourrir" le syslog use-syslog: no # zone *.chateau local-zone: "chateau." redirect local-data: "chateau. IN A 127.0.0.1" # zone *.framboise local-zone: "framboise." redirect local-data: "framboise. IN A 127.0.0.1" # Utilisation du DNS "normal" (ici, celui de la box) pour tout le reste forward-zone: name: "." forward-addr: 192.168.0.254
Pour les options, voir la page unbound.conf(5) - page de man.
Fichier exemple fourni avec unbound
Liste des serveurs DNS racines
Téléchargez le fichier named.cache (liste des serveurs DNS racines sur lequel s'appuiera unbound pour répondre aux requêtes et enregistrez-le dans le répertoire /var/lib/unbound/ en le renommant root.hints :
$ wget ftp://FTP.INTERNIC.NET/domain/named.cache -O /var/lib/unbound/root.hints
Voici l'exemple fourni avec le paquet : Exemple de fichier Unbound.conf
- verbosity: <chiffre>
-
Niveau de détail des messages.
- 0 ⇒ pas de message, que les erreurs.
- 1 ⇒ informations opérationnelles. (par défaut)
- 2 ⇒ informations opérationnelles détaillées.
- 3 ⇒ informations au niveau requête, classées par requête.
- 4 ⇒ informations au niveau de l'algorithme.
- 5 ⇒ enregistre l'identification des clients non mis en cache.
- interface: <ip address[@port]>
- Interface à utiliser pour se connecter au réseau.
- Par défaut : localhost, port par défaut (fourni par le paramètre port, 53 sinon).
- Cette interface sert à l’écoute des requêtes des clients et au renvoi des réponses.
- Peut être fourni plusieurs fois pour travailler sur de multiples interfaces.
- Les interfaces ne sont pas modifiées par un reload (kill -HUP), mais seulement au redémarrage.
- port: <port number>
- Numéro de port sur lequel le serveur répond aux requêtes.
- par défaut : 53
- do-ip4: <yes or no>
- Active ou désactive les réponses aux requêtes IP4.
- Par défaut : yes.
- do-ip6: <yes or no>
- Active ou désactive les réponses aux requêtes IP6.
- Par défaut : yes.
- do-udp: <yes or no>
- Active ou désactive les réponses aux requêtes UDP.
- Par défaut : yes.
- do-tcp: <yes or no>
- Active ou désactive les réponses aux requêtes TCP.
- Par défaut : yes.
- do-daemonize: <yes or no>
- Active ou désactive le fonctionnement en arrière-plan (comme un démon).
- Par défaut : yes.
- access-control: <IP netblock> <action>
- netblock : plage d'adresses IP4 ou IP6 suivie de /size pour un bloc de réseau sans classes.
-
Actions possibles : deny, refuse, allow, allow_snoop, deny_non_local ou refuse_non_local.
- deny : bloque les requêtes des hôtes de cette plage d'adresses
- refuse : bloque aussi les requêtes mais renvoie un message d'erreur DNS rcode REFUSED.
- allow autorise les requêtes des hôtes de cette plage d'adresses. N'autorise que les clients récursifs, les requêtes non recursives sont refusées.
- allow_snoop autorise aussi l'accès non recursif. Cela donne un accès à la fois récursif et non récursif.
- deny_non_local : les messages non autorisés sont sautés
- refuse_non_local ils reçoivent le code d'erreur REFUSED.
- Si aucun deny ne correspond, la correspondance de plage la plus spécifique est utilisée.
- Par défaut, seul localhost est autorisé, le reste est bloqué.
- root-hints: <filename>
- Lire les indications de racine dans ce fichier.
- Par défaut : rien, en utilisant des builtin pour la classe IN.
- Le fichier a le format des fichiers de zone, avec seulement root names et addresses.
- hide-identity: <yes or no>
- hide-version: <yes or no>
- Cacher les infos sur le serveur DNS.
- harden-glue: <yes or no>
- limite l'usurpation de DNS.
- Par défaut : yes.
- harden-dnssec-stripped: <yes or no>
- Requérir les infos DNSSEC pour les zones de confiance.
- Par défaut : on.
- use-caps-for-id: <yes or no>
- Ne pas tenir compte de la casse dans la requête : MonSite.com équivaut à monsite.com.
- no par défaut
- cache-min-ttl: <seconds>
- valeur mini de la TTL en secondes. Ne pas dépasser 1h
- Par défaut : 0.
- prefetch: <yes or no>
- 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.
- Par défaut : no.
- num-threads: <number>
- Le nombre de threads à créer pour servir les clients. Utilisez 1 pour pas de threading.
- msg-cache-slabs: <number>
- rrset-cache-slabs: <number>
- infra-cache-slabs: <number>
- key-cache-slabs: <number>
- Nombre de slabs à utiliser . Doit être une puissance de 2 du num-threads.
- rrset-cache-size: <number>
- msg-cache-size: <number>
- Taille du cache. A plain number is in bytes, append 'k', 'm' or 'g' for kilobytes, megabytes or gigabytes (1024*1024 bytes in a megabyte).
- Par défaut : 4 mégaoctets.
- so-rcvbuf: <number>
- Taille du buffer pour le port UPD en entrée. Évite la perte de message lors des requêtes
- Par défaut : 0 (utiliser la valeur système)
- private-address: <IP address or subnet>
- Give IPv4 of IPv6 addresses or classless subnets. These are addresses on your private network, and are not allowed to be returned for public internet names. Any occurrence of such addresses are removed from DNS answers. Additionally, the DNSSEC validator may mark the answers bogus. This protects against so-called DNS Rebinding, where a user browser is turned into a network proxy, allowing remote access through the browser to other parts of your private network. Some names can be allowed to contain your private addresses,
- By default all the local-data that you configured is allowed to, and you can specify additional names using private-domain. No private addresses are enabled by default.
- We consider to enable this for the RFC1918 private IP address space by default in later releases. That would enable private addresses for 10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16 fd00::/8 and fe80::/10, since the RFC standards say these addresses should not be visible on the public internet. Turning on 127.0.0.0/8 would hinder many spam-blocklists as they use that. Adding ::ffff:0:0/96 stops IPv4-mapped IPv6 addresses from bypassing the filter.
- unwanted-reply-threshold: <number>
- 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. Quand le seuil est atteint, 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é).
- Par défaut : 0 (désactivé).
- do-not-query-localhost: <yes or no>
- Interdire de répondre aux requêtes du localhost ?
- Par défaut : yes (localhost est interdit)
- Si no, localhost est utilisable.
- val-clean-additional: <yes or no>
- 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
- Par défaut : yes.
- chroot: <directory>
- If chroot is enabled, you should pass the configfile (from the commandline) as a full path from the original root. After the chroot has been performed the now defunct portion of the config file path is removed to be able to reread the config after a reload.
- All other file paths (working dir, logfile, roothints, and key files) can be specified in several ways: as an absolute path relative to the new root, as a relative path to the working directory, or as an absolute path relative to the original root. In the last case the path is adjusted to remove the unused portion.
- The pidfile can be either a relative path to the working directory, or an absolute path relative to the original root. It is written just prior to chroot and dropping permissions. This allows the pidfile to be /var/run/unbound.pid and the chroot to be /var/unbound, for example.
- Additionally, unbound may need to access /dev/random (for entropy) from inside the chroot.
- If given a chroot is done to the given directory.
- The default is “/usr/local/etc/unbound”.
- If you give “” no chroot is performed.
- username: <name>
- If given, after binding the port the user privileges are dropped. Default is “unbound”. If you give username: “” no user change is performed.
- If this user is not capable of binding the port, reloads (by signal HUP) will still retain the opened ports. If you change the port number in the config file, and that new port number requires privileges, then a reload will fail; a restart is needed.
- directory: <directory>
- Sets the working directory for the program. Default is “/usr/local/etc/unbound”. On Windows the string “%EXECUTABLE%” tries to change to the directory that unbound.exe resides in.
- use-syslog: <yes or no>
- Sets unbound to send log messages to the syslogd, using syslog(3). The log facility LOG_DAEMON is used, with identity “unbound”. The logfile setting is overridden when use-syslog is turned on.
- The default is to log to syslog.
- pidfile: <filename>
- The process id is written to the file.
- Default is “/usr/local/etc/unbound/unbound.pid”. So, kill -HUP `cat /usr/local/etc/unbound/unbound.pid` triggers a reload, kill -TERM `cat /usr/local/etc/unbound/unbound.pid` gracefully terminates.
- root-hints: <filename>
- Read the root hints from this file.
- Default is nothing, using builtin hints for the IN class. The file has the format of zone files, with root nameserver names and addresses only. The default may become outdated, when servers change, therefore it is good practice to use a root-hints file.
Voici un exemple commenté
- /etc/unbound/unbound.d/mondns.com
server: # Répondre aux requêtes DNS sur toutes les interfaces réseau. interface: 0.0.0.0 # plage adresses ip autorisées à consulter le serveur dns : # uniquement le réseau local access-control: 192.168.0.0/24 allow # Ignorer la casse # HomeServer-DIY.net sera traduit en homeserver-diy.net et le serveur et communiquera la bonne IP use-caps-for-id: yes # Renforcer la vie privée des adresses du LAN. Ne mettre que des adresses locales private-address: 192.168.1.0/24
Pour créer des DNS avec tous les sous-domaines, utiliser la directive redirect.
Exemple pour localhost :
server: # zone *.localhost local-zone: "localhost" redirect local-data: "localhost A 127.0.0.1"
Il génère tous les sous-domaines xxx.localhost, a.localhost, etc.
Serveur DNS avec déclaration automatique des sous-domaines
Ouvrez avec les droits d'administration le fichier /etc/unbound/unbound.conf pour le modifier comme voulu :
Voici un exemple de fichier unbound.conf :
Nous créons ici des noms *.dev.com
- /etc/unbound/unbound.conf
server: verbosity: 1 interface: 192.168.0.31 access-control: 0.0.0.0/0 allow chroot: "" logfile: "/var/log/unbound.log" use-syslog: no local-zone: "dev.com." redirect local-data: "dev.com. IN A 192.168.0.1" # Utilisation du DNS "normal" pour tout le reste (ici, celui de la box) forward-zone: name: "." forward-addr: 192.168.0.254
- verbosity
- degré de précision des messages
- interface
- adresse réseau du serveur (il peut y avoir plusieurs lignes pour plusieurs adresses
- access-control:
-
- 0.0.0.0/0 allow
- ouverture à tout le monde
- logfile:
- emplacement du fichier de log
- use-syslog: no
- pour ne pas “pourrir” le syslog
- local-zone:
-
la zone *.dev.com
- local-zone: “dev.com.” redirect
- crée les redirections
- local-data: “dev.com. IN A 192.168.0.1”
- IP de la machine qui sert ce domaine et ses sous-domaines
- forward-zone:
-
Utilisation du DNS “normal” pour tout le reste
- name: “.”
- pour tout le reste
- forward-addr: 192.168.0.254
- DNS de la box
Test
Lancez :
...@...:~ $ unbound-checkconf
Exemples
Exemple fourni avec le paquet
- /etc/unbound/unbound.d/monserveurdns.com
server: # Les lignes suivantes concernent la configuration de unbound pour les # performance crypto DNSSEC en utilisant la clé des serveurs root auto-trust-anchor-file: "/var/lib/unbound/root.key" # Activer les logs # verbosity: 1 (par défaut) #Répondre aux requêtes DNS sur toutes les interfaces réseau. interface: 0.0.0.0 #Port sur lequel sont fait les requêtes DNS #port: 53 (par défaut) #support de l'IPv4 #do-ip4: yes (par défaut) #support de l'IPv6 do-ip6: no #support udp #do-udp: yes (par défaut) #support tcp #do-tcp: yes (par défaut) #plages adresse ip autorisée à consulter le serveur dns #access-control: 127.0.0.0/8 allow #access-control: 192.168.1.0/24 allow #access-control: 192.168.1.26 #plage ip comprise entre 192.168.0.0 et 192.168.255.255 access-control: 192.168.1.0/16 allow #emplacement du fichier indiquant les infos pour consulter les serveurs DNS root #fichier à télécharger là à cette adresse: ftp://FTP.INTERNIC.NET/domain/named.cache root-hints: "/var/lib/unbound/root.hints" #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
Conf de Korben, Voir : http://korben.info/installer-unbound-serveur-dns-sous-linux.html
server: #verbosity: 1 interface: 0.0.0.0 #port: 53 #do-ip4: yes #do-ip6: yes #do-udp: yes #do-tcp: yes do-daemonize: yes access-control: 0.0.0.0/0 allow #access-control: 0.0.0.0/0 refuse #access-control: 127.0.0.0/8 allow chroot: "/var/unbound" username: "unbound" directory: "/var/unbound" use-syslog: yes pidfile: "/var/run/unbound.pid" root-hints: "/var/unbound/named.cache"
avec un utilisateur dédié créé par :
sudo groupadd unbound sudo useradd -d /var/unbound -m -g unbound -s /bin/false unbound
Le répertoire /var/unbound sera utilisé par Unbound et contiendra les fichiers de config.
Bloquer les pubs sur internet
De nombreuses pages web contiennent du code qui affiche des pubs en s'appuyant sur les noms de domaines des régies publicitaires de google, yahoo etc. Lors du chargement de la page, votre ordinateur fera donc une requête DNS pour résoudre les domaines de ces régies.
Pour bloquer ces pubs, il suffit de configurer unbound pour qu'il retourne une adresse IP non attribuée du réseau local. Mais celle du localhost de l'exemple fonctionne aussi très bien. Voici ce qu'il suffit d'ajouter à la fin du fichier unbound.conf:
local-zone: "doubleclick.net" redirect local-data: "doubleclick.net A 127.0.0.1" local-zone: "googlesyndication.com" redirect local-data: "googlesyndication.com A 127.0.0.1" local-zone: "googleadservices.com" redirect local-data: "googleadservices.com A 127.0.0.1" local-zone: "google-analytics.com" redirect local-data: "google-analytics.com A 127.0.0.1" local-zone: "ads.youtube.com" redirect local-data: "ads.youtube.com A 127.0.0.1" local-zone: "adserver.yahoo.com" redirect local-data: "adserver.yahoo.com A 127.0.0.1"
Cette liste n'est pas exhaustive ; le fichier suivant contient un grand nombre de domaines utilisés par un grande nombre de régies publicitaires : Regies pub.odt
Sous Windows
La configuration se fait en éditant le fichier C:\Program Files\Unbound\unbound.conf.
A ce même endroit se trouve un fichier exemple C:\Program Files\Unbound\example.conf que l'on peut recopier en le renommant unbound.conf pour partir de cette base.
Utilisation
Sous ubuntu
Contrôle
- Relancer le service :
...@...:~ $ sudo service unbound restart
- Démarrer unbound :
...@...:~ $ sudo systemctl start unbound
- Arrêter unbound :
...@...:~ $ sudo systemctl stop unbound
- Redémarrer unbound :
...@...:~ $ sudo systemctl restart unbound
- Connaître l'état d'unbound :
...@...:~ $ sudo systemctl status unbound
Sous Windows
Utilisation depuis les autres machines
Le plus simple est d'utiliser le protocole DHCP : déclarez sur votre box l'adresse de votre serveur hébergeant unbound pour que toutes vos machines utilisent ce nouveau service auto-hébergé:
Désinstallation
- Pour supprimer cette application, il suffit de supprimer son paquet :
...@...:~ $ sudo apt-get remove unbound
- ou pour effacer tout :
...@...:~ $ sudo apt-get purge unbound
Voir aussi
- (en) manuel (pdf)
- (fr) doc ubuntu : https://doc.ubuntu-fr.org/unbound
- (en) site officiel : http://unbound.net/
- (en) page de man unbound : https://www.unbound.net/documentation/unbound.html
- (en) page de man unbound.conf : https://www.unbound.net/documentation/unbound.conf.html
- (en) tutoriel https://calomel.org/unbound_dns.html
Basé sur « manuel » par unbound.