RootGuard

RootGuard Handbuch

Installation, Betrieb
und Kontrolle.

Von Docker Compose bis zum sicheren Update: Diese Dokumentation beschreibt den aktuellen Pre-Release-Alpha-Stand von RootGuard und wird zusammen mit dem Projekt weiterentwickelt.

01 · Überblick

Was RootGuard bereitstellt

RootGuard kombiniert AdGuard Home als Netzwerkfilter mit Unbound als eigenem rekursiven und DNSSEC-validierenden Resolver. WebApp und Core verwalten den Stack; ein separater Updater tauscht Core und WebApp sicher als Paar aus.

WebAppLogin, Dashboard und geführte Bedienung
CoreOrchestrierung und geprüfte Konfigurationsänderungen
UpdaterAtomare Core-/WebApp-Updates mit Rollback
AdGuard + UnboundFilterung, Rekursion und DNSSEC

02 · Voraussetzungen

Bevor du beginnst

  • Docker Engine oder Docker Desktop mit Docker Compose v2
  • Eine feste LAN-IP oder DHCP-Reservierung für den RootGuard-Host
  • Freier TCP- und UDP-Port 53 auf der gewählten Host-Adresse
  • Git für Repository und Submodule
  • Ein starkes Admin-Passwort und ein zufälliges internes API-Token
Alpha-HinweisRootGuard ist noch nicht für den Einsatz in Produktivumgebungen freigegeben. Verwende Backups und halte einen alternativen DNS-Weg bereit.

03 · Installation

Control Plane starten

shell
mkdir rootguard-alpha && cd rootguard-alpha
curl -LO https://raw.githubusercontent.com/foxly-it/rootguard/v0.1.0-alpha.2/compose.alpha.yaml
curl -Lo .env https://raw.githubusercontent.com/foxly-it/rootguard/v0.1.0-alpha.2/.env.alpha.example
openssl rand -hex 32
openssl rand -hex 32
docker compose -f compose.alpha.yaml up -d

Trage zwei getrennt erzeugte Zufallswerte als ROOTGUARD_API_TOKEN und ROOTGUARD_RECOVERY_TOKEN sowie ein eigenes starkes ROOTGUARD_ADMIN_PASSWORD in .env ein. Die Alpha lädt versionierte amd64-/arm64-Images aus GHCR; ein Checkout oder lokaler Build der Komponenten ist nicht erforderlich. Die Control Plane startet zuerst, die DNS-Dienste werden anschließend im Setup erzeugt.

browser
http://localhost:8080/login

04 · Erste Einrichtung

DNS-Stack geführt bereitstellen

  1. 1
    Anmelden

    Verwende ROOTGUARD_ADMIN_USER und ROOTGUARD_ADMIN_PASSWORD. Die Sitzung bleibt serverseitig geschützt und läuft nach zwölf Stunden ab. Ab 0.1.0-alpha.2 bietet „Passwort vergessen?“ zusätzlich eine lokale Wiederherstellung mit einem separaten Recovery-Schlüssel.

  2. 2
    Host-Adresse wählen

    Wähle eine bereits vorhandene LAN-IP. 0.0.0.0 bindet alle Host-Adressen, eine konkrete LAN-IP begrenzt die Erreichbarkeit enger.

  3. 3
    Vorprüfung ausführen

    RootGuard prüft Adresse, Port, Docker Engine und Compose, bevor Container verändert werden.

  4. 4
    Bereitstellen

    Unbound wird gestartet und geprüft, danach AdGuard Home intern eingerichtet und ausschließlich mit Unbound als Upstream verbunden.

05 · Router & Clients

RootGuard im Netzwerk verwenden

Trage die im Setup angezeigte feste Host-IP als DNS-Server im Router ein. Verwende niemals 127.0.0.1 oder die interne Docker-Adresse 172.29.53.2 auf anderen Geräten. Port 53 muss für TCP und UDP erreichbar sein.

Prüfung von einem Client
dig @192.168.178.10 example.com A
dig +dnssec @192.168.178.10 dnssec-failed.org A

Die erste Abfrage muss eine Adresse liefern. Die zweite muss mit SERVFAIL enden; dadurch wird eine ungültige DNSSEC-Kette korrekt verworfen.

06 · WebGUI

Die Bereiche der Oberfläche

DashboardInstallation, DNS-Endpunkt, Dienste, DNSSEC und Verbindungskette auf einen Blick.
EinrichtungNetzwerk-Preflight und persistenter AIO-Bereitstellungsfortschritt.
Stack & UpdatesContainerstatus, erlaubte Dienstaktionen, Data-Plane-Updates und Control-Plane-Updater.
UnboundProfile, geführte Einstellungen, Zonen, Live-Konfiguration, Experteneditor und Rollback.
AdGuard HomeRootGuard-Status und geschützter Zugriff auf die native AdGuard-Oberfläche.

07 · Unbound

Resolver sicher konfigurieren

Profile und Einstellungen

Balanced, Privacy, Resilience und Performance laden ausschließlich einen Entwurf. QNAME-Minimierung, Prefetch, Serve Expired, Cache-TTLs und Threads werden erklärt und vor der Aktivierung als Änderungsvorschau dargestellt.

Lokale Zonen

Der geführte Assistent erzeugt A-, AAAA- und CNAME-Einträge ohne manuelle Unbound-Syntax. Er erkennt parallele Änderungen und verwendet dieselbe Checkconf-, Versions- und Rollback-Kette.

Conditional Forwarding

Mehrere interne Zonen lassen sich an geordnete IPv4- und IPv6-DNS-Server weiterleiten. RootGuard normalisiert Zonennamen und Adressen, blockiert Schleifen und gibt die Aktivierung erst frei, wenn jedes Ziel die konfigurierte Zone mit NOERROR und einem SOA-Eintrag bestätigt. Rekursiver Fallback, unsignierte private Zonen und private RFC1918-Antworten besitzen getrennte, klar erklärte Opt-ins; DNSSEC und Rebinding-Schutz bleiben sonst aktiv.

Expertenmodus und Live-Konfiguration

Der Editor besitzt nur 90-rootguard-custom.conf und blockiert gefährliche Includes, Listener, Remote Control sowie DNSSEC-Umgehungen. Die Live-Ansicht liest die tatsächlich aktiven Dateien read-only aus dem Container.

08 · AdGuard Home

Geschützte native Verwaltung

AdGuard Home erhält keinen öffentlichen Admin-Port. RootGuard führt den offiziellen Einrichtungsablauf intern durch, erzeugt Zugangsdaten im geschützten Core-Volume und stellt die Oberfläche ausschließlich unter /adguard-ui/ über die angemeldete WebApp bereit.

Upstream-SchutzRootGuard erwartet Unbound fest unter 172.29.53.2:5335 und prüft diese Kette nach Start und Update.

09 · Updates & Rollback

Zwei getrennte Sicherheitswege

AdGuard Home und Unbound

Core zieht nur konfigurierte Ziel-Images, vergleicht echte Image-IDs, sichert persistente Dienstpfade und ersetzt genau einen Dienst. DNS, DNSSEC und Upstream werden danach geprüft. Bei Fehlern folgen Daten- und Image-Rollback.

Core und WebApp

Der separate Updater bleibt während des Austauschs aktiv. Er aktualisiert Core und WebApp nur gemeinsam, prüft beide Image-IDs und Health-Endpunkte und pinnt bei einem Fehler beide vorherigen Images. Browser-Anfragen können weder Image-Namen noch Compose-Argumente festlegen.

.env
ROOTGUARD_CORE_UPDATE_IMAGE=ghcr.io/foxly-it/rootguard-core:latest
ROOTGUARD_WEBAPP_UPDATE_IMAGE=ghcr.io/foxly-it/rootguard-webapp:latest

10 · Sicherheit

Vertrauensgrenzen

  • WebApp ohne Docker-Socket und ohne frei ausführbare Host-Befehle
  • HttpOnly-, SameSite-Strict-Sitzung und Same-Origin-Prüfung für Schreibzugriffe
  • Core und Updater nur in internen Docker-Netzen und mit Bearer-Token
  • Unbound read-only, non-root, ohne zusätzliche Capabilities
  • AdGuard-Administration ohne öffentlichen Port
HTTPSDie Appliance-WebGUI besitzt derzeit noch keine integrierte TLS-Terminierung. Veröffentliche sie nicht direkt im Internet. Nutze bis zur HTTPS-Unterstützung für Produktivumgebungen ausschließlich ein vertrauenswürdiges lokales Netz oder einen korrekt konfigurierten Reverse Proxy.

11 · Betrieb

Nützliche Befehle

shell
# Status der Control Plane
docker compose -f compose.alpha.yaml ps

# Logs
docker compose -f compose.alpha.yaml logs --tail=200 core webapp updater

# Control Plane neu starten
docker compose -f compose.alpha.yaml restart core webapp updater

# Gestoppte Alpha wieder starten
docker compose -f compose.alpha.yaml start

# DNS testen
dig @ROOTGUARD_LAN_IP example.com A

Konfigurations- und Installationszustand liegt in benannten Docker-Volumes. Entferne Volumes nicht mit docker compose down --volumes, solange du keine bewusste Neuinstallation durchführen willst.

Saubere NeuinstallationDer Setup-Controller erzeugt zusätzliche benannte DNS-Volumes außerhalb der Control-Plane-Compose. Ein normales Stoppen löscht keine Daten. Entferne Container und Volumes nur bewusst nach einem Backup und anhand der versionsgleichen Release-Hinweise.

12 · Fehlerbehebung

Häufige Probleme

Port 53 ist bereits belegt

Prüfe lokale Resolver wie systemd-resolved, dnsmasq oder andere DNS-Container. Alternativ kannst du für Tests einen anderen ROOTGUARD_DNS_PORT verwenden; Routerbetrieb benötigt üblicherweise Port 53.

Die WebGUI ist erreichbar, aber APIs schlagen fehl

Prüfe docker compose ps und die Logs von Core und Updater. Nach Ablauf einer Sitzung meldest du dich erneut an. Ein 401 bedeutet eine fehlende Sitzung; ein 502 weist typischerweise auf einen internen Dienst hin.

Ich habe das Admin-Passwort vergessen

Wähle ab 0.1.0-alpha.2 „Passwort vergessen?“ und verwende den unabhängigen ROOTGUARD_RECOVERY_TOKEN aus deiner lokalen .env-Datei. Das neue Passwort muss mindestens zwölf Zeichen haben; danach werden alle bestehenden Sitzungen beendet. Ist kein Recovery-Schlüssel eingerichtet, setze ROOTGUARD_ADMIN_PASSWORD lokal neu und erstelle ausschließlich den WebApp-Container kontrolliert neu.

DNS funktioniert nur auf dem Host

Verwende auf Clients die LAN-IP des Hosts, nicht localhost. Prüfe Firewall, TCP/UDP 53 und ob der Router eigene DNS-Vorgaben oder DoH erzwingt.

Ein Update wurde zurückgerollt

Lies die Meldung unter Stack & Updates und prüfe die Helper-/Core-Logs. Ein Rollback ist ein Schutzmechanismus: Die vorherigen Images bleiben aktiv, bis das Ziel-Image oder die Konfiguration korrigiert wurde.

13 · Konfiguration

Wichtige Umgebungsvariablen

ROOTGUARD_API_TOKENInternes Geheimnis zwischen WebApp, Core und Updater.
ROOTGUARD_ADMIN_USERBenutzername für die WebGUI; Standard admin.
ROOTGUARD_ADMIN_PASSWORDErforderliches starkes Passwort für die WebGUI.
ROOTGUARD_RECOVERY_TOKENAb 0.1.0-alpha.2 erforderlicher separater Zufallsschlüssel für lokale Passwort-Recovery; niemals mit Passwort oder API-Token identisch setzen.
ROOTGUARD_WEB_PORTHost-Bindung der WebGUI, beispielsweise 127.0.0.1:8080.
ROOTGUARD_UNBOUND_IMAGEFreigegebenes Unbound-Image für die Ersteinrichtung.
ROOTGUARD_ADGUARD_IMAGEFreigegebenes AdGuard-Image für die Ersteinrichtung.
ROOTGUARD_CORE_UPDATE_IMAGEServerseitiges Ziel für Core-Updates.
ROOTGUARD_WEBAPP_UPDATE_IMAGEServerseitiges Ziel für WebApp-Updates.

14 · Lizenz

GNU AGPL-3.0-or-later

RootGuard ist freie Open-Source-Software unter einer starken Copyleft-Lizenz. Nutzung, Prüfung, Veränderung und Weitergabe sind erlaubt. Wer eine veränderte Version verteilt oder Nutzern über ein Netzwerk bereitstellt, muss den entsprechenden Quellcode und die Lizenzhinweise zugänglich machen.

Marke und LogoDie Softwarelizenz erteilt keine Rechte an den Namen RootGuard und Foxly IT oder an den zugehörigen Logos. Forks dürfen ihre Herkunft beschreiben, aber keine offizielle Unterstützung oder Zugehörigkeit vortäuschen.