Documentation du Dr FRAPPE

Ce wiki regroupe les résultats de mes expériences en informatique accumulés au cours de mes recherches sur le net.

Dans la mesure du possible, j'ai cité mes sources ; il en manque certainement… :-)

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 Raspberry Pi dans cet exemple).

Pré-requis

  • un réseau local.
  • et une connexion à Internet active pour les tests.

Installation sur la machine du serveur

  1. Sous Linux : installez les paquets unbound,dnsutils,ldnsutils ou en ligne de commande (comme sur un Raspberry Pi via SSH) :

    ...@...:~$ sudo apt install unbound dnsutils ldnsutils

  2. 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.

</WRAP>

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

</WRAP>

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

  1. Relancer le service :

    ...@...:~ $ sudo service unbound restart

  2. Démarrer unbound :

    ...@...:~ $ sudo systemctl start unbound

  3. Arrêter unbound :

    ...@...:~ $ sudo systemctl stop unbound

  4. Redémarrer unbound :

    ...@...:~ $ sudo systemctl restart unbound

  5. 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


Basé sur « manuel » par unbound.

1)
C'est une alternative plus simple a configurer que bind9 pour un LAN de petite taille.