Mittwoch, Juli 15, 2026

Netbox - DNS Zonentransfer von Technitium in Netbox

Nach kurzer Recherche habe ich vom Macher (Peter Eckel, besten Dank an dieser Stelle) der DNS und DHCP Plugins für Netbox diese Scripte gefunden. Als erstes will ich mit dem Script

AXFR_Importer.py

meine bestehende DNS Zone von Technitium in Netbox zu importieren. Der nächste Schritt wäre dann, die DNS Änderungen die ich zukünftig nur noch in Netbox vornehme, in die andere Richtung auf den Technitium-Server zu übertragen. Das wiederhole ich mit dem Technitium-Server am zweiten Standort und habe ab diesem Zeitpunkt hoffentlich nie wieder DNS Probleme durch Fehlkonfiguration.
In Technitium erlaube ich bei den Zone Options zunächst den Zonentransfer zu allen Geräte in meinem Subnetz.

Bildschirmfoto_20260715_121947-1.png

als nächstes muss das Script für den Import der Zone in Netbox eingefügt werden. Ich musste zuvor noch eine weitere Bibliothek (dulwich) nachinstallieren.

Bildschirmfoto_20260715_131504.png

Nun kann ich das Repository von Herrn Eckel als Datenquelle für Scripts hinzufügen,

Bildschirmfoto_20260715_131750.png

nach einem Klick auf Synchronisieren sollte keine Fehlermeldungen mehr erscheinen. Das Script kann ich nun einbinden, als Datenquelle gebe ich hier, das zuvor hinzugefügte Repo von Peter Eckel an. Als Datei wähle ich die oben erwähnte AXFR_Importer.py aus. Ich binde lieber das Repo ein, statt einfach nur die .py Datei hochzuladen (in dem Fall darauf achten, die raw Version runterzuladen) für den Fall, daß das Script irgendwann mal ein Update bekommt, kann ich die neue Version mit einem Klick direkt von Github aktualisieren.

Bildschirmfoto_20260715_131910.png

Wenn man das Script nun ausführt öffnet sich ein neues Fenster in dem ich die zu übertragende DNS Zone und die IP Adresse des korrespondierenden (Technitium-)DNS-Servers angeben muss. Die Warnung bzgl des TSIG Schlüssel kann ich ignorieren, da ich zuhause (noch) keinen solchen Schlüssel nutze. Das Script bricht beim ersten Durchlauf zunächst mit einem Fehler ab und schon sehe ich den ersten Vorteil. Das Script importiert die Zone nur, wenn dort alles korrekt eingerichtet ist. Bei mir wird bemängelt, das in meiner Zone weder der SOA noch dem NS einen FQDN hat. Ich hatte bei beiden Einträge nur den Hostname gesetzt ohne den Rest. In der Tat habe ich hier scheinbar geschlampt (easy to learn, but hard to master) und es ist sehr schön, daß der Fehler nun aufgefallen ist und umgehend bei beiden Einträgen in Technitium korrigiert werden konnte. Der nächste Versuch schlägt wieder fehl, nun wird ein inkorrekter Hostname bemängelt.

Bildschirmfoto_20260715_133338-1.png

Das ist scheinbar mein E-Golf, Volkswagen scheint genauso wie ich nicht gewusst zu haben, daß Unterstriche in DNS Namen explizit nicht erlaubt sind. Die Unterstriche werden nun umgehend in Bindestriche umgeändert. Man kann das Script scheinbar problemlos wiederkehrend aufrufen und so die Zoneneinträge regelmäßg prüfen (nope, das Script lässt sich nur einmal ausführen. Man müsste es selbst dahingehend erweitern). Aus meiner Sicht ist ein sehr großer Teil der sogenannten Netzwerkprobleme auf DNS Fehlkonfigurationen zurückzuführen und deswegen ist so ein Check Gold wert. Ein dritten Versuch ist schließlich erfolgreich

Bildschirmfoto_20260715_142133-1.png

und alle Einträge wurden scheinbar übernommen 😎

Bildschirmfoto_20260715_142243-1.png

Das ist schonmal ganz ausgezeichnet, ich werde den Beitrag noch ergänzen (z.B. PTR Einträge) sobald ich mit meinen Tests etwas weiter bin.

Netbox - Installation von Plugins

Inzwischen habe ich eines meiner beiden Subnetze manuell in Netbox eingepflegt. Das war eine ziemliche Klickerei und ich denke ich habe das Prinzip nun für alle Zeiten verinnerlicht. Bei meinem zweiten Subnetz möchte ich mir diese Arbeit nicht mehr machen, daher werde ich mal die beiden Netbox Plugins DNS & DHCP testen. Ich hoffe, daß ich damit den zweiten Technitium-Server irgendwie “automagicly” auslesen und beschreiben kann. Neulich hat mir jemand bei Discord erklärt, daß Anleitungen nur für Looser sind, daher installiere ich die beiden Plugins einfach mal und lese die Anleitung erst dann, wenn ich nicht mehr weiter komme. Das dürfte vermutlich in spätestens 15 Minuten der Fall sein. 😁
Die Installation der beiden Plugins und vermutlich aller weiteren erfordert ein bisschen Handarbeit.

Bildschirmfoto_20260715_103438.png

Da Netbox bei mir in einem Proxmox LXC läuft, kann ich die Befehle von der jeweilgen Pluginbeschreibung einfach in der Proxmox Shell des LXCs mit Netbox der Reihe nach ausführen.

Bildschirmfoto_20260715_104145.png

Wenn alles geklappt hat sollte ein neuer Reiter names DNS bei Netbox auftauchen und bei Plugins ein grüner Haken bei dem Plugin DNS auftauchen.

Bildschirmfoto_20260715_104209.png

Das Gleiche werde ich noch mit dem DHCP Plugin machen. Ich bin schon gespannt zu erfahren, ob ich die Anleitung brauchen werde.

Nachtrag: 2 Minuten, ich bin scheinbar ein Looser 😂

Dienstag, Juli 14, 2026

Netbox - Erstellen von Geräten (Devices) und Zuordnung von IP Adressen

Netbox sagt über sich selbst es könne als eine sogenannte “Single Source of Truth” fungieren. Man kann Netbox in diesem Kontext als Dokumentationswerkzeug für Geräte mit irgendeiner Art von Anschluss verstehen. Idealerweise steht dabei in Netbox die “Wahrheit” geschrieben, beispielsweise über das lokale Netzwerk und diese “Wahrheit” wird immer entsprechend an die verantworlichen Geräte/Dienste (z.B. Technitium) ausgerollt. Man kann so beispielsweise das gesamte Netzwerk in aller Ruhe vorab in Netbox planen und muss die so geplante Topologie dann nur noch an die verantwortlichen Dienste (DHCP, DNS usw.) ausrollen. Ab einer gewissen Komplexität und Größe macht so ein Vorgehen auch absolut Sinn. Dabei geht Netbox aber weit über bloße Netzwerkkonnektivität auf IP Ebene hinaus. Die Detailtiefe reicht bis zur konkreten Aderanzahl der Kabel und wenn man will sogar deren Farbe und Länge. Wie tief man gehen will kann man selbst entscheiden, passionierte Hobbybuchhalter können sich jedenfalls freuen…

Bildschirmfoto_20260714_164419.png

Netbox prüft die eingetragenen Werte dabei stets auf Plausibilität, eine IP kann bei Netbox beispielsweise nicht doppelt vergeben werden.
Was die Sache dabei aber noch wesentlich interessanter macht, ist der Umstand, dass sich Netbox via API abfragen lässt und die Daten wahlweise als CSV oder JSON (soweit ich bisher weiß) geliefert werden. Solche Abfragen kann man via Plugin dann mit Ansible Playbooks verknüpfen. Man kann aber auch externe Daten via Ansible in Netbox bringen, womit einer Automatisierung vieler Aufgaben fast keine Grenzen mehr gesetzt sind.
Es gibt z.B. bei Youtube bereits zahlreiche gute Anleitungen, die zeigen wie man in Netbox Geräte einrichtet und an selbige eine oder mehrere IP Adressen vergibt. Ich werde nur beschreiben, welche Punkte ich selbst bei Netbox verwende (die wenigsten brauchen vermutlich die volle Detailtiefe) und diesen Part auch recht kurz halten.
Bei Netbox muss man zunächst die eigene Organisation definieren. Hier ist die oberste hierarchische Ebene die Region. Wenn man ein oder mehrere VPS in einem US Rechenzentrum stehen hat, würde es bereits Sinn machen hier zwischen Deutschland und USA eine Unterscheidung zu machen. Die nächste Ebene sind für mich Standorte, hier habe ich in D aktuell zwei. Die Lokationen sind in meinem Fall die konkreten Räume an den beiden Standorten. Wenn man sich in der Hierarchie von oben nach unten durcharbeitet, hat man in der nächsten Ebenen meist die notwendigen Dinge in den Dropdown Menüs zur Auswahl. Sollte ein nowendiges (die mit *) Dropdown Menü keine Auswahl bieten, so muss man zunächst die entsprechenden Auswahlmöglichkeiten eine Ebene höher anlegen. Man braucht sich wegen den anderen Werten absolut keinen Stress machen, alles lässt sich natürlich nachträglich ändern und die Änderungen werden rekursiv überallhin übernommen.
Ähnlich verhält es sich beim Anlegen neuer Geräte. Zunächst braucht man einen Hersteller (Z.B. Apple), als nächstes braucht man einen Gerätetyp (z.B. Mac Mini M1) und eine passende Geräterolle. Geräterolle ist zwingend vorgeschrieben, da die Vorauswahl scheinbar nicht passt, habe ich zwei neue Geräterollen in bestem Denglish als “Mobile User Endgerät” (Wifi) und “Static User Endgerät” (LAN Kabel) angelegt. (Wird sich vermutlich noch zeigen, ob das so richtig/sinnvoll ist) Erst nach diesen Vorarbeiten konnte ich ein neues physisches Gerät anlegen. (Beispiel)

Bildschirmfoto_20260714_170335.png

Das neue Gerät hat mehrere Schnittstellen u.a. Wifi, LAN, USB, Bluetooth usw., in dem konkreten Beispiel gehe ich nur auf die LAN Schnittstellen ein, weitere Schnittstellen kann man bedarfsweise jederzeit auch noch nachträglich anlegen. Die neue Schnittstelle nenne ich schlicht LAN. Es kann bei den Schnittstellen durchaus mehrere namensgleiche Schnittstellen geben, unterschieden werden solche Schnittstellen dann anhand des zugeordneten physischen Gerätes und der ebenfalls zugeordneten MAC Adresse der jeweiligen Schnittstelle. Die MAC Adresse(n) bestimmter Geräte lassen sich zwar ändern (LXCs, VMs, Handies als Anti Tracking Maßnahme usw.) und sind vermutlich deswegen kein “Netbox Pflichtfeld”, ich nutze aber fast ausschließlich feste MAC Adressen und daher ist die MAC Adresse bei der Schnittstelle für mich persönlich ebenfalls ein “Pflichtfeld”. Ausserdem benötige ich die MAC Adresse später, wenn ich die IP Adressvergabe über Ansible/Netbox steuern will.

Bildschirmfoto_20260714_172818.png

Zu guter Letzt kann man über den Punkt IPAM nun beim Unterpunkt IP Adressen eine neue IP Adresse anlegen (CIDR Notation ist Pflicht) und diese mit der soeben erstellten Schnittstelle verknüpfen.

Bildschirmfoto_20260714_172955.png

Man kann einer Schnittstelle auch mehrere IP Adressen zuordnen, das benötigt man beispielsweise, wenn man auf dieser Schnittstelle zusätzlich ein VPN mit eigener IP nutzt o.ä.

Zentrale Verwaltung und Dokumentation der Netzwerkinfrastruktur mit Netbox und Ansible (TBC…)

Im Laufe der letzten Jahre ist mein “IT Fuhrpark” erheblich angewachsen. Inzwischen werkeln an zwei Standorten, die miteinander via Tailscale verbunden sind, 4 PVE-Instanzen mit knapp 40 LXCs und diversen VMs in meinen beiden Subnetzen. Eventuell kommt Ende des Jahres sogar noch ein weiteres Subnetz mit zusätzlichen physischen und virtuellen Geräten hinzu.
Aktuell nutze ich zur Dokumentation meiner Netzwerktopologie ein lokales Wiki mit diversen Tabellen, was sehr unübersichtlich ist und wegen dem rein deklarativen Charakter auch fehleranfällig. Ich musste also eine zentrale Lösung finden, die zum einen meine Netzwerktopologie besser dokumentiert/abbildet und idealerweise gleichzeitig diese Topologie auf logische Fehler prüft. Tatsächlich gibt es so etwas bereits… 😃 s. u.
Ein großer Teil der Verwaltung der PVE- und Proxmox-Backup-Server-(PBS)-Instanzen lässt sich mit dem Proxmox Data Manager konsolidieren. Die IP-Adressen-Verwaltung (IPAM) und Pflege der beiden Technitium-DNS-&-DHCP-Server ist jedoch bei so vielen physischen und virtuellen Geräten inzwischen in richtige Arbeit ausgeartet, und bei einer Fehlkonfiguration (z. B. IP versehentlich doppelt vergeben) warnt einen Technitium nicht wirklich. Man kann zwar via Ansible die Technitium-Server mit den PVE-Instanzen „zusammenbringen“, aber das ist nicht unbedingt intuitiv, und dokumentieren muss man es dann trotzdem noch irgendwo.
Nach entsprechender Recherche bin ich schließlich bei dem Duo Netbox/Ansible gelandet. Ich teste derzeit beide Tools im Zusammenspiel und weiß bereits, dass man damit sogar noch wesentlich mehr tun kann, als nur IPAM und DNS zentral zu steuern. Ich werde daher den beiden Tools demnächst diverse Beiträge widmen, um die Einrichtung und die Möglichkeiten zu dokumentieren. Da ich dabei vermutlich Fehler machen werde, sollte man wie immer bei meinen Anleitungen etwas auf der Hut sein. Für Hinweise bei Fehlern meinerseits bin ich wie immer sehr dankbar.
Netbox und Ansible gibt es erfreulicherweise bei den community-scripts.org (ehemals Proxmox Helper Scripts). Ansible ist dabei Teil des Pakets Semaphore UI, einer praktischen GUI für Ansible.
TBC…

Dienstag, Juli 7, 2026

NUT Server mit Watchdog Script auf PVE

Nachtrag 22.07.26: nut-watchdog Script gefixt, ich hatte ein “/” vergessen und noch etwas ergänzt. Ich lade alle Scripte in Zukunft bei Github hoch. Man findet die aktuellste Version hier

Ich habe für diesen Beitrag teilweise einem älteren Beitrag aus dem alten Discordchannel gefleddert. Daher liest es sich evtl etwas seltsam, entscheidend ist jedoch der Inhalt und die Lösung am Ende.

Hintergrund war, dass der NUT Server, ohne erkennbares Muster, immer wieder die USB Verbindung zur USV verloren hatte. Leider hatte ich den NUT Dienst selbst bisher nicht auf durchgehende Funktionstüchtigkeit überwacht….

Es kam in den PVE Logs diese Fehlermeldung

usbhid-ups[1558]: libusb1: Could not open any HID devices: insufficient permissions on everything

die sich fortlaufend wiederholt. Interessanterweise ließ sich das Problem mit einem simplen

systemctl restart nut-driver@usv-giesing.service

beheben. Der Fehler wurde ein paar Mal in ähnlicher Form im Proxmoxforum berichtet. Er scheint spontan gekommen und wieder verschwunden zu sein. Evtl ist eines der Kernelupdates schuld, es hat ein Jahr ohne Probleme funktioniert und bereits einen Stromausfall erfolgreich abgefangen.

Jemand im Proxmoxforum hatte den entscheidenden Hinweis:

@elvito das insufficient permissions on everything ist meist gar kein Rechteproblem, sondern ein USB-Reenumerations-Ding. Die USV meldet sich (oft nach nem Glitch am USB) mit neuer Bus-/Device-Nummer wieder an, der usbhid-ups hängt aber noch am alten Handle und kommt nicht von selbst zurück. Ein Restart vom nut-driver hilft da sofort. Manchmal kann man den Treiber per Vendor:Product-ID statt port=auto binden, aber ganz weg kriegt man das nicht immer.

Ich hatte zu Beginn der Probleme mit der USV, die Software Nutwatch in einer VM installiert. Es hat einen gewissen Charme die NUT/USV Überwachung in einer Backup- und Clonebaren VM zu haben, zum Preis des anfallenden Ressourcenverbrauchs. Das hat gut funktioniert, wer Nutwatch auch als NUT Server einsetzen will, sollte unbedingt einen API Key setzen, sonst könnte diese VM zu einem hochgefährlichen Angriffsvektor werden. Den Schlüssel kann man zB mit

openssl rand -base64 32

in einer Shell erzeugen und hier eintragen –> /etc/nutwatch/nutwatch.env danach das obligatorische

systemctl daemon-reload
systemctl restart nutwatch

Ich habe im weiteren Verlauf aber eine, zumindest aus meiner Sicht, bessere/sicherere Lösung für das Problem gefunden.

Das Paket nut muss auf PVE installiert werden, falls noch nicht bereits geschehen.

apt install nut

Zunächst habe ich sicher gestellt dass die systemd Dienste nut-monitor.service und nut-server.service bei Hängern oder Abstürzen neu gestartet werden. Das geht einfach mit einem override und somit mit systemd Bordmitteln:

systemctl edit nut-monitor.service

hier muss man an der richtigen Stelle folgendes eintragen

### Editing /etc/systemd/system/nut-monitor.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file
[Unit]
StartLimitIntervalSec=0
[Service]
Restart=on-failure
RestartSec=5s
### Edits below this comment will be discarded

genau das Gleiche auch noch bei

systemctl edit nut-server.service

und

### Editing /etc/systemd/system/nut-server.service.d/override.conf
### Anything between here and the comment below will become the contents of the drop-in file
[Unit]
StartLimitIntervalSec=0
[Service]
Restart=on-failure
RestartSec=5s
### Edits below this comment will be discarded

und systemd bekanntgeben sowie die beiden Dienste mit den overrides neu starten

systemctl daemon-reload
systemctl restart nut-monitor nut-server

man sollte den aktiven override jetzt als Drop-In im Status beider Dienste sehen

root@pve03:~# systemctl status nut-server
● nut-server.service - Network UPS Tools - power devices information server
     Loaded: loaded (/usr/lib/systemd/system/nut-server.service; enabled; preset: enabled)
    Drop-In: /etc/systemd/system/nut-server.service.d
             └─override.conf
     Active: active (running) since Wed 2026-07-08 10:19:44 CEST; 2h 27min ago

Jetzt noch ein Script anlegen, das den NUT Driver überwacht und bei Bedarf neu startet. Bei dem Script wird eine Nachricht, je nach Ereignis, per sendmail an root geschickt. Das PVE Notification System fängt solche Nachrichten ab und sendet sie an das eingestellte Ziel (meine Email Adresse in diesem Fall) weiter. Das versenden solcher Emails kann man zB mit

echo "Testinhalt" | sendmail root

testen. Nun das Script anlegen mit dem der NUT Driver überwacht werden soll, dies braucht leider ein bisschen mehr Logik.

nano /root/watchdog.sh

mit folgendem Inhalt (hier gehts zur aktuellen Version bei Github

#!/bin/bash
#
# /root/nut-watchdog.sh
set -euo pipefail
UPSNAME="usv-giesing"
HOST="localhost"
DRIVER_SERVICE="nut-driver@${UPSNAME}.service"
TIMEOUT_SEC=5
LOCKFILE="/var/run/nut-watchdog.lock"
STATEFILE="/var/run/nut-watchdog.laststart"
STATUSFILE="/var/run/nut-watchdog.status"
COOLDOWN_SEC=300
exec 9>"$LOCKFILE"
flock -n 9 || exit 0
log() {
    logger -t nut-watchdog "$1"
}
notify_pve() {
    local subject="$1"
    local body="$2"
    {
        echo "To: root"
        echo "Subject: ${subject}"
        echo
        echo "${body}"
    } | /usr/sbin/sendmail -t
}
last_status="ok"
[ -f "$STATUSFILE" ] && last_status=$(cat "$STATUSFILE") || true
mark_ok() {
    if [ "$last_status" = "fail" ]; then
        log "INFO: RECOVERY - ${UPSNAME}@${HOST} ist wieder erreichbar"
        notify_pve "NUT Watchdog: ${UPSNAME} auf $(hostname) wieder erreichbar" 
            "upsc kann ${UPSNAME}@${HOST} wieder erfolgreich abfragen. Problem ist behoben."
    fi
    echo "ok" > "$STATUSFILE"
}
mark_fail() {
    echo "fail" > "$STATUSFILE"
}
# Erster Check
if timeout "$TIMEOUT_SEC" upsc "${UPSNAME}@${HOST}" ups.status >/dev/null 2>&1; then
    mark_ok
    exit 0
fi
log "WARN: upsc konnte ${UPSNAME}@${HOST} nicht abfragen - zweiter Versuch in 5s"
sleep 5
# Zweiter Check
if timeout "$TIMEOUT_SEC" upsc "${UPSNAME}@${HOST}" ups.status >/dev/null 2>&1; then
    log "INFO: zweiter Versuch erfolgreich, kein Neustart nötig"
    mark_ok
    exit 0
fi
mark_fail
now=$(date +%s)
last=0
[ -f "$STATEFILE" ] && last=$(cat "$STATEFILE") || true
if [ $((now - last)) -lt "$COOLDOWN_SEC" ]; then
    log "ERROR: ${UPSNAME} weiterhin nicht erreichbar, Cooldown aktiv - kein erneuter Neustart"
    notify_pve "NUT Watchdog: ${UPSNAME} auf $(hostname) weiterhin down" 
        "Der Treiber ${DRIVER_SERVICE} antwortet seit dem letzten Neustart-Versuch weiterhin nicht. Cooldown aktiv, manuelle Prüfung nötig."
    exit 1
fi
log "ERROR: ${UPSNAME} antwortet nicht, starte ${DRIVER_SERVICE} neu"
systemctl restart "$DRIVER_SERVICE"
echo "$now" > "$STATEFILE"
notify_pve "NUT Watchdog: ${UPSNAME} auf $(hostname) neu gestartet" 
    "upsc konnte ${UPSNAME}@${HOST} nicht abfragen, ${DRIVER_SERVICE} wurde automatisch neu gestartet."

Man muss bei dem Script lediglich der Wert für UPSNAME anpassen. Das Script wird bei mir als cronjob alle 2 Minuten ausgeführt. Man trägt dazu einfach das Script in der crontab ein. Der NUT Driver wird nun, zumindest bei mir, zuverlässig neu gestartet. Aktuell verliert PVE ca. 2-3x/Tag die Verbindung. Ich bekomme aber nun endlich mit, wann das immer passiert und finde evtl. so raus, womit das zusammenhängt.