BREAKING CHANGE: Die alte Shell-Version muss vor der Installation der Go-Version deinstalliert werden.
18 KiB
Befehle & Nutzung
AdGuard Shield wird in der Go-Version über ein einzelnes Binary bedient:
/opt/adguard-shield/adguard-shield
Dieses Binary ist Daemon, CLI, Installer, Updater, Uninstaller und Report-Generator. Dadurch gibt es keine getrennten Shell-Skripte mehr.
Grundform
sudo /opt/adguard-shield/adguard-shield <befehl>
Wenn du eine andere Konfigurationsdatei verwenden möchtest, muss -config direkt vor dem Befehl stehen:
sudo /opt/adguard-shield/adguard-shield -config /pfad/zur/adguard-shield.conf status
Standardpfade:
Konfiguration: /opt/adguard-shield/adguard-shield.conf
SQLite-State: /var/lib/adguard-shield/adguard-shield.db
Logdatei: /var/log/adguard-shield.log
PID-Datei: /var/run/adguard-shield.pid
Schnellübersicht
# Version
/opt/adguard-shield/adguard-shield version
# Installation und Update
sudo ./adguard-shield install
sudo ./adguard-shield update
sudo ./adguard-shield install-status
sudo /opt/adguard-shield/adguard-shield uninstall --keep-config
# Service
sudo systemctl start adguard-shield
sudo systemctl stop adguard-shield
sudo systemctl restart adguard-shield
sudo systemctl status adguard-shield
# Diagnose
sudo /opt/adguard-shield/adguard-shield test
sudo /opt/adguard-shield/adguard-shield status
sudo /opt/adguard-shield/adguard-shield live
sudo /opt/adguard-shield/adguard-shield history 100
sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100
# Manuelle Eingriffe
sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100
sudo /opt/adguard-shield/adguard-shield ban 192.168.1.100
sudo /opt/adguard-shield/adguard-shield flush
Installation
Das installierte Binary landet standardmäßig unter:
/opt/adguard-shield/adguard-shield
Typischer Ablauf:
# Binary ausführbar machen
chmod +x ./adguard-shield
# Standardinstallation
sudo ./adguard-shield install
# Bestehende Konfigurationsdatei als Vorlage übernehmen
sudo ./adguard-shield install --config-source ./adguard-shield.conf
Am Ende fragt der Installer, ob AdGuard Shield direkt gestartet oder neu gestartet werden soll.
Weitere Optionen:
# Paketprüfung überspringen
sudo ./adguard-shield install --skip-deps
# systemd-Autostart nicht aktivieren
sudo ./adguard-shield install --no-enable
# abweichendes Installationsverzeichnis
sudo ./adguard-shield install --install-dir /opt/adguard-shield-test
Der Installer erledigt:
- Linux- und root-Prüfung
- Prüfung auf alte Shell-Artefakte
- Installation fehlender Abhängigkeiten über
apt-get, sofern möglich - Anlage von Installations- und State-Verzeichnissen
- Kopieren des laufenden Binarys
- Anlage oder Migration der Konfiguration
- Schreiben der systemd-Unit
systemctl daemon-reload- optional Autostart aktivieren
- fragen, ob der Service direkt gestartet oder neu gestartet werden soll
Benötigte Systembefehle:
iptables
ip6tables
ipset
systemctl
Auf Debian/Ubuntu installiert der Installer passende Pakete automatisch, sofern apt-get verfügbar ist und --skip-deps nicht gesetzt wurde.
Update
Ein Update wird mit dem neuen Binary ausgeführt, nicht mit dem bereits installierten alten Binary.
chmod +x ./adguard-shield
sudo ./adguard-shield update
Am Ende fragt der Updater, ob AdGuard Shield direkt neu gestartet werden soll.
Mit expliziter Konfigurationsquelle:
sudo ./adguard-shield update --config-source ./adguard-shield.conf
Beim Update:
- wird die Installation wie bei
installaktualisiert - bleibt die vorhandene Konfiguration erhalten
- werden neue Konfigurationsparameter ergänzt
- wird bei einer Migration
adguard-shield.conf.oldgeschrieben - wird die systemd-Unit neu geschrieben
- wird systemd neu geladen
Installationsstatus
sudo ./adguard-shield install-status
Für ein anderes Installationsverzeichnis:
sudo ./adguard-shield install-status --install-dir /opt/adguard-shield-test
install-status zeigt:
- Installationspfad
- Binary vorhanden
- installierte Version
- Konfiguration vorhanden
- systemd-Service vorhanden
- Autostart aktiv
- Service aktiv
- gefundene Legacy-Artefakte
Deinstallation
# Alles entfernen
sudo /opt/adguard-shield/adguard-shield uninstall
# Konfiguration behalten
sudo /opt/adguard-shield/adguard-shield uninstall --keep-config
Bei der Deinstallation wird:
- der Service gestoppt
- der Autostart deaktiviert
- die Shield-Firewall-Struktur entfernt
- die systemd-Unit gelöscht
- systemd neu geladen
- je nach Option Installationsverzeichnis, State und Log entfernt
Mit --keep-config bleiben Konfigurationsdaten erhalten. Das ist sinnvoll, wenn du neu installieren oder migrieren möchtest.
Alte Shell-Installation
Die Go-Version darf nicht parallel zur alten Shell-Version laufen. Der Installer bricht ab, wenn er alte Artefakte findet, zum Beispiel:
/opt/adguard-shield/adguard-shield.sh
/opt/adguard-shield/iptables-helper.sh
/opt/adguard-shield/external-blocklist-worker.sh
/opt/adguard-shield/geoip-worker.sh
/etc/systemd/system/adguard-shield-watchdog.timer
Empfohlener Ablauf:
- Bestehende
/opt/adguard-shield/adguard-shield.confsichern. - Alte Shell-Version mit deren Uninstaller entfernen und die Konfiguration behalten.
- Go-Binary erneut installieren.
- Konfiguration prüfen.
- Zuerst
dry-run, dann produktiven Service starten.
systemd-Service
Im produktiven Betrieb sollte AdGuard Shield über systemd laufen:
sudo systemctl start adguard-shield
sudo systemctl stop adguard-shield
sudo systemctl restart adguard-shield
sudo systemctl status adguard-shield
Autostart:
sudo systemctl enable adguard-shield
sudo systemctl disable adguard-shield
Nach manuellen Änderungen an der Unit:
sudo systemctl daemon-reload
Die Unit startet:
/opt/adguard-shield/adguard-shield -config /opt/adguard-shield/adguard-shield.conf run
Die Go-Version nutzt Restart=on-failure. Einen separaten Watchdog-Service oder Watchdog-Timer gibt es nicht mehr.
Daemon direkt starten
Für Debugging oder Dry-Run kann der Daemon im Vordergrund gestartet werden:
# normaler Vordergrundlauf
sudo /opt/adguard-shield/adguard-shield run
# Alias für run
sudo /opt/adguard-shield/adguard-shield start
# analysieren ohne echte Sperren
sudo /opt/adguard-shield/adguard-shield dry-run
Stop über PID-Datei:
sudo /opt/adguard-shield/adguard-shield stop
Für den Alltag gilt: Nutze systemctl. Der direkte Vordergrundlauf endet, sobald die Shell beendet wird oder du Strg+C drückst.
API-Test
sudo /opt/adguard-shield/adguard-shield test
Der Test ruft /control/querylog auf und prüft damit:
- ist
ADGUARD_URLerreichbar? - funktionieren HTTP/TLS und Netzwerk?
- stimmen
ADGUARD_USERundADGUARD_PASS? - liefert AdGuard Home Querylog-Daten?
Bei Erfolg erscheint sinngemäß:
Verbindung erfolgreich. 123 Querylog-Einträge gefunden.
Wenn der Test fehlschlägt, zuerst die Konfiguration und die AdGuard-Home-Weboberfläche prüfen.
Status
sudo /opt/adguard-shield/adguard-shield status
status zeigt:
- verwendete Konfigurationsdatei
- Firewall-Backend und Chain
- GeoIP-Aktivierung, Modus und Länder
- externe Blocklist und Anzahl der URLs
- externe Whitelist und Anzahl der URLs
- aktive Sperren mit IP, Quelle, Grund und Ablaufzeit
Bei sehr vielen aktiven Sperren werden nur die ersten 50 angezeigt. Details stehen in der History oder direkt in SQLite.
Live-Ansicht
sudo /opt/adguard-shield/adguard-shield live
live ist die beste Ansicht, wenn du verstehen möchtest, was gerade passiert.
Sie zeigt:
- Query-Poller, API-Einträge, Zeitfenster und Rate-Limit
- Top Client/Domain-Kombinationen
- Subdomain-Flood-Kandidaten
- letzte Querylog-Einträge
- aktive Sperren
- externe Listen
- GeoIP-Status
- Offense-Cleanup-Status
- Systemereignisse aus der Logdatei
Optionen:
# alle 2 Sekunden aktualisieren
sudo /opt/adguard-shield/adguard-shield live --interval 2
# Top 20 anzeigen
sudo /opt/adguard-shield/adguard-shield live --top 20
# mehr letzte Queries und Logs anzeigen
sudo /opt/adguard-shield/adguard-shield live --recent 25
# DEBUG-Logs einblenden
sudo /opt/adguard-shield/adguard-shield live --logs debug
# Logbereich ausblenden
sudo /opt/adguard-shield/adguard-shield live --logs off
# nur einmaligen Snapshot ausgeben
sudo /opt/adguard-shield/adguard-shield live --once
Alias:
sudo /opt/adguard-shield/adguard-shield watch
History
# letzte 50 Einträge
sudo /opt/adguard-shield/adguard-shield history
# letzte 200 Einträge
sudo /opt/adguard-shield/adguard-shield history 200
Die History kommt aus der SQLite-Tabelle ban_history. Sie enthält:
BAN: echte SperreUNBAN: FreigabeDRY: im Dry-Run erkannt, aber nicht gesperrt
Format:
Zeit | Aktion | Client-IP | Domain | Anzahl | Dauer | Protokoll | Grund
Typische Gründe:
| Grund | Bedeutung |
|---|---|
rate-limit |
gleiche Domain zu oft angefragt |
subdomain-flood |
zu viele eindeutige Subdomains einer Basisdomain |
dns-flood-watchlist |
Watchlist-Treffer mit Permanent-Ban |
external-blocklist |
Sperre aus externer Blocklist |
geoip |
GeoIP-Länderfilter |
manual |
manuelle Freigabe |
manual-flush |
Freigabe durch flush |
expired |
temporäre Sperre abgelaufen |
external-whitelist |
Freigabe durch externe Whitelist |
Logs
AdGuard Shield schreibt Daemon-Ereignisse in LOG_FILE, standardmäßig:
/var/log/adguard-shield.log
CLI:
# letzte INFO/WARN/ERROR-Einträge
sudo /opt/adguard-shield/adguard-shield logs
# letzte 100 Warnungen und Fehler
sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 100
# Kurzform
sudo /opt/adguard-shield/adguard-shield logs debug
# laufende Ansicht
sudo /opt/adguard-shield/adguard-shield logs-follow --level info
Erlaubte Level:
DEBUG
INFO
WARN
ERROR
systemd-Journal:
sudo journalctl -u adguard-shield -f
sudo journalctl -u adguard-shield --no-pager -n 100
Hinweis: Query-Inhalte werden nicht dauerhaft in die Logdatei geschrieben. Für Query-nahe Diagnose ist live gedacht.
Manuelle Sperren und Freigaben
# IP permanent sperren
sudo /opt/adguard-shield/adguard-shield ban 192.168.1.100
# IP entsperren
sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100
# alle aktiven Sperren aufheben
sudo /opt/adguard-shield/adguard-shield flush
ban legt eine manuelle permanente Sperre an. unban entfernt die IP aus Firewall und Datenbank. flush hebt alle aktiven Sperren auf.
Whitelist-Regeln gelten auch für manuelle Sperren. Eine IP aus WHITELIST oder externer Whitelist wird nicht gesperrt.
Bulk-Kommandos senden bei aktivierten Benachrichtigungen eine zusammenfassende Freigabe-Meldung, nicht eine Nachricht pro IP.
Progressive Sperren und Offenses
# Offense-Zähler anzeigen
sudo /opt/adguard-shield/adguard-shield offense-status
# abgelaufene Zähler entfernen
sudo /opt/adguard-shield/adguard-shield offense-cleanup
# alle Offense-Zähler zurücksetzen
sudo /opt/adguard-shield/adguard-shield reset-offenses
# Zähler für eine IP zurücksetzen
sudo /opt/adguard-shield/adguard-shield reset-offenses 192.168.1.100
Nützlich nach Fehlkonfigurationen:
sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100
sudo /opt/adguard-shield/adguard-shield reset-offenses 192.168.1.100
Firewall-Befehle
# Chain und ipsets anlegen
sudo /opt/adguard-shield/adguard-shield firewall-create
# Status anzeigen
sudo /opt/adguard-shield/adguard-shield firewall-status
# ipsets leeren
sudo /opt/adguard-shield/adguard-shield firewall-flush
# Chain, Regeln und ipsets entfernen
sudo /opt/adguard-shield/adguard-shield firewall-remove
# aktuelle iptables-Regeln sichern
sudo /opt/adguard-shield/adguard-shield firewall-save
# gespeicherte Regeln wiederherstellen
sudo /opt/adguard-shield/adguard-shield firewall-restore
Normalerweise musst du diese Befehle nicht manuell ausführen. Der Daemon erstellt die Firewall beim Start und schreibt aktive Sperren aus SQLite wieder hinein.
Welche Host-Chain genutzt wird, hängt von FIREWALL_MODE ab. Klassische Installationen und Docker Host Network nutzen INPUT; Docker mit veröffentlichten Ports nutzt DOCKER-USER. Details stehen in Docker-Installationen.
Gespeicherte Regeln:
/var/lib/adguard-shield/iptables-rules.v4
/var/lib/adguard-shield/iptables-rules.v6
Externe Whitelist
# Status anzeigen
sudo /opt/adguard-shield/adguard-shield whitelist-status
# sofort synchronisieren
sudo /opt/adguard-shield/adguard-shield whitelist-sync
# aufgelöste externe Whitelist entfernen
sudo /opt/adguard-shield/adguard-shield whitelist-flush
Die externe Whitelist kann IPs, CIDR-Netze und Hostnamen enthalten. Hostnamen werden per DNS aufgelöst und als IPs in SQLite gespeichert.
Wichtig:
- Eine gewhitelistete IP wird nicht gesperrt.
- Wird eine bereits gesperrte IP später gewhitelistet, wird sie freigegeben.
- Die dauerhafte Synchronisation läuft im Daemon.
whitelist-syncerzwingt nur einen einzelnen Lauf.
Externe Blocklist
# Status anzeigen
sudo /opt/adguard-shield/adguard-shield blocklist-status
# sofort synchronisieren
sudo /opt/adguard-shield/adguard-shield blocklist-sync
# alle Sperren aus externer Blocklist aufheben
sudo /opt/adguard-shield/adguard-shield blocklist-flush
Die externe Blocklist kann IPs, CIDR-Netze und Hostnamen enthalten. Hostnamen werden aufgelöst. Einträge aus der Whitelist werden übersprungen.
Wenn EXTERNAL_BLOCKLIST_AUTO_UNBAN=true gesetzt ist, hebt der Daemon Blocklist-Sperren wieder auf, sobald sie nicht mehr in der externen Liste vorkommen.
GeoIP
# Status anzeigen
sudo /opt/adguard-shield/adguard-shield geoip-status
# aktuelle Clients aus dem Querylog einmalig prüfen
sudo /opt/adguard-shield/adguard-shield geoip-sync
# alle GeoIP-Sperren aufheben
sudo /opt/adguard-shield/adguard-shield geoip-flush
# Cache leeren
sudo /opt/adguard-shield/adguard-shield geoip-flush-cache
# einzelne IP nachschlagen
sudo /opt/adguard-shield/adguard-shield geoip-lookup 8.8.8.8
GeoIP-Sperren sind permanent, werden aber bei Konfigurationsänderungen automatisch neu bewertet.
Reports
# Konfiguration und Cron-Status anzeigen
sudo /opt/adguard-shield/adguard-shield report-status
# HTML-Report in Datei schreiben
sudo /opt/adguard-shield/adguard-shield report-generate html /tmp/adguard-shield-report.html
# Text-Report auf stdout ausgeben
sudo /opt/adguard-shield/adguard-shield report-generate txt
# Testmail senden
sudo /opt/adguard-shield/adguard-shield report-test
# aktuellen Report senden
sudo /opt/adguard-shield/adguard-shield report-send
# Cron-Job installieren
sudo /opt/adguard-shield/adguard-shield report-install
# Cron-Job entfernen
sudo /opt/adguard-shield/adguard-shield report-remove
Der Cron-Job liegt hier:
/etc/cron.d/adguard-shield-report
Dry-Run
sudo /opt/adguard-shield/adguard-shield dry-run
Der Dry-Run ist der sicherste Weg, neue Konfigurationen zu prüfen.
Im Dry-Run:
- werden Querylogs normal gelesen
- Rate-Limit, Subdomain-Flood, Watchlist, externe Blocklist und GeoIP werden ausgewertet
- mögliche Sperren landen als
DRYin der History - es werden keine aktiven Bans angelegt
- es werden keine Firewall-Regeln gesetzt
Typischer Ablauf nach größeren Änderungen:
sudo /opt/adguard-shield/adguard-shield dry-run
sudo /opt/adguard-shield/adguard-shield history 50
sudo /opt/adguard-shield/adguard-shield logs --level warn --limit 80
Typische Betriebsabläufe
Nach Konfigurationsänderung
sudo systemctl restart adguard-shield
sudo /opt/adguard-shield/adguard-shield status
sudo /opt/adguard-shield/adguard-shield logs --level info --limit 80
Falsch gesperrte IP freigeben
sudo /opt/adguard-shield/adguard-shield unban 192.168.1.100
sudo /opt/adguard-shield/adguard-shield reset-offenses 192.168.1.100
Danach die IP dauerhaft in WHITELIST oder eine externe Whitelist aufnehmen.
Externe Listen neu laden
sudo /opt/adguard-shield/adguard-shield whitelist-sync
sudo /opt/adguard-shield/adguard-shield blocklist-sync
sudo /opt/adguard-shield/adguard-shield status
Firewall neu aufbauen
sudo /opt/adguard-shield/adguard-shield firewall-remove
sudo /opt/adguard-shield/adguard-shield firewall-create
sudo systemctl restart adguard-shield
Nach dem Neustart schreibt der Daemon aktive Sperren aus SQLite wieder in die Firewall.
Service-Problem eingrenzen
sudo systemctl status adguard-shield
sudo journalctl -u adguard-shield --no-pager -n 100
sudo /opt/adguard-shield/adguard-shield test
sudo /opt/adguard-shield/adguard-shield logs --level debug --limit 100
DNS-Abfragen zum Testen
Die folgenden Befehle sind ausschließlich für kontrollierte Tests gegen deinen eigenen DNS-Server gedacht. Ersetze 203.0.113.50 durch deine eigene DNS-Server-IP und example.com durch eine Testdomain.
Nicht gegen fremde DNS-Server, fremde Dienste oder fremde Infrastruktur verwenden.
Voraussetzungen auf dem Testclient
# klassisches DNS
sudo apt install dnsutils
# DoH
sudo apt install curl
# DoT
sudo apt install knot-dnsutils
Klassisches DNS
Gleiche Domain mehrfach abfragen:
for i in {1..40}; do \
dig @203.0.113.50 example.com +short +cookie=$(openssl rand -hex 8) > /dev/null & \
done; wait
Viele zufällige Subdomains:
for i in {1..60}; do \
dig @203.0.113.50 $(openssl rand -hex 6).example.com +short > /dev/null & \
done; wait
DNS over HTTPS
for i in {1..40}; do \
curl -s -H "accept: application/dns-json" \
"https://203.0.113.50/dns-query?name=example.com&type=A" > /dev/null & \
done; wait
Bei selbstsigniertem Zertifikat auf dem eigenen Testserver kann für diesen lokalen Test -k ergänzt werden.
DNS over TLS
for i in {1..40}; do \
kdig @203.0.113.50 example.com +tls +short > /dev/null & \
done; wait
Die Beispielzahlen liegen bewusst nahe an den Standardlimits RATE_LIMIT_MAX_REQUESTS=30 und SUBDOMAIN_FLOOD_MAX_UNIQUE=50.
Eingebaute Hilfe
/opt/adguard-shield/adguard-shield --help
Bei unbekannten Befehlen gibt das Binary die Usage-Ausgabe aus. Der wichtigste Merksatz für die Go-Version:
sudo /opt/adguard-shield/adguard-shield <befehl>
Nicht mehr:
sudo /opt/adguard-shield/adguard-shield.sh <befehl>