############################################################################### # AdGuard Shield - Konfigurationsdatei # Schutz vor übermäßigen DNS-Anfragen einzelner Clients ############################################################################### # --- AdGuard Home API Einstellungen --- # URL der AdGuard Home Web-Oberfläche (ohne trailing slash) ADGUARD_URL="https://dns1.domain.com" # AdGuard Home Zugangsdaten (Web-UI Login) ADGUARD_USER="admin" ADGUARD_PASS='changeme' # --- Rate-Limit Einstellungen --- # Maximale Anfragen pro Domain pro Client innerhalb des Zeitfensters RATE_LIMIT_MAX_REQUESTS=30 # Zeitfenster in Sekunden (60 = 1 Minute) RATE_LIMIT_WINDOW=60 # Wie oft das Script die Logs prüft (in Sekunden) CHECK_INTERVAL=10 # --- Subdomain-Flood-Erkennung (Random Subdomain Attack) --- # Erkennt Bots/Clients die massenhaft zufällige Subdomains einer Domain abfragen # Beispiel: abc123.microsoft.com, xyz456.microsoft.com, ... # Dabei wird pro Client gezählt, wie viele EINDEUTIGE Subdomains einer # Basisdomain (z.B. microsoft.com) im Zeitfenster aufgerufen werden. # Subdomain-Flood-Erkennung aktivieren SUBDOMAIN_FLOOD_ENABLED=true # Maximale Anzahl eindeutiger Subdomains pro Basisdomain pro Client im Zeitfenster # Beispiel: 50 = ein Client darf max. 50 verschiedene Subdomains von microsoft.com abfragen SUBDOMAIN_FLOOD_MAX_UNIQUE=50 # Zeitfenster in Sekunden für die Subdomain-Flood-Erkennung (60 = 1 Minute) SUBDOMAIN_FLOOD_WINDOW=60 # --- Sperr-Einstellungen --- # Wie lange ein Client gesperrt wird (in Sekunden, 3600 = 1 Stunde) BAN_DURATION=3600 # iptables Chain-Name für die Sperren IPTABLES_CHAIN="ADGUARD_SHIELD" # Welche Ports gesperrt werden sollen (IPv4 + IPv6) # Port 53 = DNS (UDP + TCP) # Port 443 = DNS-over-HTTPS (DoH) # Port 853 = DNS-over-TLS (tls://...:853) / DNS-over-QUIC (quic://...:853) # Hinweis: Das verwendete Protokoll (DNS/DoH/DoT/DoQ) wird automatisch # aus der AdGuard Home API erkannt und in Logs/History angezeigt. BLOCKED_PORTS="53 443 853" # --- Whitelist --- # IP-Adressen die NIEMALS gesperrt werden (kommagetrennt) # Lokale Netze und wichtige Server hier eintragen WHITELIST="127.0.0.1,::1" # --- Logging --- # Log-Datei Pfad LOG_FILE="/var/log/adguard-shield.log" # Log-Level: DEBUG, INFO, WARN, ERROR LOG_LEVEL="INFO" # Maximale Größe der Log-Datei in MB (danach wird rotiert) LOG_MAX_SIZE_MB=50 # Ban-History Datei (protokolliert alle Sperren & Entsperrungen dauerhaft) BAN_HISTORY_FILE="/var/log/adguard-shield-bans.log" # Maximale Aufbewahrungsdauer der Ban-History in Tagen # 0 = unbegrenzt (niemals automatisch löschen) # Beispiel: 90 = Einträge älter als 90 Tage werden beim nächsten Report entfernt BAN_HISTORY_RETENTION_DAYS=0 # --- Benachrichtigungen (optional) --- # Aktiviert Benachrichtigungen bei Sperren/Entsperrungen NOTIFY_ENABLED=false # Benachrichtigungs-Typ: "ntfy", "discord", "slack", "gotify", "generic" NOTIFY_TYPE="ntfy" # Webhook-URL (nur für discord, slack, gotify, generic – bei ntfy nicht nötig) # Discord: https://discord.com/api/webhooks/xxx/yyy # Gotify: https://gotify.example.com/message?token=xxx NOTIFY_WEBHOOK_URL="" # --- Ntfy Einstellungen (nur bei NOTIFY_TYPE="ntfy") --- # Server-URL der Ntfy-Instanz (ohne trailing slash) NTFY_SERVER_URL="https://ntfy.sh" # Topic-Name für die Benachrichtigungen NTFY_TOPIC="" # Optionaler Access-Token (leer lassen wenn nicht benötigt) NTFY_TOKEN="" # Priorität der Ntfy-Nachrichten (1=min, 3=default, 5=max) NTFY_PRIORITY="4" # --- E-Mail Report (optional) --- # Regelmäßiger Statistik-Report per E-Mail # Voraussetzung: Ein funktionierender Mail-Transport (z.B. msmtp) # Anleitung für msmtp: https://www.cleveradmin.de/blog/2024/12/linux-einfach-emails-versenden-mit-msmtp/ REPORT_ENABLED=false # Report-Intervall: "daily", "weekly", "biweekly", "monthly" # daily = täglich um die konfigurierte Uhrzeit # weekly = wöchentlich am Montag # biweekly = alle zwei Wochen am Montag # monthly = monatlich am 1. des Monats REPORT_INTERVAL="weekly" # Uhrzeit für den Report-Versand (Format: HH:MM, 24h) REPORT_TIME="08:00" # E-Mail-Empfänger REPORT_EMAIL_TO="admin@example.com" # E-Mail-Absender REPORT_EMAIL_FROM="adguard-shield@example.com" # E-Mail-Format: "html" oder "txt" REPORT_FORMAT="html" # Mail-Befehl (z.B. "msmtp", "sendmail", "mail") REPORT_MAIL_CMD="msmtp" # Zeitraum für "Aktivster Tag" im Report (in Tagen) # Bestimmt, über wie viele Tage zurück der aktivste Tag ermittelt wird. # 30 = Aktivster Tag der letzten 30 Tage (empfohlen) # 0 = Nur innerhalb des Berichtszeitraums (altes Verhalten) REPORT_BUSIEST_DAY_RANGE=30 # --- Externe Whitelist (optional) --- # Ermöglicht das Einbinden externer Whitelist-Dateien mit Domains/IPs. # Domains werden regelmäßig per DNS aufgelöst (ideal für dynamische IPs/DynDNS). EXTERNAL_WHITELIST_ENABLED=false # URL(s) zu externen Textdateien mit Domains/IPs (eine pro Zeile) # Mehrere URLs kommagetrennt angeben # Beispiel: "https://example.com/whitelist.txt,https://other.com/trusted-hosts.txt" EXTERNAL_WHITELIST_URLS="" # Wie oft die externe Whitelist geprüft und Domains neu aufgelöst werden (in Sekunden, 300 = 5 Minuten) # Kürzere Intervalle empfohlen bei vielen DynDNS-Einträgen EXTERNAL_WHITELIST_INTERVAL=300 # --- Externe Blocklist (optional) --- # Aktiviert den externen Blocklist-Worker EXTERNAL_BLOCKLIST_ENABLED=false # URL(s) zu externen Textdateien mit IP-Adressen (eine IP pro Zeile) # Mehrere URLs kommagetrennt angeben # Beispiel: "https://example.com/blocklist.txt,https://other.com/bad-ips.txt" EXTERNAL_BLOCKLIST_URLS="" # Wie oft die externe Blocklist geprüft wird (in Sekunden, 300 = 5 Minuten) EXTERNAL_BLOCKLIST_INTERVAL=300 # Sperrdauer für externe Blocklist-IPs in Sekunden (0 = permanent bis IP aus Liste entfernt) EXTERNAL_BLOCKLIST_BAN_DURATION=0 # Automatisch IPs entsperren die aus der externen Liste entfernt wurden? EXTERNAL_BLOCKLIST_AUTO_UNBAN=true # Benachrichtigungen bei Blocklist-Sperren senden? # Bei Listen mit vielen IPs empfiehlt sich false, da sonst beim Sync # hunderte Benachrichtigungen auf einmal verschickt werden. EXTERNAL_BLOCKLIST_NOTIFY=false # Lokaler Cache-Pfad für die heruntergeladene Blocklist EXTERNAL_BLOCKLIST_CACHE_DIR="/var/lib/adguard-shield/external-blocklist" # --- Progressive Sperren (Recidive) --- # Wiederholungstäter werden stufenweise länger gesperrt (wie bei fail2ban) # Aktiviert das progressive Sperrsystem PROGRESSIVE_BAN_ENABLED=true # Multiplikator pro Wiederholung (2 = Verdopplung der Sperrdauer) # Stufe 1: BAN_DURATION × 1 (Standard-Sperrdauer) # Stufe 2: BAN_DURATION × 2 # Stufe 3: BAN_DURATION × 4 # Stufe 4: BAN_DURATION × 8 ... usw. PROGRESSIVE_BAN_MULTIPLIER=2 # Ab dieser Stufe wird die IP permanent gesperrt (0 = nie permanent sperren) # Beispiel: 5 = nach dem 5. Vergehen wird die IP dauerhaft gesperrt PROGRESSIVE_BAN_MAX_LEVEL=5 # Nach wie vielen Sekunden ohne erneutes Vergehen wird der Zähler zurückgesetzt # (86400 = 24 Stunden, 604800 = 7 Tage) PROGRESSIVE_BAN_RESET_AFTER=86400 # --- AbuseIPDB Reporting (optional) --- # Meldet permanent gesperrte IPs automatisch an AbuseIPDB # Nur bei PERMANENTEN Sperren wird ein Report gesendet. ABUSEIPDB_ENABLED=false # AbuseIPDB API-Key (https://www.abuseipdb.com/account/api) ABUSEIPDB_API_KEY="" # Kategorien für den Report (kommagetrennt) # 4 = DDoS Attack # Siehe: https://www.abuseipdb.com/categories ABUSEIPDB_CATEGORIES="4" # --- GeoIP-basierte Länderfilter (optional) --- # Sperrt oder erlaubt DNS-Anfragen basierend auf dem Herkunftsland der Client-IP. # Alle Lookups erfolgen LOKAL über eine Datenbank – es werden keine Online-API-Calls gemacht. # # Einfachster Weg (empfohlen): # sudo apt install geoip-bin geoip-database # → Damit funktioniert GeoIP sofort, ohne Account oder API-Key. # # Für genauere/aktuellere Daten (optional): # Kostenlosen MaxMind-Account erstellen (https://www.maxmind.com/en/geolite2/signup) # und License-Key unter GEOIP_LICENSE_KEY eintragen. Die GeoLite2-Datenbank # wird dann automatisch heruntergeladen und alle 24 Stunden aktualisiert. # Alternativ kann ein bereits vorhandener DB-Pfad über GEOIP_MMDB_PATH angegeben werden. GEOIP_ENABLED=false # Modus: "blocklist" = nur gelistete Länder sperren # "allowlist" = nur gelistete Länder erlauben (alle anderen werden gesperrt) GEOIP_MODE="blocklist" # Kommagetrennte Liste von ISO 3166-1 Alpha-2 Ländercodes # Blocklist-Modus: Diese Länder werden gesperrt # Allowlist-Modus: NUR diese Länder werden erlaubt (Rest wird gesperrt) # Beispiel: "CN,RU,KP,IR" oder "DE,AT,CH" GEOIP_COUNTRIES="" # Wie oft die GeoIP-Prüfung durchgeführt wird (in Sekunden, 0 = bei jedem Check-Intervall) # Empfohlen: Gleicher Wert wie CHECK_INTERVAL oder höher GEOIP_CHECK_INTERVAL=0 # Benachrichtigungen bei GeoIP-Sperren senden? GEOIP_NOTIFY=true # Lokale IPs und private Netze von GeoIP-Prüfung ausnehmen (empfohlen: true) GEOIP_SKIP_PRIVATE=true # MaxMind GeoLite2 License-Key (optional, für automatischen Download & Update) # Kostenloser Account: https://www.maxmind.com/en/geolite2/signup # License-Key erstellen: Account → Manage License Keys → Generate New License Key # Wenn gesetzt, wird die GeoLite2-Country-Datenbank automatisch heruntergeladen # und alle 24 Stunden aktualisiert. Die DB wird lokal gespeichert unter: # /geoip/GeoLite2-Country.mmdb GEOIP_LICENSE_KEY="" # Pfad zur MaxMind GeoLite2 .mmdb-Datenbank (optional) # Wenn leer UND GEOIP_LICENSE_KEY gesetzt → automatischer Download (s.o.) # Wenn leer UND GEOIP_LICENSE_KEY leer → Fallback auf geoiplookup (apt install geoip-bin) # Wenn gesetzt → diese Datei wird direkt verwendet (kein automatischer Download) # Beispiel: "/usr/share/GeoIP/GeoLite2-Country.mmdb" GEOIP_MMDB_PATH="" # --- Erweiterte Einstellungen --- # Pfad zur State-Datei (speichert aktive Sperren) STATE_DIR="/var/lib/adguard-shield" # Pfad zum PID-File PID_FILE="/var/run/adguard-shield.pid" # Anzahl der API-Einträge die pro Abfrage geholt werden (max 5000) API_QUERY_LIMIT=500 # Dry-Run Modus: true = nur loggen, nicht sperren (zum Testen) DRY_RUN=false