4.9 KiB
DNS-Watch
Ein Bash-Skript zur Überwachung von DNS-Einträgen (A/AAAA-Records) für definierte Hosts. Bei Änderungen werden Benachrichtigungen per E-Mail und/oder ntfy ausgelöst. Beide Benachrichtigungen sind als Funktionen implementiert und können separat aktiviert/deaktiviert werden.
Features
- Überwachung beliebiger Hosts/Subdomains
- Record-Typen: A und AAAA (konfigurierbar)
- Speicherung des letzten Zustands (Dateien je Host/Typ)
- Benachrichtigungen:
- Mail (konfigurierbar; nutzt ein
mail
-Binary) - ntfy mit Bearer-Token-Auth
- Mail (konfigurierbar; nutzt ein
- Optionales Logging und Lockfile gegen Parallelstarts
- Eigener DNS-Resolver optional (z. B. 1.1.1.1)
Voraussetzungen
bash
(>= 4.0)dig
(Paket:dnsutils
bzw.bind9-dnsutils
)curl
(für ntfy)mail
-Binary, z. B. übermailutils
odermsmtp-mta
(nur nötig, wenn Mail genutzt wird)
Installation
-
Skript ablegen und ausführbar machen:
sudo cp dns-watch.sh /usr/local/bin/dns-watch.sh sudo chmod +x /usr/local/bin/dns-watch.sh
-
Optional: Verzeichnisse für State und Log vorab anlegen (werden sonst beim ersten Lauf erstellt):
sudo mkdir -p /var/lib/dns-watch sudo mkdir -p /var/log && sudo touch /var/log/dns-watch.log
Konfiguration
Öffne den Kopfbereich der Datei dns-watch.sh
und passe die Variablen an:
-
Hosts (Beispiele):
HOSTS=( "domain.com" "sub.domain.com" )
-
Record-Typen:
RECORD_TYPES=("A" "AAAA")
-
Optionaler Resolver:
DNS_RESOLVER="1.1.1.1" # leer lassen für System-Resolver
-
State/Log:
STATE_DIR="/var/lib/dns-watch" LOG_FILE="/var/log/dns-watch.log" # leer lassen, um nur stdout zu nutzen
-
Mail:
MAIL_ENABLED=true MAIL_TO="mail@domain.com" MAIL_FROM="noreply@domain.com" MAIL_SUBJECT_PREFIX="[DNS-Watch]" MAIL_BIN="/usr/bin/mail"
-
ntfy:
NTFY_ENABLED=true NTFY_SERVER="https://ntfy.sh" NTFY_TOPIC="dns-watch" NTFY_TOKEN="DEIN_NTFY_BEARER_TOKEN" NTFY_TITLE_PREFIX="[DNS-Watch]" NTFY_PRIORITY="default" # min | low | default | high | max NTFY_TAGS="satellite,dns"
Hinweis: Setze
MAIL_ENABLED=false
oderNTFY_ENABLED=false
, um einzelne Kanäle zu deaktivieren.
Test
Manueller Testlauf:
/usr/local/bin/dns-watch.sh
Beim ersten Lauf wird bewusst eine Änderung erzeugt (da noch kein Altzustand existiert) und direkt eine Test-Benachrichtigung versendet.
Automatisierung
Cron
Alle 10 Minuten prüfen:
*/10 * * * * /usr/local/bin/dns-watch.sh
Systemd (optional)
Dienstdatei /etc/systemd/system/dns-watch.service
:
[Unit]
Description=DNS Watch - monitor DNS record changes
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/dns-watch.sh
Nice=5
Timer /etc/systemd/system/dns-watch.timer
:
[Unit]
Description=Run DNS Watch every 10 minutes
[Timer]
OnBootSec=2m
OnUnitActiveSec=10m
AccuracySec=1m
Unit=dns-watch.service
[Install]
WantedBy=timers.target
Aktivieren:
sudo systemctl daemon-reload
sudo systemctl enable --now dns-watch.timer
Verzeichnisse
- Zustände:
/var/lib/dns-watch/
- Logdatei (optional):
/var/log/dns-watch.log
- Lockfile:
/tmp/dns-watch.lock
Beispielausgabe
DNS-Änderung erkannt
Host: sub.domain.com
Typ: A
Zeit: 2025-08-18T12:34:56+02:00
Alt:
192.0.2.10
Neu:
192.0.2.55
Diese Meldung wird (je nach Konfiguration) per Mail und/oder ntfy verschickt.
Troubleshooting
mail: command not found
: Ein Mailer-Paket installieren (z. B.sudo apt install mailutils
odermsmtp-mta
).dig: command not found
:sudo apt install dnsutils
(oder passendes Paket für deine Distribution).- Keine Benachrichtigung per ntfy: Prüfe
NTFY_SERVER
,NTFY_TOPIC
,NTFY_TOKEN
und Netzwerkzugang. - Rechteproblem beim Schreiben in
/var/lib/dns-watch
oder/var/log/dns-watch.log
: Skript als root ausführen oder Verzeichnisse mit passenden Rechten anlegen.
Sicherheit
- Lege sensible Daten (z. B.
NTFY_TOKEN
) nach Möglichkeit nicht im Git ab. Alternativ kannst du das Skript so erweitern, dass es Tokens aus Umgebungsvariablen lädt. - Achte auf sichere Mail- und ntfy-Endpunkte.
Lizenz
MIT License