dns-watch/README.md
2025-08-19 00:28:11 +02:00

196 lines
4.9 KiB
Markdown

# 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**
- 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. über `mailutils` oder `msmtp-mta` (nur nötig, wenn Mail genutzt wird)
---
## Installation
1) 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
2) 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` oder `NTFY_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` oder `msmtp-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
<p align="center">
<img src="https://assets.techniverse.net/f1/git/graphics/gray0-catonline.svg" alt="">
</p>
<p align="center">
<img src="https://assets.techniverse.net/f1/logos/small/license.png" alt="License" width="15" height="15"> <a href="./dns-watch/src/branch/main/LICENSE">License</a> | <img src="https://assets.techniverse.net/f1/logos/small/matrix2.svg" alt="Matrix" width="15" height="15"> <a href="https://matrix.to/#/#community:techniverse.net">Matrix</a> | <img src="https://assets.techniverse.net/f1/logos/small/mastodon2.svg" alt="Matrix" width="15" height="15"> <a href="https://social.techniverse.net/@donnerwolke">Mastodon</a>
</p>