Unbound
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 :
- Servir mon miroir de dépôt local à toute mes machines sans avoir à changer leur configuration
- Éviter certains sites irrespectueux des données personnelles (utilisation d'une liste automatique plus bas)
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
Sources de la section
- https://memo-linux.com/debian-installer-le-serveur-dns-unbound/
- https://memo-linux.com/ubuntu-serveur-dns-unbound/
- https://lists.nlnetlabs.nl/pipermail/unbound-users/2014-October/003573.html
- https://unbound.docs.nlnetlabs.nl/en/latest/manpages/unbound.conf.html
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