Hochverfügbarkeit: AdGuard Home mit keepalived

Ich betreibe zuhause schon seit längerem AdGuard Home mit Unbound als AdBlocker und DNS-Server auf einem Raspberry Pi.

Mich hat immer schon gestört, dass der DNS-Server nicht erreichbar war sobald ich den Pi neu gestartet habe oder er aufgrund anderer Wartungsarbeiten nicht erreichbar war.

Über meinen Router (Fritz!Box 7490) kann ich nur einen DNS-Server für das lokale Netzwerk eintragen, somit fiel die Variante „zweiten DNS-Server eintragen“ raus.

Da für mein Ambilight eh ein zweiter Raspberry Pi immer läuft wollte ich eine Failover-Lösung, sodass immer ein DNS-Server verfügbar ist.

Bei Reddit bin ich auf eine Lösung für Pi-Hole gestoßen, die ich mir passend für AdGuard geändert habe. Besten Dank dafür an Panja0. Eine Synchronisation habe ich hinterher ebenfalls eingerichtet, dies war aber in meinem Fall zweitrangig, daher schreibe ich dazu später noch ein anderes Tutorial.

Der Einfachheit halber nenne ich meine Geräte hier Pi-1 und Pi-2.

Ziel:

DNS-Failover durch die Software Keepalived.

Keepalived erstellt eine virtuelle IP, die standardmäßig auf Pi-1 zeigt. Im Falle der Nichterreichbarkeit von Pi-1 merkt dies Pi-2 sofort und leitet die virtuelle IP auf sich selbst, also Pi-2. Sobald Pi-1 wieder erreichbar ist wird wieder dorthin umgeleitet.

Voraussetzungen:

  • 2 „Server“ – zum Beispiel Raspberry Pi oder ähnliche Geräte
  • AdGuard Home auf jedem der beiden Geräte installiert (egal ob direkt oder in einem Docker-Container)
  • DHCP in AdGuard deaktivert – dies sollte über den Router oder ein anderes Gerät im Netzwerk laufen

In meinem Fall hat Pi-1 die IP 192.168.178.5, Pi-2 die IP 192.168.178.8. Als virtuelle IP habe ich die 192.168.178.11.

Installation und Konfiguration keepalived und libipset13:

1. Installation

sudo apt update && sudo apt install keepalived libipset13 -y

(möglicherweise findet der Raspberry Pi die libipset13 nicht. In diesem Fall libipset3 stattdessen installieren)

2. keepalived aktivieren:

sudo systemctl enable keepalived.service

3. Als nächstes erstellen wir ein Script, welches den Status von AdGuard Home überprüft:

sudo mkdir /etc/scripts
sudo nano /etc/scripts/chk_adg

In die Datei chk_adg fügen wir folgenden Inhalt ein:

#!/bin/sh
STATUS=$(ps ax | grep -v grep | grep AdGuard)
if [ "$STATUS" != "" ]
then
exit 0
else
exit 1
fi

Mit STRG+X speichern und beenden.

4. Das Script muss nun noch ausführbar gemacht werden:

sudo chmod 755 /etc/scripts/chk_adg

5. keepalived konfigurieren Pi 1:

sudo nano /etc/keepalived/keepalived.conf

Und folgenden Inhalt einfügen:

global_defs {
router_id dns-01
script_user root
enable_script_security
}
vrrp_script chk_adg {
script "/etc/scripts/chk_adg"
interval 1
weight -10
}
vrrp_instance ADGUARD {
state MASTER
interface eth0
virtual_router_id 55
priority 150
advert_int 1
unicast_src_ip 192.168.178.5
unicast_peer {
192.168.178.8
}
virtual_ipaddress {
192.168.178.11/24
}
track_script {
chk_adg
}
vrrp_script chk_adg {
script "/etc/scripts/chk_adg"
interval 1
weight -10
}
}

Erklärung der Optionen:

  • router_id: Name kann frei gewählt werden – in meinem Fall auf Pi-1 dns-01 und auf Pi-2 dns-02
  • state: gibt an, ob es der „Master“-Server oder der „Backup/Failover“-Server ist
  • interface: gibt an, auf welchem Netzwerkinterface keepalived agiert
  • virtual_router_id: eine Nummer zwischen 0 und 255. Muss auf beiden Pi-1 und Pi-2 die gleiche Zahl sein
  • priority: Die Priorität muss auf dem Master-Server höher als auf dem Failover-Server sein
  • unicast_src_ip: IP des Master-Servers Pi-1 (in meinem Fall 192.168.178.5)
  • unicast_peer: IP des Failover-Server Pi-2 (in meinem Fall 192.168.178.8)
  • virtual_ipaddress: Die gewünschte virtuelle IP, die hinterher auf den jeweils aktiven Server zeit (in meinem Fall 192.168.178.11)

6. keepalived konfigurieren Pi-2:

sudo nano /etc/keepalived/keepalived.conf

Folgenden Inhalt einfügen:

global_defs {
router_id dns-02
script_user root
enable_script_security
}
vrrp_script chk_adg {
script "/etc/scripts/chk_adg"
interval 1
weight -10
}
vrrp_instance ADGUARD {
state BACKUP
interface eth0
virtual_router_id 55
priority 145
advert_int 1
unicast_src_ip 192.168.178.8
unicast_peer {
192.168.178.5
}
virtual_ipaddress {
192.168.178.11/24
}
track_script {
chk_adg
}
}

Mit STRG+X speichern und beenden.

7. Keepalived Service auf beiden Maschinen neu starten:

sudo systemctl restart keepalived.service

8. Funktionstest mit der neuen virtuellen IP 192.168.178.11:

dig google.de @192.168.178.11

Sollte der Test erfolgreich sein und eine IP von dig zurückgegeben werden kann nun die neue IP 192.168.178.11 als DNS-Server im Router eingetragen werden.

Als zweiten Test kann man einfach mal auf Pi-1 den AdGuard beenden:

AdGuardHome -s stop

Keepalived merkt dies sofort und stellt die virtuelle IP auf Pi-2 um. Ein erneuter dig bestätigt dies:

dig google.de @192.168.178.11

Nun den AdGuard auf Pi-1 wieder starten:

AdGuardHome -s start

Das war´s. Wir haben nun eine funktionierende DNS-Server Failover-Lösung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert