Files
adguard-shield/docs/befehle.md
Patrick Asmus 4f17f7ff81 feat!: Migration auf Go-Binary
BREAKING CHANGE: Die alte Shell-Version muss vor der Installation der Go-Version deinstalliert werden.
2026-05-01 00:08:57 +02:00

743 lines
18 KiB
Markdown

# Befehle & Nutzung
AdGuard Shield wird in der Go-Version über ein einzelnes Binary bedient:
```bash
/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
```bash
sudo /opt/adguard-shield/adguard-shield <befehl>
```
Wenn du eine andere Konfigurationsdatei verwenden möchtest, muss `-config` direkt vor dem Befehl stehen:
```bash
sudo /opt/adguard-shield/adguard-shield -config /pfad/zur/adguard-shield.conf status
```
Standardpfade:
```text
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
```bash
# 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:
```text
/opt/adguard-shield/adguard-shield
```
Typischer Ablauf:
```bash
# 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:
```bash
# 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:
1. Linux- und root-Prüfung
2. Prüfung auf alte Shell-Artefakte
3. Installation fehlender Abhängigkeiten über `apt-get`, sofern möglich
4. Anlage von Installations- und State-Verzeichnissen
5. Kopieren des laufenden Binarys
6. Anlage oder Migration der Konfiguration
7. Schreiben der systemd-Unit
8. `systemctl daemon-reload`
9. optional Autostart aktivieren
10. fragen, ob der Service direkt gestartet oder neu gestartet werden soll
Benötigte Systembefehle:
```text
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.
```bash
chmod +x ./adguard-shield
sudo ./adguard-shield update
```
Am Ende fragt der Updater, ob AdGuard Shield direkt neu gestartet werden soll.
Mit expliziter Konfigurationsquelle:
```bash
sudo ./adguard-shield update --config-source ./adguard-shield.conf
```
Beim Update:
- wird die Installation wie bei `install` aktualisiert
- bleibt die vorhandene Konfiguration erhalten
- werden neue Konfigurationsparameter ergänzt
- wird bei einer Migration `adguard-shield.conf.old` geschrieben
- wird die systemd-Unit neu geschrieben
- wird systemd neu geladen
## Installationsstatus
```bash
sudo ./adguard-shield install-status
```
Für ein anderes Installationsverzeichnis:
```bash
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
```bash
# Alles entfernen
sudo /opt/adguard-shield/adguard-shield uninstall
# Konfiguration behalten
sudo /opt/adguard-shield/adguard-shield uninstall --keep-config
```
Bei der Deinstallation wird:
1. der Service gestoppt
2. der Autostart deaktiviert
3. die Shield-Firewall-Struktur entfernt
4. die systemd-Unit gelöscht
5. systemd neu geladen
6. 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:
```text
/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:
1. Bestehende `/opt/adguard-shield/adguard-shield.conf` sichern.
2. Alte Shell-Version mit deren Uninstaller entfernen und die Konfiguration behalten.
3. Go-Binary erneut installieren.
4. Konfiguration prüfen.
5. Zuerst `dry-run`, dann produktiven Service starten.
## systemd-Service
Im produktiven Betrieb sollte AdGuard Shield über systemd laufen:
```bash
sudo systemctl start adguard-shield
sudo systemctl stop adguard-shield
sudo systemctl restart adguard-shield
sudo systemctl status adguard-shield
```
Autostart:
```bash
sudo systemctl enable adguard-shield
sudo systemctl disable adguard-shield
```
Nach manuellen Änderungen an der Unit:
```bash
sudo systemctl daemon-reload
```
Die Unit startet:
```bash
/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:
```bash
# 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:
```bash
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
```bash
sudo /opt/adguard-shield/adguard-shield test
```
Der Test ruft `/control/querylog` auf und prüft damit:
- ist `ADGUARD_URL` erreichbar?
- funktionieren HTTP/TLS und Netzwerk?
- stimmen `ADGUARD_USER` und `ADGUARD_PASS`?
- liefert AdGuard Home Querylog-Daten?
Bei Erfolg erscheint sinngemäß:
```text
Verbindung erfolgreich. 123 Querylog-Einträge gefunden.
```
Wenn der Test fehlschlägt, zuerst die Konfiguration und die AdGuard-Home-Weboberfläche prüfen.
## Status
```bash
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
```bash
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:
```bash
# 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:
```bash
sudo /opt/adguard-shield/adguard-shield watch
```
## History
```bash
# 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 Sperre
- `UNBAN`: Freigabe
- `DRY`: im Dry-Run erkannt, aber nicht gesperrt
Format:
```text
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:
```text
/var/log/adguard-shield.log
```
CLI:
```bash
# 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:
```text
DEBUG
INFO
WARN
ERROR
```
systemd-Journal:
```bash
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
```bash
# 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
```bash
# 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:
```bash
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
```bash
# 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](docker.md).
Gespeicherte Regeln:
```text
/var/lib/adguard-shield/iptables-rules.v4
/var/lib/adguard-shield/iptables-rules.v6
```
## Externe Whitelist
```bash
# 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-sync` erzwingt nur einen einzelnen Lauf.
## Externe Blocklist
```bash
# 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
```bash
# 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
```bash
# 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:
```text
/etc/cron.d/adguard-shield-report
```
## Dry-Run
```bash
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 `DRY` in der History
- es werden keine aktiven Bans angelegt
- es werden keine Firewall-Regeln gesetzt
Typischer Ablauf nach größeren Änderungen:
```bash
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
```bash
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
```bash
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
```bash
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
```bash
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
```bash
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
```bash
# klassisches DNS
sudo apt install dnsutils
# DoH
sudo apt install curl
# DoT
sudo apt install knot-dnsutils
```
### Klassisches DNS
Gleiche Domain mehrfach abfragen:
```bash
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:
```bash
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
```bash
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
```bash
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
```bash
/opt/adguard-shield/adguard-shield --help
```
Bei unbekannten Befehlen gibt das Binary die Usage-Ausgabe aus. Der wichtigste Merksatz für die Go-Version:
```bash
sudo /opt/adguard-shield/adguard-shield <befehl>
```
Nicht mehr:
```bash
sudo /opt/adguard-shield/adguard-shield.sh <befehl>
```