PiHole en cluster avec Keepalived et Nebula !
Un homelab ça bouge pas mal on pète des trucs on en ajoute ou enlève d'autres, bref: c'est pas un modèle de stabilité. Le problème c'est que pour faire du DNS c'est bien de pouvoir toujours joindre l'IP de son résolveur. Vous avez compris j'en avais marre de péter mon Pihole a chaque fois que je redémarre ou que je tombe un nœud. Donc je me suis posé la question de comment mettre un deuxième PiHole. En théorie un deuxième en standalone ça marche mais en pratique c'est chiant: deux interfaces, on ne sait pas qui résoud quand et surtout les réglages à faire deux fois ! C'est là qu'entre en jeu Nebula qui permet de faire de la synchro de conf entre deux PiHole, parfait ! Ensuite pour faire de la haute dispo, clustering, appelez ça comme vous voulez on va utiliser Keepalived pour avoir une IP virtuelle avec les deux Pihole derrière grâce à la magie du VRRP !
En gros le VRRP c'est dire: j'ai une IP virtuelle 192.168.1.X et c'est l'équipement A qui répond derrière sauf s'il tombe alors c'est l'équipement B qui répond. La on va partir du principe que 1.20 est mon VRRP, 1.21 mon PiHole 1 et 1.22 mon PiHole 2.
Sur les deux PiHole on install Keepalived:
apt install keepalivedet on modifie /etc/keepalived/keepalived.conf
Sur le PiHole 1:
global_defs {
script_security on
}
vrrp_script chk_pihole {
user root
script "/usr/bin/pidof pihole-FTL"
interval 2
weight -20
}
vrrp_instance PIHOLE {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
virtual_ipaddress {
192.168.1.20/24
}
track_script {
chk_pihole
}
}Sur PiHole 2:
global_defs {
script_security on
}
vrrp_script chk_pihole {
user root
script "/usr/bin/pidof pihole-FTL"
interval 2
weight -20
}
vrrp_instance PIHOLE {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
virtual_ipaddress {
192.168.1.20/24
}
track_script {
chk_pihole
}
}La priorité plus basse (90 au lieu de 100) garantit que Pi-hole 1 reprend la main dès qu'il revient en ligne. Le vrrp_script surveille pihole-FTL toutes les 2 secondes : si le process est mort, la priorité chute de 20 points, déclenchant la bascule même si le serveur est toujours en vie. Puis sur les deux on active le service:
systemctl enable --now keepalivedEnsuite on configure son routeur/Firewall/serveur DHCP (ici OPNSense) pour qu'il distribue l'IP virtuelle en tant que résolveur.
Il faut maintenant configurer Nebula-Sync pour synchroniser les deux PiHole. C'est un conteneur Docker que vous pouvez faire tourner n'importe ou tant qu'il peut joindre vos deux boîtiers.
Le Docker compose tout simple:
services:
nebula-sync:
image: ghcr.io/lovelaze/nebula-sync:latest
container_name: nebula-sync
restart: unless-stopped
environment:
- PRIMARY=http://192.168.1.21|votre_api_key_pihole1
- REPLICAS=http://192.168.1.22|votre_api_key_pihole2
- FULL_SYNC=true
- RUN_GRAVITY=true
- CRON=0 * * * *Une fois lancé ça réplique TOUTE la conf, ça peut valoir le coup de redémarre le secondaire pour une première synchro.
Voilà c'est tout ! Un cluster de PiHole qui bascule en quelques secondes en cas de panne et les utilisateurs de votre réseau arrêtent de vous engueuler quand vous redémarrez le mauvais nœud Proxmox !