Featured image of post Le jour où j'ai quitté Pi-Hole pour Technitium

Le jour où j'ai quitté Pi-Hole pour Technitium

Migration 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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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

image.png

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 :

https://browserleaks.com/dns

Etape 5 : Valider la migration et admirer le résultat

Changer l’IP du DNS dans le routeur ou le serveur DHCP

image.png

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.

image.png

Au bout d’une semaine ça ressemble à cela chez moi :)

Tous les commentaires

Aucun commentaire pour le moment.

Écrire un commentaire

?

Ce site utilise la validation Captcha invisible de Cloudflare.

La validation est en cours tant que 'Validation ...' est affiché.

Une fois le Captcha confirmé, le bouton devient actif et vous pouvez 'ENVOYER'.

Le processus de validation de Captcha peut prendre plusieurs secondes (jusqu'à 10 sur un pc ou une connexion lente).

Si passé ce délai le bouton n'est toujours pas actif, essayez d'un autre ordinateur ou IP publique.

Si ça perdure, ben il faut me prévenir !

⏳ Envoi en cours...
Généré avec Hugo
Thème Stack conçu par Jimmy