Unbound

De Wiki doc


Unbound est un serveur DNS faisant office de résolveur récursif et pouvant faire autorité sur des domaines locaux. Il est développé par NLnet Labs et se veut à la fois complet en fonctionnalité, léger (grâce à la modularité de ces dernières) et simple à configurer.

Installation et configuration

Installation du service avec une Debian Bullseye

apt install --no-install-recommends unbound

Afin d'utiliser directement les serveurs racines pour la résolution récursive des requêtes clientes, il faut télécharger la liste contenant leurs adresses

wget https://www.internic.net/domain/named.root -O /var/lib/unbound/root.hints && chown unbound:unbound /var/lib/unbound/root.hints

Le fichier de configuration suivant sera utilisé

<syntaxhighlight lang="nestedtext"> cat << _EOF_ > /etc/unbound/unbound.conf

  1. Fichier de configuration d'Unbound pour Debian.
  2. Référez-vous à la page de manuel unbound.conf(5).
  3. Voyez /usr/share/doc/unbound/examples/unbound.conf pour un
  4. fichier de configuration de référence commenté.
  5. La ligne suivante permet d'inclure les fichiers de configuration
  6. additionnels depuis le répertoire /etc/unbound/unbound.conf.d.

include-toplevel: "/etc/unbound/unbound.conf.d/*.conf"

server: statistics-interval: 0 extended-statistics: yes statistics-cumulative: yes verbosity: 3

  1. Paramètres réseau

interface: 127.0.0.1 interface: 192.168.1.5 port: 53 do-ip4: yes do-ip6: no do-udp: yes do-tcp: no

  1. Contrôle d'accès

access-control: 127.0.0.0/8 allow access-control: 192.168.0.0/16 allow access-control: 0.0.0.0/0 refuse

  1. DNSSEC
  2. auto-trust-anchor-file: "/var/lib/unbound/root.key"

harden-dnssec-stripped: yes

  1. Adresses des serveurs racine

root-hints: "/var/lib/unbound/root.hints"

  1. Paramètres système

hide-identity: yes hide-version: yes harden-glue: yes use-caps-for-id: yes cache-min-ttl: 3600 cache-max-ttl: 86400 prefetch: yes num-threads: 6 msg-cache-slabs: 16 rrset-cache-slabs: 16 infra-cache-slabs: 16 key-cache-slabs: 16 rrset-cache-size: 256m msg-cache-size: 128m so-rcvbuf: 1m unwanted-reply-threshold: 10000 do-not-query-localhost: yes val-clean-additional: yes

  1. Journalisation

use-syslog: no logfile: /var/log/unbound.log

  1. Paramètres du cache

cache-min-ttl: 3600 cache-max-ttl: 86400 prefetch: yes prefetch-key: yes _EOF_ </syntaxhighlight>

Il est possible de servir des domaines locaux (faire autorité)

<syntaxhighlight lang="nestedtext"> cat << _EOF_ > /etc/unbound/unbound.conf.d/ycharbi.yo.conf server: local-zone: "ycharbi.yo." static local-data: "ycharbi.yo. IN A 192.168.1.1" local-data: "toto1.ycharbi.yo. IN A 192.168.1.25" local-data: "ycharbi.yo. IN MX 10 toto1.ycharbi.yo." _EOF_ </syntaxhighlight>

Il est également possible de rediriger des requêtes clientes après modification (DNS menteur aussi appelée Reponse Policy Zone ou RPZ) afin d’interdire l'accès à certains domaines. J'utilise cette fonctionnalité à deux fins :

Il est à noter que tous les sous-domaines de chaque entrée sont automatiquement pris en compte.

ASTUCE

Si vous voulez autoriser un ensemble de sous-domaines inclus dans un sous-domaine bloqué, vous pouvez utiliser une ligne comportant la syntaxe suivante (exemple pour Gmail) : local-zone: "l.google.com" always_transparent.

<syntaxhighlight lang="nestedtext"> cat << _EOF_ > /etc/unbound/unbound.conf.d/rpz.conf server:

  1. Miroirs de dépôts APT Debian

local-zone: "ftp.fr.debian.org" redirect local-data: "ftp.fr.debian.org A 192.168.1.77" local-zone: "http.debian.net" redirect local-data: "http.debian.net A 192.168.1.77" local-zone: "deb.debian.org" redirect local-data: "deb.debian.org A 192.168.1.77" local-zone: "security.debian.org" redirect local-data: "security.debian.org A 192.168.1.77" local-zone: "httpredir.debian.org" redirect local-data: "httpredir.debian.org A 192.168.1.77" local-zone: "debian.map.fastlydns.net" redirect local-data: "debian.map.fastlydns.net A 192.168.1.77"

  1. APT utilise aussi des champs SRV pour résoudre l'adresse des miroirs

local-zone: "prod.debian.map.fastly.net" redirect local-data: "prod.debian.map.fastly.net A 192.168.1.77" local-zone: "dpvctowv9b08b.cloudfront.net" redirect local-data: "dpvctowv9b08b.cloudfront.net A 192.168.1.77" local-zone: "_http._tcp.deb.debian.org." redirect local-data: "_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 prod.debian.map.fastly.net." local-data: "_http._tcp.deb.debian.org. 3600 IN SRV 10 1 80 dpvctowv9b08b.cloudfront.net."

  1. Saloperies à supprimer

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" local-zone: "ask.com" redirect local-data: "ask.com A 127.0.0.1" local-zone: "facebook.com" redirect local-data: "facebook.com A 127.0.0.1" local-zone: "truste-svc.net" redirect local-data: "truste-svc.net A 127.0.0.1" local-zone: "trustarc.com" redirect local-data: "trustarc.com A 127.0.0.1" local-zone: "gstatic.com" redirect local-data: "gstatic.com A 127.0.0.1" local-zone: "consent.google.com" redirect local-data: "consent.google.com A 127.0.0.1" local-zone: "consent.youtube.com" redirect local-data: "consent.youtube.com A 127.0.0.1" local-zone: "cdn.privacy-mgmt.com" redirect local-data: "cdn.privacy-mgmt.com A 127.0.0.1" local-zone: "privacy-mgmt.com" redirect local-data: "privacy-mgmt.com A 127.0.0.1" local-zone: "cdn.cookielaw.org" redirect local-data: "cdn.cookielaw.org A 127.0.0.1" local-zone: "digitalfeedback.us.confirmit.com" redirect local-data: "digitalfeedback.us.confirmit.com A 127.0.0.1"

  1. Télémétrie Mozilla

local-zone: "incoming.telemetry.mozilla.org" redirect local-data: "incoming.telemetry.mozilla.org A 127.0.0.1" _EOF_ </syntaxhighlight>

Vérification de la configuration du service

unbound-checkconf

Redémarrage du service

systemctl restart unbound

Il est également possible de recharger la configuration sans relancer le logiciel. Cela a pour effet de ne pas le faire planter si jamais un fichier de configuration contient une erreur

unbound-control reload

Enfin, il est possible de configurer le système du serveur pour utiliser notre résolveur local et ne pas dépendre d'un résolveur de plus haut niveau (celui de notre FAI par exemple)

echo "nameserver 127.0.0.1" > /etc/resolv.conf

Sources de la section

Convertir une liste de domaines en RPZ

Il est possible de trouver des listes de domaines générées par des tiers sur Internet (exemple d'une liste de domaine utilisés par Windows 10 - source).

Pour les convertir en fichier de configuration RPZ avec syntaxe Unbound, vous pouvez utiliser mon script :

<syntaxhighlight lang="bash">

  1. !/bin/bash
  1. Via un fichier distant

unbound_rbl_src=$(wget -qO - https://raw.githubusercontent.com/schrebra/Windows.10.DNS.Block.List/main/hosts.txt)

  1. ou via un fichier local
  2. unbound_rbl_src=$(cat /tmp/windows10-rbl.txt)

unbound_rbl_dst="/tmp/windows10-rbl-unbound.conf"

echo "server:" > "${unbound_rbl_dst}" for i in $unbound_rbl_src; do

   echo -e "\tlocal-zone: \"${i}\" redirect\n\tlocal-data: \"${i} A 127.0.0.1\"" >> "${unbound_rbl_dst}"

done </syntaxhighlight>

Ce fichier sera à placer dans le répertoire des configurations du résolveur DNS /etc/unbound/unbound.conf.d/ avant rechargement unbound-control reload.

Liste RPZ automatique

Le site pgl.yoyo.org met à jour et publie une liste de domaines à interdire au format Unbound. Ceci peut être utile afin de filtrer les sites irrespectueux de la vie privée des utilisateurs

INFORMATION

De façon générale, il est préférable de laisser ce filtrage être opéré par les utilisateurs eux-même afin de maintenir un réseau aussi neutre que possible. Il est important également de considérer l'aspect sécuritaire au fait de récupérer une liste de résolution canonique sur un site tiers. Rien ne garanti que son administrateur (ou un pirate) n'utilisera cette liste pour faire rediriger un site légitime vers une adresse externe et compromettre l'authenticité de vos communications avec celui-ci. Cette solution est à adapter à la situation locale.

Le script suivant (écrit par sgble et adapté par mes soins) permet de récupérer la dernière version de la liste tout en sauvegardant sa copie actuelle, d'en vérifier la syntaxe et ainsi de soit recharger le service, soit restaurer sa version fonctionnelle :

<syntaxhighlight lang="php"> cat << _EOF_ > /usr/local/sbin/maj-rbl-unbound

  1. !/bin/bash
  1. Lien de la liste

yoyo_url="https://pgl.yoyo.org/adservers/serverlist.php?hostformat=unbound&showintro=0&mimetype=plaintext"

  1. Localisation de la configuration Unbound

unbound_confs="/etc/unbound/unbound.conf.d/"

  1. Si le fichier précédent existe déjà, le garder en réserver au cas où

if [ -f "${unbound_confs}"/yoyo_blocus.conf ]; then cp "${unbound_confs}"/yoyo_blocus.conf /tmp/yoyo_blocus.conf.sauv fi

  1. Télécharger et placer la liste au bon endroit

wget "${yoyo_url}" -O "${unbound_confs}"/yoyo_blocus.conf && sed -i '1 s/^/server:\n/' "${unbound_confs}"/yoyo_blocus.conf

  1. Vérifier que Unbound ne rencontre aucun problème avec la liste et recharger si vrai

if unbound-checkconf; then echo "La nouvelle liste est bonne" unbound-control reload echo "Unbound a été rechargé"

  1. Sinon, rétablir l'ancien fichier qu'on a gardé en réserve

else echo "La nouvelle liste semble mal formaté" mv /tmp/yoyo_blocus.conf.sauv "${unbound_confs}"/yoyo_blocus.conf echo "Une restauration de l'ancienne liste a été effectuée" fi _EOF_ </syntaxhighlight>

chmod +x /usr/local/sbin/maj-rbl-unbound

Création d'un minuteur Systemd afin d'automatiser l'actualisation de la liste (tous les jours)

 mkdir -p /usr/local/etc/systemd/system

<syntaxhighlight lang="ini"> cat << _EOF_ > /usr/local/etc/systemd/system/maj-rbl-unbound.service [Unit] Description=Actualisation de la liste RPZ d'Unbound After=network.target

[Service] Type=oneshot ExecStart=maj-rbl-unbound RemainAfterExit=yes

[Install] WantedBy=multi-user.target _EOF_ </syntaxhighlight>

<syntaxhighlight lang="ini"> cat << _EOF_ > /usr/local/etc/systemd/system/maj-rbl-unbound.timer [Unit] Description=Exécution journalière de l'actualisation de la liste RPZ d'Unbound

[Timer] OnCalendar=daily Persistent=true

[Install] WantedBy=timers.target _EOF_ </syntaxhighlight>

ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.service /etc/systemd/system/
ln -s /usr/local/etc/systemd/system/maj-rbl-unbound.timer /etc/systemd/system/
systemctl daemon-reload
systemctl enable maj-rbl-unbound.timer
systemctl start maj-rbl-unbound.timer

Sources de la section