Afficher/cacher Sommaire
Résolveur DNS Unbound
Les serveurs DNS sont des machines discutant entre elles afin de se communiquer les correspondances entre nom de domaine et adresses IP.
Prérequis
À partir de la version 209, systemd contient un démon de configuration réseau nommé systemd-networkd qui peut être utilisé pour la configuration basique du réseau. De plus, depuis la version 213, la résolution de nom DNS peut être prise en charge par systemd-resolved au lieu d’un fichier /etc/resolv.conf statique. Ces deux services sont activés par défaut
Si vous utilisez un résolveur local (par exemple bind, dnsmasq, unbound, etc), ou tout autre logiciel générant un fichier /etc/resolv.conf (par exemple resolvconf), le service systemd-resolved ne doit pas être utilisé.
Pour désactiver systemd-resolved, exécutez la commande suivante : sudo systemctl disable systemd-resolved
Effacer puis recréer un fichier /etc/resolv.conf
avec une directive dns, par exemple : nameserver 1.1.1.1
Installation
Passage en mode super utilisateur
sudo -s
Désinstaller bind si installé
apt remove --purge bind* -y
rm -r /var/cache/bind/
Installation des outils dns et du paquet Unbound :
apt install dnsutils unbound -y
Serveurs de nom racine
unbound possède une liste de serveurs racine pour la résolution des adresses. Cette liste pouvant évoluer dans le temps, il est préférable d’installer la dernière version lors de l'installation
Télécharger le fichier named.cache sur le site internic.net et le placer dans le répertoire /var/lib/unbound/ sous le nom root.hints
# en mode su
curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
chown unbound:unbound /var/lib/unbound/root.hints
Indiquer l’adresse du fichier dans la configuration de unbound
créer le fichier root-hints.conf :
nano /etc/unbound/unbound.conf.d/root-hints.conf
# Fichier des serveurs root à télécharger env tous les mois :
# curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
#
server:
root-hints: "/var/lib/unbound/root.hints"
Vérifier le fichier
unbound-checkconf /etc/unbound/unbound.conf.d/root-hints.conf
unbound-checkconf: no errors in /etc/unbound/unbound.conf.d/root-hints.conf
Redémarrer unbound
systemctl restart unbound.service
La mise à jour du fichier "root.hints" peut-être effectuée automatiquement en utilisant systemd, selon la méthode décrite ci-dessous et reprise du wiki ArchLinux unboud : Roothints systemd timer, la mise à jour s’effectuera tous les premiers samedi de chaque mois à 02h00
Créer un fichier service
nano /etc/systemd/system/roothints.service
[Unit]
Description=Update root hints for unbound
After=network.target
[Service]
ExecStart=/usr/bin/curl -o /var/lib/unbound/root.hints https://www.internic.net/domain/named.cache
Créer un fichier timer
nano /etc/systemd/system/roothints.timer
[Unit]
Description=Run root.hints monthly
[Timer]
OnCalendar=OnCalendar=Sat *-*-01..07 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
Vérifier la syntaxe avec systemd-analyze
systemd-analyze calendar "Sat *-*-01..07 02:00:00"
Normalized form: Sat *-*-01..07 02:00:00
Next elapse: Sat 2024-10-05 02:00:00 GMT
From now: 2 weeks 4 days left
Tester le chargement du fichier
systemctl daemon-reload
rm /var/lib/unbound/root.hints
systemctl start roothints.service
ls -la /var/lib/unbound/root.hints
# -rw-r--r-- 1 root root 3312 16 sept. 06:47 /var/lib/unbound/root.hints
Activer et démarrer le timer roothints.timer
systemctl enable roothints.timer --now
Liste les “timers”
sudo systemctl list-timers
NEXT LEFT LAST PASSED UNIT ACTIVATES
[...]
Sat 2024-10-05 02:00:00 GMT 2 weeks 4 days left - - roothints.timer roothints.service
Liste les “timers” correspondant à un certain état :
sudo systemctl list-timers --state=STATE
STATE prend les valeurs suivantes : active, failed, load, sub. Voir man systemctl pour plus de détails.
Configurer unbound
Les fichiers de configuration sont situés sous /etc/unbound/unbound.conf.d/
NOTE: La configuration par défaut est suffisante lors de la mise en place sur un serveur
Créer un fichier de configuration unbound-iceyan.conf (/etc/unbound/unbound.conf.d/unbound-iceyan.conf
)
server:
# ne rien enregistrer dans les journaux hormis les erreurs
verbosity: 0
# n'écouter que sur l'interface locale en IPv4
# unbound nécessite d'être relancé si modifié
interface: 127.0.0.1
# Adresse privée wireguard
#interface: 10.55.22.1
port: 53
# refuser tout le monde sauf les connexions locales (pas forcément
# nécessaire vu que le serveur n'écoute que sur la boucle locale en IPv4)
access-control: 0.0.0.0/0 refuse
access-control: 127.0.0.1/32 allow
# Adresse privée wireguard
#access-control: 10.55.22.0/16 allow
# par défaut, unbound ne log pas les requêtes ni les réponses
# on peut le rappeler au cas où
log-queries: no
log-replies: no
# imposer la QNAME minimisation (RFC 7816)
# Pour mieux protéger la vie privée
qname-minimisation: yes
# même si le serveur faisant autorité ne le veut pas
# après discussion, il est possible que cette option ne soit
# pas recommandée dans le cadre d'un résolveur ouvert
qname-minimisation-strict: yes
Pour vérifier si le fichier de configuration est valide
unbound-checkconf /etc/unbound/unbound.conf.d/unbound-iceyan.conf
Démarrer et vérifier unbound
Si vous n’utilisez pas l’application resolvconf pour la résolution des noms, il faut modifier le fichier /etc/resolv.conf
nameserver 127.0.0.1
Redémarrer le service dnsunbound
systemctl restart unbound
Les commandes suivantes ne fonctionneront que si le paquet “dnsutils” est installé sur votre système Debian!
dig @127.0.0.1 afnic.fr +short +dnssec
51.178.83.21
A 13 2 600 20241016083021 20240916030820 14683 afnic.fr. gApIxPsbAiDexraJ1FfS2gE+BMKTNox+2UnlRxPa/T6WDbb6ZdnU6KQi 0yRES7xp+iCS83zTFGnympNdxwUs8A==
La commande dig a fonctionné, vous pouvez maintenant définir Unbound comme premier résolveur DNS
Options
Bloquer la publicité
Prérequis, jq et curl installés
Script /usr/local/bin/unbound-adblock
Etendre Réduire
Droits en exécution
chmod +x /usr/local/bin/unbound-adblock
Copier liste-adblock.json dans un fichier /var/lib/unbound/liste-adblock.json
Etendre Réduire
Copier adblock dans /etc/logrotate.d/ (Attention : ne pas supprimer l’option delaycompress au risque de casser la détection de retrait de liste du JSON).
wget -O /etc/logrotate.d/adblock https://framagit.org/Shaft/unbound-adblock/-/blob/main/adblock
Lancer le script au démarrage de la machine avec un service systemd, ainsi une relance d’Unbound est moins pénalisante étant donné que redémarrer ce résolveur vide son cache.
Créer adblock.service ` /etc/systemd/system/adblock.service`
[Unit]
Description=Unbound AdBlock List Making
After=unbound.service network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/unbound-adblock /var/lib/unbound/liste-adblock.json
RemainAfterExit=yes
User=root
PrivateTmp=true
ProtectHome=true
[Install]
WantedBy=multi-user.target
Activer et démarrer le service
systemctl enable --now adblock.service
vérifier que tout c’est bien passé via le fichier de log /var/log/adblock.log
sept. 16 08:00:19 +0000 INFO: Téléchargement des 4 listes de domaines
sept. 16 08:00:21 +0000 INFO: Téléchargement de la liste MVPS réussi. Hash nul, la liste est nouvelle.
sept. 16 08:00:21 +0000 INFO: Sauvegarde dans /var/lib/unbound/MVPS.list
sept. 16 08:00:21 +0000 INFO: Téléchargement de la liste AdAway réussi. Hash nul, la liste est nouvelle.
sept. 16 08:00:21 +0000 INFO: Sauvegarde dans /var/lib/unbound/AdAway.list
sept. 16 08:00:22 +0000 INFO: Téléchargement de la liste StevenBlack Unifié réussi. Hash nul, la liste est nouvelle.
sept. 16 08:00:22 +0000 INFO: Sauvegarde dans /var/lib/unbound/StevenBlack-Unifié.list
sept. 16 08:00:23 +0000 INFO: Téléchargement de la liste yoyo.org réussi. Hash nul, la liste est nouvelle.
sept. 16 08:00:23 +0000 INFO: Sauvegarde dans /var/lib/unbound/yoyo.org.list
sept. 16 08:00:23 +0000 INFO: Pas de liste trouvée. Construction de celle-ci et du fichier de configuration.
sept. 16 08:00:26 +0000 INFO: Copie de la nouvelle configuration dans /etc/unbound/unbound.conf.d/adblock.conf
sept. 16 08:00:26 +0000 INFO: Redémarrage d'Unbound.
sept. 16 08:00:27 +0000 INFO: Blocage de 166353 domaines.
Test avec un site qui est dans la liste
dig ad2.adfarm1.adition.com
; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> ad2.adfarm1.adition.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 16929
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;ad2.adfarm1.adition.com. IN A
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Mon Sep 16 08:00:47 GMT 2024
;; MSG SIZE rcvd: 52
La requête DNS n'est pas servie et se voit répondre NXDOMAIN
Blocage des DMP
Blocage des DMP (Data Management Platforms) avec Unbound
Configuration nécessaire pour Unbound afin de bloquer certaines “Data Management Platforms” (DMP) utilisées par de plus en plus de sites (liberation.fr, oui.scnf, lemonde.fr, fnac.com…) et qui échappent – pour l’instant aux bloqueurs de traqueurs traditionnels (uBlock Origin ou uMatrix par exemple)
Le cœur du problème
Dernièrement, une conjoncture d’éléments est venue semer le trouble chez nos aspirateurs :
- L’entrée en vigueur du RGPD en Europe
- La part de plus en plus grande d’internautes utilisant des bloqueurs de publicités
- La volonté des éditeurs de navigateurs web (Chrome et Firefox – et donc leurs dérivés) de bloquer par défaut les traqueurs ou les cookies tiers.
Un mouchard est dit tiers – ou 3rd-party quand on est disruptif – quand il n’est pas chargé depuis le domaine (ou un de ses sous domaines) que vous visitez. Par exemple quand on visite https://liberation.fr/, le script chargé depuis www.google-analytics.com est tiers. Si le même mouchard est chargé depuis un sous-domaine de liberation.fr, il est dit 1st-party (primaire a priori en bon français). Le hic, pour nos amis start-uppers est que les mouchards/cookies tiers sont triviaux à bloquer. Ne pas charger les cookies tiers est d’ailleurs une option répandue dans les navigateurs depuis des années.
La fourberie
La technique développée par les marketeux pour ne pas voir les juteuses données personnelles leur échapper est à la fois techniquement très simple et redoutable. Il suffit de transformer les crasses 3rd-party en 1st-party afin de les cacher sous le cyber-tapis pour reprendre l’expression de Reflets. Et pour se faire passer par le DNS et ses possiblités.
Bloquer les indésirables avec Unbound
On entre dans la partie technique, pour faire court, on va décréter à Unbound que nous contrôlons les domaines indésirables (eulerian.net par exemple) afin de faire échouer la résolution DNS. La technique est développée plus en détail sur un blog.
Pour mémoire :
- On crée un fichier de zone (eulerian.net.zone) où l’on met un enregistrement SOA.
- On l’associe à chaque domaine à bloquer dans la configuration d’Unbound (adblock-war.conf)
Cette technique sera valable, pour les versions d’Unbound supérieures à 1.7.0.
Créer un fichier /var/lib/unbound/eulerian.net.zone
$TTL 10800
eulerian.net. IN SOA localhost. nobody.invalid. (
1
3600
1200
604800
10800
)
Dans le détail, on indique la durée de vie par défaut des enregistrements ($TTL 10800) puis le début de l’autorité pour la zone (avec le nom du serveur faisant autorité (localhost.), le mail de l’admin (nobody@invalid. – le @ est un caractère particulier dans le DNS, on le remplace donc par un point) et c’est tout, le reste du domaine sera vide.
créer 2 copies de ce fichier nommées eulerian.com.zone
et eulerian.fr.zone
et changer le domaine.
fichier /var/lib/unbound/eulerian.com.zone
$TTL 10800
eulerian.com. IN SOA localhost. nobody.invalid. (
1
3600
1200
604800
10800
)
fichier /var/lib/unbound/eulerian.fr.zone
$TTL 10800
eulerian.fr. IN SOA localhost. nobody.invalid. (
1
3600
1200
604800
10800
)
Configuration d’Unbound
Dans un fichier .conf spécifique, typiquement /etc/unbound/unbound.conf.d/block-eurelian.conf
sous Debian et dérivés, ajouter :
auth-zone:
name: "eulerian.net."
zonefile: "/var/lib/unbound/eulerian.net.zone"
auth-zone:
name: "eulerian.fr."
zonefile: "/var/lib/unbound/eulerian.fr.zone"
auth-zone:
name: "eulerian.com."
zonefile: "/var/lib/unbound/eulerian.com.zone"
On définit donc 3 zones sur lesquelles nous décrétons avoir l’autorité et pour chacune d’entre elles, on dit à Unbound d’utiliser les fichiers correspondants. On sauvegarde et on relance Unbound et normalement, le blocage est effectif :
Redémarrer unbound
systemctl restart unbound
Vérifier
dig v.oui.sncf
; <<>> DiG 9.18.28-1~deb12u2-Debian <<>> v.oui.sncf
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 42150
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;v.oui.sncf. IN A
;; ANSWER SECTION:
v.oui.sncf. 3600 IN CNAME voyages-sncf.eulerian.net.
;; Query time: 536 msec
;; SERVER: 127.0.0.1#53(127.0.0.1) (UDP)
;; WHEN: Mon Sep 16 08:32:29 GMT 2024
;; MSG SIZE rcvd: 78
La requête n'est pas servie (NXDOMAIN)
Activer logs unbound
Modifier le fichier de configuration unbound
logfile: /var/log/unbound.log
verbosity: 1
log-queries: yes
Créer le fichier log avec les droits
touch /var/log/unbound.log
chown unbound:unbound /var/log/unbound.log
Relancer le service unbound
systemctl restart unbound
Visualiser les logs
tail -f /var/log/unbound.log
Annexe
DNS Debian (resolvconf)
- Article original Résolution des noms avec resolvconf sous Linux Debian du 27/08/2106
En fonction du type de connexion utilisé, il est parfois nécessaire de faire appel à différents serveurs de noms (DNS). Par exemple, lors d’une connexion à son lieu de travail, il faut utiliser le serveur DNS de son réseau, mais lors d’une connexion à internet, il faut utiliser les serveurs DNS de son fournisseur d’accès. Dans ce cas, le paquet “resolvconf” sous Debian permet de résoudre ces problèmes.
Rappel sur l’utilité du fichier « /etc/resolv.conf »
Ce fichier permet d’indiquer le ou les domaines de recherche et les différents serveurs DNS à utiliser.
Par exemple, dans un réseau local, nous pourrions avoir un serveur DNS à l’adresse 192.168.0.1 chargé de gérer le domaine « mon-domaine.local ». En cas de défaillance du DNS local, nous pourrions faire appel aux serveurs DNS de notre fournisseur d’accès. Dans ce cas, le contenu du fichier « /etc/resolv.conf », pourrait ressembler à cela :
nameserver 192.168.0.1
nameserver 212.27.53.252
nameserver 212.27.52.252
search mon-domaine.local
La première ligne indique l’adresse du serveur DNS du réseau local. En cas de défaillance de ce serveur, les serveurs suivants seront utilisés (Serveurs du fournisseur d’accès à Internet).
La dernière ligne permet d’indiquer le nom du domaine géré par le serveur DNS local. Par exemple, si nous cherchons à contacter le serveur « MonServeur », le système cherchera en fait à contacter l’adresse complète « MonServeur.mon-domaine.local », car le nom du serveur indiqué ne comportait pas le domaine de recherche.
Présentation et installation de resolvconf
Le programme resolvconf garde la trace des informations du système sur les serveurs de noms de domaine actuellement disponibles. Il ne faut pas le confondre avec le fichier de configuration resolv.conf qui porte malencontreusement presque le même nom. Le programme resolvconf est optionnel sur les systèmes Debian.
Le fichier de configuration resolv.conf contient des informations sur les serveurs de noms de domaine que le système doit utiliser. Néanmoins, quand plusieurs programmes doivent modifer dynamiquement le fichier de configuration resolv.conf, ils peuvent se chevaucher et le fichier peut ne plus être synchronisé. Le programme resolvconf s’occupe de ce problème. Il agit comme un intermédiaire entre les programmes qui fournissent des informations sur les serveurs de noms de domaine (par exemple les clients dhcp) et les programmes qui les utilisent (par exemple resolver).
Quand resolvconf est correctement installé, le fichier de configuration resolv.conf du répertoire /etc/resolv.conf est remplacé par un lien symbolique pointant vers le fichier /etc/resolvconf/run/resolv.conf et le résolveur utilise plutôt le fichier de configuration qui est généré dynamiquement par resolvconf à cet emplacement /etc/resolvconf/run/resolv.conf.
Le programme resolvconf est en général seulement nécessaire quand un système a plusieurs programmes qui ont besoin de modifier de façon dynamique les informations sur les serveurs de noms de domaine. Sur un système simple où les serveurs de noms de domaine ne changent pas souvent ou bien ne sont modifiés que par un programme, le fichier de configuration resolv.conf est suffisant.
Si le programme resolvconf est installé, vous n’aurez pas à modifier à la main le fichier de configuration resolv.conf car il sera changé de façon dynamique par les programmes. Si vous avez besoin de définir vous-même les serveurs de noms de domaine (comme avec une interface statique), ajoutez au fichier de configuration interfaces du répertoire /etc/network/interfaces une ligne comme celle-ci :
dns-nameservers 127.0.0.1 80.67.169.12 80.67.169.40
Mettez la ligne indéntée dans un paragraphe iface, par exemple juste après la ligne gateway. Entrez les adresses IP des serveurs de noms de domaine dont vous avez besoin après dns-nameservers, toutes sur la même ligne, séparées par des espaces. N’oubliez pas le “s” à la fin de dns-nameservers.
Le programme resolvconf est un ajout plutôt récent à Debian et plusieurs anciens programmes ont besoin d’être mis à jour ou reconfigurés pour fonctionner correctement avec lui . Si vous rencontrez des problèmes, regardez /usr/share/doc/resolvconf/README qui contient beaucoup d’informations sur la manière de faire fonctionner resolvconf avec d’autres programmes.
apt install resolvconf -y
echo "nameserver 127.0.0.1" >> /etc/resolvconf/resolv.conf.d/head
Une fois le paquet « resolvconf » installé, il ne faut plus modifier le fichier « /etc/resolv.conf », car le contenu de celui-ci sera automatiquement géré et remplacé par « resolvconf ».
Le résultat de la commande
nslookup afnic.fr | grep Server
devrait ressembler à ceci:
Server: 127.0.0.1
Vérifier la résolution de nom à partir du serveur :
dig @127.0.0.1 afnic.fr
; <<>> DiG 9.10.3-P4-Debian <<>> @127.0.0.1 afnic.fr
; (1 server found)
...
;; SERVER: 127.0.0.1#53(127.0.0.1)
...
La résolution fonctionne
Maintenant, vous disposez de votre propre résolveur DNS.