Konfiguration
Die zentrale Konfigurationsdatei liegt nach der Installation hier:
Die Datei ist eine einfache Shell-ähnliche Key-Value-Datei. Kommentare beginnen mit #. Werte können ohne Anführungszeichen, mit doppelten Anführungszeichen oder mit einfachen Anführungszeichen geschrieben werden.
Beispiel:
Nach Änderungen muss der Service neu gestartet werden:
Automatische Migration
Beim Installieren oder Aktualisieren wird eine vorhandene Konfiguration nicht überschrieben. Der Installer vergleicht vorhandene Schlüssel mit der aktuellen Standardkonfiguration.
Wenn neue Parameter fehlen:
- Die alte Datei wird als
adguard-shield.conf.old gesichert.
- Fehlende Schlüssel werden am Ende ergänzt.
- Vorhandene Werte bleiben erhalten.
- Dateirechte werden auf
0600 gesetzt.
Das ist besonders wichtig beim Umstieg von der Shell-Version auf die Go-Version. Prüfe nach einem Update trotzdem die neu ergänzten Parameter.
Empfohlene Startprüfung
Nach dem Bearbeiten der Konfiguration:
AdGuard Home API
| Parameter |
Standard |
Beschreibung |
ADGUARD_URL |
https://dns1.domain.com |
URL der AdGuard-Home-Weboberfläche/API |
ADGUARD_USER |
admin |
Benutzername für die API-Authentifizierung |
ADGUARD_PASS |
changeme |
Passwort für die API-Authentifizierung |
Beispiel: Lokale Instanz
Beispiel: Entfernte Instanz mit HTTPS
AdGuard Shield ruft intern diesen Endpunkt ab:
Hinweis: Der HTTP-Client akzeptiert auch selbstsignierte TLS-Zertifikate. Das erleichtert lokale Setups, ersetzt aber keine saubere Absicherung der AdGuard-Home-Oberfläche.
Querylog und Polling
| Parameter |
Standard |
Beschreibung |
CHECK_INTERVAL |
10 |
Abstand zwischen Querylog-Abfragen in Sekunden |
API_QUERY_LIMIT |
500 |
Anzahl der Querylog-Einträge pro API-Abfrage (max. 5000) |
Empfehlungen
| Situation |
Empfehlung |
| Normaler Betrieb |
CHECK_INTERVAL=10 ist ein guter Standard |
| Hohes DNS-Aufkommen |
API_QUERY_LIMIT auf 1000–2000 erhöhen |
API_QUERY_LIMIT zu niedrig |
Spitzen im Querylog können zwischen zwei Polls verpasst werden |
| Sehr kurze Intervalle |
Erzeugen mehr API-Last auf AdGuard Home |
Rate-Limit
| Parameter |
Standard |
Beschreibung |
RATE_LIMIT_MAX_REQUESTS |
30 |
Maximale Anfragen pro Client und Domain im Zeitfenster |
RATE_LIMIT_WINDOW |
60 |
Zeitfenster in Sekunden |
Das bedeutet: Wenn ein Client dieselbe Domain mehr als 30-mal innerhalb von 60 Sekunden abfragt, wird er als auffällig erkannt und gesperrt.
Empfohlene Startwerte
| Umgebung |
MAX_REQUESTS |
WINDOW |
Hinweis |
| Kleines Heimnetz |
30 |
60 |
Standardwerte |
| Viele Clients |
60–120 |
60 |
Höherer Grenzwert für mehr Grundlast |
| Aktive Resolver/Forwarder |
nach Bedarf |
60 |
Zuerst Forwarder whitelisten |
Wichtig: Wenn ein Router, Reverse Proxy oder lokaler DNS-Forwarder stellvertretend für viele Clients fragt, sollte dieser Client in die Whitelist. Sonst sieht AdGuard Shield nur eine sehr aktive IP und sperrt den Forwarder statt der eigentlichen Verursacher.
Subdomain-Flood-Erkennung
| Parameter |
Standard |
Beschreibung |
SUBDOMAIN_FLOOD_ENABLED |
true |
Erkennung zufälliger Subdomains aktivieren |
SUBDOMAIN_FLOOD_MAX_UNIQUE |
50 |
Maximale eindeutige Subdomains pro Client und Basisdomain |
SUBDOMAIN_FLOOD_WINDOW |
60 |
Zeitfenster in Sekunden |
Diese Erkennung zielt auf Muster wie:
Dabei zählt AdGuard Shield nicht die Gesamtzahl der Anfragen, sondern die Anzahl unterschiedlicher Subdomains unter derselben Basisdomain. Direkte Anfragen an example.com selbst zählen nicht.
Hinweise
- Multi-Part-TLDs wie
.co.uk werden korrekt als Basisdomain erkannt.
- CDNs und manche Apps nutzen legitim viele Subdomains. Betroffene Clients whitelisten oder Grenzwert erhöhen.
DNS-Flood-Watchlist
| Parameter |
Standard |
Beschreibung |
DNS_FLOOD_WATCHLIST_ENABLED |
false |
Watchlist aktivieren |
DNS_FLOOD_WATCHLIST |
leer |
Kommagetrennte Domainliste |
Die Watchlist ist für Domains gedacht, bei denen eine Überschreitung sofort hart behandelt werden soll, ohne progressive Stufen.
Beispiel
Matching-Logik
Wenn ein Client login.microsoft.com über das Rate-Limit bringt, wird sofort permanent gesperrt, weil login.microsoft.com zur Watchlist-Domain microsoft.com gehört. evil-microsoft.com würde dagegen nicht matchen.
Folgen eines Watchlist-Treffers
| Aspekt |
Verhalten |
| Grund |
dns-flood-watchlist |
| Sperrdauer |
Permanent |
| Progressive Sperren |
Werden übersprungen |
| AbuseIPDB |
Wird gemeldet, falls aktiviert |
Sperrdauer und Firewall
| Parameter |
Standard |
Beschreibung |
BAN_DURATION |
3600 |
Basisdauer temporärer Monitor-Sperren in Sekunden (1 Stunde) |
IPTABLES_CHAIN |
ADGUARD_SHIELD |
Name der eigenen Firewall-Chain |
BLOCKED_PORTS |
53 443 853 |
Ports, die für gesperrte Clients blockiert werden (Leerzeichen-getrennt) |
FIREWALL_BACKEND |
ipset |
Firewall-Backend (ipset + iptables) |
FIREWALL_MODE |
host |
Verkehrsweg der AdGuard-Home-Installation |
DRY_RUN |
false |
Konfigurationsweiter Testmodus ohne echte Sperren |
Blockierte Ports
| Port |
Zweck |
53 |
Klassisches DNS über UDP/TCP |
443 |
DNS-over-HTTPS (DoH), sofern AdGuard Home darüber erreichbar ist |
853 |
DNS-over-TLS (DoT) und DNS-over-QUIC (DoQ) |
Firewall-Modi
| Modus |
Einsatz |
Parent-Chain |
host |
Klassische AdGuard-Home-Installation direkt auf dem Host |
INPUT |
docker-host |
Docker mit network_mode: host (Alias von host) |
INPUT |
docker-bridge |
Docker mit veröffentlichten Ports, z.B. -p 53:53 |
DOCKER-USER |
hybrid |
Schützt Host-Ports und Docker-Forwarding gleichzeitig |
INPUT + DOCKER-USER |
Details zu den Docker-Modi stehen in Docker-Installationen.
Whitelist
| Parameter |
Standard |
Beschreibung |
WHITELIST |
127.0.0.1,::1 |
IPs, die nie gesperrt werden (kommagetrennt) |
Beispiel
Empfohlene Whitelist-Einträge
| Typ |
Beispiel |
Grund |
| Localhost |
127.0.0.1, ::1 |
Lokale Anfragen |
| Router/Gateway |
192.168.1.1 |
Bündelt oft DNS für alle Clients |
| Admin-IPs |
192.168.1.10 |
Eigene Management-Geräte |
| Monitoring |
Monitoring-IP |
Regelmäßige DNS-Checks |
| Interne Resolver |
Resolver-IP |
Fragt stellvertretend für viele Clients |
| VPN-Endpunkte |
VPN-IP |
Bündeln DNS-Anfragen vieler Nutzer |
Wichtig: Die Whitelist wird vor jeder Sperre geprüft. Das gilt für automatische, manuelle, GeoIP- und externe Blocklist-Sperren.
Progressive Sperren
| Parameter |
Standard |
Beschreibung |
PROGRESSIVE_BAN_ENABLED |
true |
Wiederholungstäter stufenweise länger sperren |
PROGRESSIVE_BAN_MULTIPLIER |
2 |
Multiplikator pro Stufe (2 = Verdopplung) |
PROGRESSIVE_BAN_MAX_LEVEL |
5 |
Ab dieser Stufe permanent sperren (0 = nie permanent durch Stufe) |
PROGRESSIVE_BAN_RESET_AFTER |
86400 |
Offense-Zähler nach so vielen Sekunden ohne neues Vergehen zurücksetzen |
Stufenverlauf mit Standardwerten
| Vergehen |
Stufe |
Berechnung |
Sperrdauer |
| 1 |
1 |
3600 × 2⁰ |
1 Stunde |
| 2 |
2 |
3600 × 2¹ |
2 Stunden |
| 3 |
3 |
3600 × 2² |
4 Stunden |
| 4 |
4 |
3600 × 2³ |
8 Stunden |
| 5 |
5 |
Max-Level erreicht |
Permanent |
Progressive Sperren gelten für Monitor-Sperren wie rate-limit und subdomain-flood. Watchlist-Treffer sind sofort permanent. GeoIP und externe Blocklisten haben eigene Regeln.
Verwaltungsbefehle
Logging
| Parameter |
Standard |
Beschreibung |
LOG_FILE |
/var/log/adguard-shield.log |
Datei für Daemon-Ereignisse |
LOG_LEVEL |
INFO |
Minimales Log-Level |
Verfügbare Log-Level
| Level |
Beschreibung |
Empfehlung |
DEBUG |
Detaillierte Informationen, z.B. einzelne API-Ergebnisse |
Nur kurzzeitig für Fehlersuche |
INFO |
Normale Betriebsmeldungen (Start, Sperren, Freigaben) |
Empfohlen für den produktiven Betrieb |
WARN |
Warnungen (API-Fehler, fehlende Dateien, Konfigurationsprobleme) |
|
ERROR |
Fehler, die den Betrieb beeinträchtigen |
|
CLI-Befehle
Hinweis: Query-Inhalte werden nicht dauerhaft ins Log geschrieben. Für Query-nahe Diagnose ist die Live-Ansicht gedacht.
State und Runtime
| Parameter |
Standard |
Beschreibung |
STATE_DIR |
/var/lib/adguard-shield |
Verzeichnis für SQLite-Datenbank und Caches |
PID_FILE |
/var/run/adguard-shield.pid |
PID-Datei für direkten Vordergrundlauf |
SQLite-Datei
Weitere Dateien in STATE_DIR
| Datei/Verzeichnis |
Inhalt |
adguard-shield.db |
Hauptdatenbank (Sperren, History, Offenses, Caches) |
adguard-shield.db-wal |
WAL-Datei (im laufenden Betrieb) |
adguard-shield.db-shm |
Shared-Memory-Datei (im laufenden Betrieb) |
external-blocklist/ |
Cache für heruntergeladene Blocklisten |
external-whitelist/ |
Cache für heruntergeladene Whitelists |
iptables-rules.v4 |
Gesicherte IPv4-Firewall-Regeln |
iptables-rules.v6 |
Gesicherte IPv6-Firewall-Regeln |
Benachrichtigungen
| Parameter |
Standard |
Beschreibung |
NOTIFY_ENABLED |
false |
Benachrichtigungen aktivieren |
NOTIFY_TYPE |
ntfy |
Benachrichtigungskanal |
NOTIFY_WEBHOOK_URL |
leer |
Webhook-URL (nicht für ntfy) |
NTFY_SERVER_URL |
https://ntfy.sh |
Ntfy-Server |
NTFY_TOPIC |
leer |
Ntfy-Topic |
NTFY_TOKEN |
leer |
Optionaler Ntfy-Access-Token |
NTFY_PRIORITY |
4 |
Ntfy-Priorität (1–5) |
Verfügbare Typen
| Typ |
Beschreibung |
ntfy |
Ntfy Push-Benachrichtigungen (öffentlich oder selbst gehostet) |
discord |
Discord-Webhook |
slack |
Slack-Webhook |
gotify |
Gotify-Server |
generic |
Eigener Webhook-Endpunkt (JSON POST) |
Beispiel: Ntfy
Beispiel: Discord
Details zu allen Kanälen stehen in Benachrichtigungen.
E-Mail-Reports
| Parameter |
Standard |
Beschreibung |
REPORT_ENABLED |
false |
Report-Funktion logisch aktivieren |
REPORT_INTERVAL |
weekly |
Versandintervall |
REPORT_TIME |
08:00 |
Versandzeit im Format HH:MM |
REPORT_EMAIL_TO |
admin@example.com |
Empfängeradresse |
REPORT_EMAIL_FROM |
adguard-shield@example.com |
Absenderadresse |
REPORT_FORMAT |
html |
Report-Format |
REPORT_MAIL_CMD |
msmtp |
Mailprogramm für den Versand |
REPORT_BUSIEST_DAY_RANGE |
30 |
Zeitraum für "Aktivster Tag" (Kompatibilitätsparameter) |
Verfügbare Intervalle
| Intervall |
Versand |
daily |
Täglich zur konfigurierten Uhrzeit |
weekly |
Montags zur konfigurierten Uhrzeit |
biweekly |
Am 1. und 15. des Monats |
monthly |
Am 1. des Monats |
Verfügbare Formate
| Format |
Beschreibung |
html |
HTML-formatierte E-Mail (empfohlen für Standard-Mail-Clients) |
txt |
Reiner Text (robuster für einfache Mail-Setups) |
Beispiel
Cron-Job installieren
Details stehen in E-Mail Report.
Externe Whitelist
| Parameter |
Standard |
Beschreibung |
EXTERNAL_WHITELIST_ENABLED |
false |
Externe Whitelist aktivieren |
EXTERNAL_WHITELIST_URLS |
leer |
Kommagetrennte URLs zu den Whitelist-Dateien |
EXTERNAL_WHITELIST_INTERVAL |
300 |
Synchronisationsintervall in Sekunden |
EXTERNAL_WHITELIST_CACHE_DIR |
/var/lib/adguard-shield/external-whitelist |
Cache-Verzeichnis |
Beispiel
Listenformat
Mehrere Listen
Verhalten
- Hostnamen werden per DNS aufgelöst und als IPs in SQLite gespeichert.
- Aufgelöste IPs werden bei jedem Sync aktualisiert.
- Bereits aktive Sperren werden aufgehoben, wenn die IP in der Whitelist auftaucht.
- Kommentare (
#) und Inline-Kommentare werden unterstützt.
Externe Blocklist
| Parameter |
Standard |
Beschreibung |
EXTERNAL_BLOCKLIST_ENABLED |
false |
Externe Blocklist aktivieren |
EXTERNAL_BLOCKLIST_URLS |
leer |
Kommagetrennte URLs |
EXTERNAL_BLOCKLIST_INTERVAL |
300 |
Synchronisationsintervall in Sekunden |
EXTERNAL_BLOCKLIST_BAN_DURATION |
0 |
Sperrdauer in Sekunden (0 = permanent bis IP aus Liste entfernt) |
EXTERNAL_BLOCKLIST_AUTO_UNBAN |
true |
IPs freigeben, wenn sie nicht mehr in der Liste stehen |
EXTERNAL_BLOCKLIST_NOTIFY |
false |
Benachrichtigungen für Blocklist-Sperren senden |
EXTERNAL_BLOCKLIST_CACHE_DIR |
/var/lib/adguard-shield/external-blocklist |
Cache-Verzeichnis |
Beispiel
Unterstützte Listenformate
| Format |
Beispiel |
| IPv4 |
203.0.113.50 |
| IPv4-CIDR |
198.51.100.0/24 |
| IPv6 |
2001:db8::1 |
| IPv6-CIDR |
2001:db8::/32 |
| Hostname |
bad.example.com |
| Hosts-Format |
0.0.0.0 bad.example.com |
| Kommentar |
# Text |
| Inline-Kommentar |
203.0.113.50 # Grund |
Ignorierte Einträge
- URLs wie
https://...
- IP:Port wie
203.0.113.50:8443
- Hostnamen ohne Punkt oder mit ungültigen Zeichen
- Nicht auflösbare Hostnamen
- Blocking-Antworten wie
0.0.0.0 oder ::
Hinweise
- Große Listen können viele Sperren erzeugen.
EXTERNAL_BLOCKLIST_NOTIFY=false ist deshalb der sichere Standard.
- Hostnamen mit mehreren IPs: Alle aufgelösten IPs werden verarbeitet.
- IPs aus der Whitelist werden nicht gesperrt.
- Bei
EXTERNAL_BLOCKLIST_AUTO_UNBAN=true werden entfernte Einträge automatisch wieder freigegeben.
Dateiformat-Empfehlungen
- UTF-8 ohne BOM
- Unix-Zeilenenden (
LF)
- IP-Listen und Hostname-Listen möglichst getrennt pflegen
AbuseIPDB
| Parameter |
Standard |
Beschreibung |
ABUSEIPDB_ENABLED |
false |
AbuseIPDB-Reporting aktivieren |
ABUSEIPDB_API_KEY |
leer |
API-Key von abuseipdb.com |
ABUSEIPDB_CATEGORIES |
4 |
Kategorien, kommagetrennt (siehe abuseipdb.com/categories) |
Beispiel
Was gemeldet wird
| Wird gemeldet |
Wird nicht gemeldet |
| Watchlist-Treffer (permanent) |
Temporäre Sperren |
| Progressive-Ban auf Maximalstufe (permanent) |
GeoIP-Sperren |
|
Externe Blocklist-Sperren |
|
Manuelle Sperren |
GeoIP-Länderfilter
| Parameter |
Standard |
Beschreibung |
GEOIP_ENABLED |
false |
GeoIP-Filter aktivieren |
GEOIP_MODE |
blocklist |
Filtermodus |
GEOIP_COUNTRIES |
leer |
Ländercodes nach ISO 3166-1 Alpha-2 |
GEOIP_CHECK_INTERVAL |
0 |
Legacy-Parameter (Go-Version nutzt den zentralen Poller) |
GEOIP_NOTIFY |
true |
Benachrichtigungen bei GeoIP-Sperren senden |
GEOIP_SKIP_PRIVATE |
true |
Private/lokale IPs überspringen |
GEOIP_LICENSE_KEY |
leer |
MaxMind-License-Key für automatischen Download |
GEOIP_MMDB_PATH |
leer |
Manueller Pfad zur MaxMind-MMDB-Datei (hat Vorrang) |
GEOIP_CACHE_TTL |
86400 |
GeoIP-Cache-Dauer in Sekunden (Standard: 24 Stunden) |
Modi
| Modus |
Beschreibung |
blocklist |
Nur die genannten Länder werden gesperrt. Alle anderen sind erlaubt. |
allowlist |
Nur die genannten Länder sind erlaubt. Alle anderen öffentlichen IPs werden gesperrt. |
Ländercodes
Die Ländercodes folgen dem Standard ISO 3166-1 Alpha-2. Eine vollständige Liste aller Ländercodes findest du in der ISO-3166-1-Kodierliste auf Wikipedia.
Häufig verwendete Codes:
| Code |
Land |
|
Code |
Land |
DE |
Deutschland |
|
CN |
China |
AT |
Österreich |
|
RU |
Russland |
CH |
Schweiz |
|
KP |
Nordkorea |
US |
Vereinigte Staaten |
|
IR |
Iran |
GB |
Vereinigtes Königreich |
|
BR |
Brasilien |
FR |
Frankreich |
|
IN |
Indien |
NL |
Niederlande |
|
VN |
Vietnam |
Beispiel: Blocklist-Modus
Damit werden öffentliche DNS-Clients aus China, Russland, Nordkorea und dem Iran gesperrt.
Beispiel: Allowlist-Modus
Damit werden nur Clients aus Deutschland, Österreich und der Schweiz erlaubt. Alle anderen öffentlichen Länder werden gesperrt.
Private IPs
Damit werden folgende Adressbereiche übersprungen:
- Private Netze (10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16)
- Loopback (127.0.0.0/8, ::1)
- Link-Local (169.254.0.0/16, fe80::/10)
- CGNAT (100.64.0.0/10)
GeoIP-Datenquellen
| Priorität |
Quelle |
Konfiguration |
| 1 |
Manueller MMDB-Pfad |
GEOIP_MMDB_PATH="/usr/share/GeoIP/GeoLite2-Country.mmdb" |
| 2 |
Automatischer MaxMind-Download |
GEOIP_LICENSE_KEY="dein_maxmind_license_key" |
| 3 |
Legacy-Fallback |
geoiplookup / geoiplookup6 Systembefehle |
Automatischer MaxMind-Download
Die Datenbank wird unter /opt/adguard-shield/geoip/ gespeichert und nach 24 Stunden automatisch erneuert.
GeoIP-Befehle
Protokollerkennung
AdGuard Shield liest das Feld client_proto aus der AdGuard-Home-API und zeigt das verwendete DNS-Protokoll an.
| API-Wert |
Anzeige |
Bedeutung |
leer oder dns |
DNS |
Klassisches DNS |
doh |
DoH |
DNS-over-HTTPS |
dot |
DoT |
DNS-over-TLS |
doq |
DoQ |
DNS-over-QUIC |
dnscrypt |
DNSCrypt |
DNSCrypt-Protokoll |
Die Sperre blockiert immer alle konfigurierten Ports, unabhängig davon, welches Protokoll den Verstoß ausgelöst hat.
Beispielkonfiguration: Heimnetz
Beispielkonfiguration: Öffentlicher Resolver
Vor produktiver Aktivierung