Le jour où j'ai quitté Pi-Hole pour Technitium
eskimo
- 6 minutes read - 1092 wordsMigration Pi-Hole vers Technitium
Objectifs :
- Migrer une instance Pi-Hole v6 vers Technitium
- Maintenir la liste des blacklist et whitelist sur un repo github privé synchronisé pour une gestion décentralisée, ou intervention à distance sans accès VPN
- Renforcer la sécurité en activant le DoT par exemple
Préambule :
Pour ajouter une whitelist au DNS, ajouter une ligne et un commentaire dans le fichier du repository github. Le cron s'execute à toutes les heures sur la machine qui host le service technitium. Une fois le fichier mis à jour attendre le refresh auto, ou le forcer par Update Now
La création de zones dans Technitium est autoritative, cela veut dire qu'il est le "seul" autorisé à répondre aux requeêtes DNS. Si vous avez un site hébergé à l'extérieur, cela veut dire qu'il faudra soit passer la zone en forwarding, soit créer les sous-domaines publiques en local pointant vers l'extérieur.
Etape 0 : Sauvegarder la configuration Pi-Hole
Faire un extract de la configuration PiHole dans System → Settings → Teleporter → export
Faire un backup ou un snapshot si c’est une VM
Etape 1: Extraire les listes de Pi-Hole et les importer dans Technitium
Réaliser l’inventaire, l’extraction et l’import des listes actuellement en production, blacklist, whitelist, et zones locales
Etape 1.1 :
Récupérer les blacklists
Se connecter en SSH sur la machine ou tourne PiHole
sqlite3 /etc/pihole/gravity.db "SELECT address FROM adlist WHERE enabled = 1;"
Doit retourner quelque chose comme cela
root@pihole-router:~# sqlite3 /etc/pihole/gravity.db "SELECT address FROM adlist WHERE enabled = 1;"
https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
http://sysctl.org/cameleon/hosts
https://s3.amazonaws.com/lists.disconnect.me/simple_tracking.txt
https://s3.amazonaws.com/lists.disconnect.me/simple_ad.txt
https://www.github.developerdan.com/hosts/lists/ads-and-tracking-extended.txt
Etape 1.2 :
Récupérer les whitelists (avec les commentaires)
Se connecter en SSH sur la machine ou tourne PiHole
sqlite3 /etc/pihole/gravity.db "SELECT domain, comment FROM domainlist WHERE type = 0 AND enabled = 1;"
Doit retourner quelque chose comme cela
root@pihole-router:~# sqlite3 /etc/pihole/gravity.db "SELECT domain, comment FROM domainlist WHERE type = 0 AND enabled = 1;"
ipinfo.io|Migrated from /etc/pihole/whitelist.txt
click.engage.xbox.com|NL Xbox
em.chooseyourboss.com|NL Chooseyourboss
r20.rs6.net|
Pour remplacer le | par un retour chartiot suivi de # pour commenter la ligne, dans VS Code par exemple
Find : \|(.+)
Replace : \n# $1
Etape 1.3 :
Récupérer les zones locales (que des enregistrements A dans mon cas, pas de CNAME)
Lister les zones dans Pi-Hole dans Settings → Local DNS Records
Il n’y a pas de création à proprement parler dans Pi-Hole, donc il faut regarder la liste des sous-domaines présente pour connaitre la ou les zones présentes.
Sinon, tenter l’import des zones dans Technitium et celles qui sont en erreur c’est qu’il faut les créer.
Pour cette étape il faut l’IP du serveur Technitium, et aussi générer un token API dans Technitium : Administration → Sessions → Create Token
Créer la ou les zones
# Créer la zone toto.org
curl -s -X POST "http://IP_TECHNITIUM:5380/api/zones/create" \
-d "token=TOKEN" \
-d "zone=toto.org" \
-d "type=Primary" \
| python3 -m json.tool
Puis enregistrer ce script migrate_dns.sh en modifiant adresse IP de Technitium et le token API
#!/bin/bash
TECHNITIUM="http://IP_TECHNITIUM:5380"
TOKEN="TOKEN_API"
CUSTOM_LIST="/etc/pihole/hosts/custom.list"
grep -v "^#" "$CUSTOM_LIST" | grep -v "^$" | while read -r ip domain; do
echo "Ajout : $domain -> $ip"
curl -s -X POST "$TECHNITIUM/api/zones/records/add" \
-d "token=$TOKEN" \
-d "domain=$domain" \
-d "type=A" \
-d "ipAddress=$ip" \
-d "ttl=3600" \
| python3 -m json.tool | grep -E "status|errorMessage"
done
chmod +x migrate_dns.sh
./migrate_dns.sh
On peut vérifier que les zones et sous-zones ont bien été créées dans l’administration de Technitium
Etape 2 : Héberger les listes sur un repo github privé, et les syncroniser avec Technitium
Héberger les blacklist et whitelist sur un repo github privé, et les syncroniser avec Technitium
Dans mon exemple je n’ai pour l’instant géré que les whitelist à travers la synchro GH, car dans mon cas je ne touche quasiment jamais à cette liste (2M+ de domaines bloqués c’est déjà pas mal)
Il suffit donc de coller la liste des blacklist dans la zone prévue à cet effet dans les paramètres Technitium.
Settings → Blocking → Allow / Block List URLs
Etape 2.1 :
Configurer Git et la tâche cron de récupération automatique des whitelists
Etape 2.1.1 Générer une clé SSH dédiée sur le serveur Technitium
ssh-keygen -t ed25519 -f /root/.ssh/github_dns -C "technitium-sync"
Attention il ne faut pas configurer de passkey sur cette clef SSH car crontab ne peut pas la soumettre pour valider l'accès
Etape 2.1.2 Ajouter la clé publique dans GitHub
Dans le repo → Settings → Deploy keys → Add deploy key
Coller le contenu de /root/.ssh/github_dns.pub — accès lecture seule suffit.
Etape 2.1.3 Cloner le repo avec cette clé
GIT_SSH_COMMAND="ssh -i /root/.ssh/github_dns" git clone git@github.com:username/repository.git /opt/dns-config
Etape 2.1.4 Le cron
crontab -e
0 * * * * GIT_SSH_COMMAND="ssh -i /root/.ssh/github_dns" git -C /opt/dns-config pull --quiet
Etape 2.2 :
Dans l’administration de Technitium, à la suite des blacklist ajouter la whitelist suivante :
(bascule en whitelist à cause du ! en début de ligne)
!file:///opt/dns-config/pihole-technitium-config/whitelist
Etape 3 : Mettre à jour la whitelist pour débloquer un domaine
Si besoin de forcer une mise à jour des blocklist et whitelist, attendre que le cron ait tourné. Toutes les heures à pile dans cet exemple.
Ou exécuter le script manuellement.
GIT_SSH_COMMAND="ssh -i /root/.ssh/github_dns" git -C /opt/dns-config pull --quiet
Vérifier que le fichier à bien été mis à jour récemment / à l’instant
/opt/dns-config/pihole-technitium-config/whitelist
Et enfin, pour charger les changements dans Technitium, cliquer sur “Update Now” juste en dessous de Allow / Block Lists URLs
Dernier test pour s’assurer que le blocage n’est plus effectif, aller dans DNS Client saisir le nom de domaine fraichement débloqué, puis cliquer sur “Resolve”.
Il ne doit pas y avoir de mention “Blocked by xxx list”
Etape 4 : Sécuriser les requêtes sortantes et éviter les DNS menteurs
Sécuriser les requêtes sortantes du WAN et s’affranchir des DNS menteurs
Etape 4.1
Activer le DNS-over-TLS
Configurer les forwarder TLS (je recommande Cloudflare et Quad9) dans la zone juste au dessus
tls://1.1.1.1
tls://9.9.9.9
Etape 4.2 :
Tester le fonctionnement et la sécurité.
https://1.1.1.1/help (de Cloudflare) ou mieux :
Etape 5 : Valider la migration et admirer le résultat
Changer l’IP du DNS dans le routeur ou le serveur DHCP
Puis attendre la propagation.
S’il y a un nombre de machines, VM, conteneurs, etc, conséquent, je conseille de laisser tourner Pi-Hole afin d’identifier toutes les machines qui lui parlent encore, car peut être que le serveur DNS est en cache ou en dur dans la config réseau.
Sinon il y a l’option de remplacer l’IP de Technitium par celle de Pi-Hole, qui peut être éteint à ce stade en principe.
Au bout d’une semaine ça ressemble à cela chez moi :)







