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é

cat << _EOF_ > /etc/unbound/unbound.conf
# Fichier de configuration d'Unbound pour Debian.
#
# Référez-vous à la page de manuel unbound.conf(5).
#
# Voyez /usr/share/doc/unbound/examples/unbound.conf pour un
# fichier de configuration de référence commenté.
#
# La ligne suivante permet d'inclure les fichiers de configuration
# 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

# 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

# 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

# DNSSEC
# auto-trust-anchor-file: "/var/lib/unbound/root.key"
harden-dnssec-stripped: yes

# Adresses des serveurs racine
root-hints: "/var/lib/unbound/root.hints"

# 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

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

# Paramètres du cache
cache-min-ttl: 3600
cache-max-ttl: 86400
prefetch: yes
prefetch-key: yes
_EOF_

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

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_

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.

cat << _EOF_ > /etc/unbound/unbound.conf.d/rpz.conf
server:
# 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"

# 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."

# 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"

# Télémétrie Mozilla
local-zone: "incoming.telemetry.mozilla.org" redirect
local-data: "incoming.telemetry.mozilla.org A 127.0.0.1"
_EOF_

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

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 :

cat << _EOF_ > /usr/local/sbin/maj-rbl-unbound
#!/bin/bash

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

# Localisation de la configuration Unbound
unbound_confs="/etc/unbound/unbound.conf.d/"

# 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

# 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

# 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é"
# 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_
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
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_
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_
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