Dienstag, Juli 21, 2026

Netbox - Welche Zeitzone einstellen und zentrales Logging mit Alloy/Loki/Grafana

Das Einrichten geht viel einfacher, die Beschreibung ist im Housekeepingartikel

Das Aktualisieren der IPAM-Einträge funktioniert weiterhin gut, und ich war eigentlich gerade dabei, das erste Ansible-Playbook auszuarbeiten, als ich gedanklich auf ein weiteres Problem gestoßen bin.
Beim Zusammenspiel von NetBox, Ansible und Technitium ist es notwendig, dass alle drei Beteiligten mit der gleichen Uhrzeit arbeiten. Soweit ich aktuell weiß, ist bei allen dreien intern UTC die gültige Zeit. Mir ist schon vor ein paar Tagen aufgefallen, dass die NetBox-Logs ebenfalls mit UTC-Zeit angezeigt werden. In Technitium habe ich bereits bei der Installation vor mehr als zwei Jahren die Logs auf Lokalzeit, also UTC+2h (wegen der besseren Lesbarkeit), umgestellt. Ich persönlich glaube jedoch inzwischen, dass es besser wäre, wenn alle Dienste die Ereignisse mit UTC-Timestamps loggen würden. Die Services/Programme, mit denen man später die Logs darstellt (z. B. Grafana), können dann die Umrechnung in die jeweilige Lokalzeit übernehmen. Das ist auch von großem Vorteil, wenn man Geräte in einer anderen Zeitzone hat (in dem Fall oft auch ohne Sommerzeit). Das Logging habe ich daher in Technitium wieder auf UTC zurückgestellt.

Bildschirmfoto_20260721_180344.png

Als zentrale Datenbank für die Logs wird oft Loki/Alloy empfohlen oder der sogenannte ELK-Stack. Der ELK-Stack ist scheinbar deutlich komplexer einzurichten, wohl auch eher so ein Docker-Ding (Nachtrag: hier lag ich falsch, kann man genauso leicht installieren wie NetBox) (ich mag Docker einfach nicht), und da ich eigentlich viel lieber bei NetBox/Ansible weitermachen will, wähle ich den einfacheren Weg über Loki. Loki und Grafana gibt es bei den Community-Scripts als LXC, also muss ich mir hier wegen zukünftiger Updates keine allzu großen Sorgen machen. Ein sauberes zentrales Logging ist von größtem Vorteil zur geräteübergreifenden Fehlersuche und spätestens dann extrem zeitsparend, sobald ich anfange, andere Geräte via Ansible zu steuern. Von daher werde ich das Thema zentrales Logging hiermit vorziehen.
Ich installiere zunächst Loki und Grafana auf PVE und gebe ihnen, wie inzwischen auch dem NetBox-LXC, feste IPs. Die IPs dieser Dienste sollten sich nicht ändern können, sonst funktioniert das Zusammenspiel der einzelnen Dienste nicht mehr.
In Grafana verbinde ich zunächst das Loki-LXC als neue Datenquelle.

Bildschirmfoto_20260720_170916.png

Es reicht bereits, die IP-Adresse und den Port des LXC mit Loki anzugeben, um eine Verbindung herstellen zu können.

Bildschirmfoto_20260720_171407.png

Das muss ich natürlich später noch weiter absichern, aber zum Testen reicht es zunächst. Damit die Logs aber erst mal irgendwie in Loki “reinkommen”, brauche ich noch das Tool Alloy. Alloy empfängt Logs und/oder sammelt diese aktiv bei den hinterlegten Geräten ein und leitet sie anschließend an Loki weiter. Loki indexiert und komprimiert die Logs und regelt wohl auch das Aussortieren alter Logs. Alle drei Teile kommen vom gleichen Entwicklerteam, das sollte also gut zusammenarbeiten. Alloy ist weder Teil des Grafana-LXCs noch bei Loki dabei. Scheinbar hatten andere Leute bereits ähnliche Gedankengänge wie ich. MickLesk ist einer der Maintainer der Community-Scripts, und deswegen werde ich mich an seine Empfehlung halten. Ich hatte bereits überlegt, ob Alloy ein eigenes LXC benötigt. Erfreulicherweise ist das Nachrüsten von Alloy gar “nicht so deep”, wie man heute sagen würde. Es lässt sich mit einem simplen

apt install alloy

in dem LXC mit Loki nachinstallieren.
Bei der Installation des Loki-LXCs sind mir noch zwei weitere Punkte ins Auge gefallen. Man kann das Auswahlmenü mit

update

in der Shell des Loki-LXCs jederzeit erneut aufrufen.

Bildschirmfoto_20260720_200601.png

Ich wähle beim zweiten Durchlauf auch noch Option 2, damit alle ankommenden Adressen ihre Logs bei Alloy/Loki loswerden können. Das werde ich in Zukunft vermutlich noch einschränken - als kleiner Reminder für mich selbst.
Bis hierher war die Einrichtung noch trivial, und ich wollte das Thema eigentlich in ein bis zwei Stunden abhaken. Ich musste dann aber doch fast zwei Tage meiner Freizeit aufwenden, um die Logs von NetBox in Loki zu bekommen. Ich stelle hier meine Konfiguration vor; sie lässt sich aber bestimmt besser einrichten als in meinem Beispiel. Für mich passt es aktuell, und ich kann das Logging im Verlauf sukzessive noch weiter verbessern.
In der /etc/alloy/config.alloy des Alloy/Loki-LXCs habe ich am Ende folgenden Codeblock angehängt:

// --- Logs: Syslog-Listener ---
loki.source.syslog "central" {
  listener {
    address  = "0.0.0.0:1514"
    protocol = "tcp"
    labels   = {job = "syslog"}
  }
  forward_to = [loki.write.default.receiver]
}
loki.write "default" {
  endpoint {
    url = "http://localhost:3100/loki/api/v1/push"
  }
}

Danach den systemd-Dienst enablen mit

systemctl enable alloy

und starten mit

systemctl start alloy

.
Wie oben schon erwähnt, habe ich es zunächst nicht geschafft, die Logs von NetBox selbst über Alloy an Loki zu senden. Nach zwei Tagen des Herumprobierens meine ich, das Problem lokalisiert zu haben. NetBox ist eine Python/Django-Anwendung, und scheinbar sendet der SysLogHandler von Python keine RFC5424-konformen Logmeldungen. Alloy erwartet aber genau dieses Format und verwirft alle nicht RFC5424-konformen Nachrichten einfach. Das Problem sollte bei meinen anderen LXCs nicht auftreten, denn kein anderer meiner laufenden Services ist meines Wissens in Python geschrieben. Werde ich im Verlauf noch merken…
Jedenfalls musste ich in dem NetBox-LXC noch rsyslog nachinstallieren. rsyslog fungiert hier als Übersetzer: Es nimmt die minimale Nachricht von NetBox lokal entgegen (über /dev/log), reichert sie mit allen fehlenden Feldern an (Timestamp, Hostname, App-Name, Version) und schickt erst dann ein vollständiges, korrektes Paket weiter.

apt-get update
apt-get install -y rsyslog
systemctl enable rsyslog
systemctl start rsyslog

Damit rsyslog die NetBox-Nachrichten (Facility local0) auch tatsächlich an Alloy weiterleitet, musste ich noch eine Forward-Regel anlegen:

echo "local0.* @@<loki-lxc-ip>:1514;RSYSLOG_SyslogProtocol23Format" >> /etc/rsyslog.d/99-loki-forward.conf
systemctl restart rsyslog

Das Anhängsel ;RSYSLOG_SyslogProtocol23Format war dabei der Kern meines zweitägigen Problems: Ohne dieses Template sendet rsyslog standardmäßig im älteren RFC3164-Format, das Alloy nicht akzeptiert.
Nun muss man in dem NetBox-LXC noch die Config bezüglich des Loggings etwas anpassen. Bei mir war der Logging-Teil in der Config initial leer.

nano /opt/netbox/netbox/netbox/configuration.py

Hier folgendes beim Abschnitt Logging eintragen:

#   https://docs.djangoproject.com/en/stable/topics/logging/
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console': {
            'level': 'INFO',
            'class': 'logging.StreamHandler',
        },
        'syslog': {
            'level': 'INFO',
            'class': 'logging.handlers.SysLogHandler',
            'address': '/dev/log',
            'facility': 'local0',
        },
    },
    'loggers': {
        'netbox': {
            'handlers': ['console', 'syslog'],
            'level': 'INFO',
        },
        'django': {
            'handlers': ['console', 'syslog'],
            'level': 'WARNING',
        },
    },
}

Um sicherzugehen, dass NetBox nicht das interne Logging zugunsten der neuen externen Lösung ganz deaktiviert, habe ich sicherheitshalber beide Handler

['console', 'syslog']

in meiner Config eingetragen. Danach NetBox neu starten mit

systemctl restart netbox netbox-rq

Ich hoffe, das passt so… es scheint jedenfalls zu funktionieren. Hier noch der Screenshot einer Abfrage von Loki via Grafana.

Bildschirmfoto_20260721_211452.png

Man sieht schön die Aktivität des Dynamic IP Script aus dem vorherigen Beitrag, das momentan noch alle 30 Minuten ausgeführt wird. Grafana hat dabei auch die UTC Timestamps automatisch in die Lokalzeit umgerechnet.

Bildschirmfoto_20260721_215417-1.png

Wie man auf dem letzten Bild sieht läuft das Logging in NetBox intern weiterhin auf UTC.

Samstag, Juli 18, 2026

Netbox - DHCP Plugin + Custom Script zum Abgleich dynamischer IPs in IPAM

Das DHCP-Plugin ist zwar noch als Beta markiert, ich probiere es aber natürlich trotzdem aus 😎 Da es aktuell (noch) keine Dokumentation für das Plugin gibt, habe ich Claude den Sourcecode des Plugins auf GitHub analysieren lassen. Man kann über KIs denken, wie man will, aber als Werkzeuge zur Code- und/oder Fehleranalyse sind sie ausgezeichnet geeignet.
Da das Plugin noch in aktiver Entwicklung ist, könnten sich einige Einstellungspunkte in Zukunft ändern, daher erwähne ich die einzelnen Schritte der Einrichtung hier nicht. Claude und die meisten anderen KIs leiten einen hier aktuell gut durch, wenn man irgendwo nicht weiterkommt. Ich werde daher nur ein paar Screenshots von der Einrichtung zeigen und den Textteil irgendwann später ergänzen, wenn das Plugin nicht mehr in der Betaphase ist.

Bildschirmfoto_20260718_130902.png
Bildschirmfoto_20260718_131058.png
Bildschirmfoto_20260719_193258.png

Das Anlegen der IP-Reservierungen muss man von Hand erledigen.
Es bleibt in Bezug auf DHCP aber noch eine Sache abzudecken, und zwar den Fall, dass sich Geräte (Handys etc.) im LAN anmelden, eine dynamische IP von Technitium bekommen und später wieder (manchmal für immer) verschwinden. Das wäre z. B. in einem WLAN-Gastnetz der Fall oder wenn Endgeräte ihre MAC-Adressen rotieren (iPhones z. B.). Die entsprechenden Geräte bekommen von Technitium dynamisch per DHCP eine Adresse zugewiesen, und diese Adressen sollten irgendwie auch in NetBox auftauchen. Wenn das Lease solcher Geräte abgelaufen ist und sie wieder aus dem WLAN-Netz verschwunden sind, sollen auch die IPAM-Einträge wieder entfernt werden. Solche Geräte kann ich in NetBox nicht als Devices abbilden, denn dann müsste ich u. U. dynamisch neue Hersteller, Geräteklassen, Geräte und Schnittstellen in NetBox erzeugen lassen. Es reicht mir vollkommen, in NetBox den Hostnamen und die korrespondierende IP-Adresse des Geräts sehen zu können. Die Technitium-API bietet zum Glück die Möglichkeit, eine Liste mit allen aktuellen Leases abzufragen. Ich lege hierfür in Technitium einen neuen User mit eingeschränkten Rechten an. Für den neuen User kann man in der GUI von Technitium auch gleich noch ein API-Token erzeugen. Der API-Token wird nur einmalig angezeigt; ich lege ihn daher in meinem Passwortmanager (KeePassXC/KeePassium) ab.
Man kann die API-Abfrage nun im Browser testen mit

http://<technitium-ip>:5380/api/dhcp/leases/list?token=<api-token>

und bekommt alle aktuellen Leases angezeigt. Dabei sind vor allem die Leases mit dem Zusatz Dynamic von Interesse. Dies sind die Adressen, für die keine Reservierung vorhanden ist.
Als nächsten Schritt habe ich mit dem guten Claude ein kleines Script erstellt, das man genauso in NetBox einbinden kann wie die Scripte von Peter Eckel. Man findet es in einem GitHub-Repository, das ich in meinem Account neu angelegt habe. Evtl. werde ich dort (bei Bedarf) in Zukunft noch weitere Scripte ergänzen. Claude hat auch noch ein README erstellt, das die Einrichtung bereits sehr gut beschreibt. Damit das Script funktioniert, muss man zusätzlich ein neues Custom Field einrichten

Bildschirmfoto_20260719_121211.png

Das Script ruft bei jedem Durchlauf über die Technitium-API die Liste mit den Leases ab, filtert nur die mit “Dynamic” heraus, prüft, ob es bereits einen IPAM-Eintrag gibt, ergänzt einen fehlenden IPAM-Eintrag (inklusive Tag) und entfernt IPAM-Einträge, für die es kein korrespondierendes Lease mehr gibt. Ich habe als Intervall aktuell 30 Minuten eingestellt, werde aber vermutlich auf 15 Minuten umstellen. Das Script befindet sich noch in der Testphase, scheint aber bisher gut zu funktionieren.

Bildschirmfoto_20260719_205931.png

Technitium

Bildschirmfoto_20260719_210219.png

IPAM in NetBox
Ich lasse es mal ein paar Tage laufen und nehme noch ein paar der IP-Reservierungen bei Technitium raus, um eine schöne Rotation zu simulieren. Wenn das Script die nächsten Tage ohne Probleme sauber durchläuft und meine IPAM nicht vollmüllt, werde ich als nächsten Schritt die Steuerung von Technitium via NetBox/Semaphore (Ansible) in Angriff nehmen. Proxmox lässt sich wohl auch sehr gut über NetBox steuern, das wird dann vermutlich als nächstes Thema drankommen.

Mittwoch, Juli 15, 2026

Netbox - Einrichtung eines Tailscale Tunnels in ein entferntes Subnetz (z.B. für Zonentransfer)

Der Zonentransfer im LAN hat gut geklappt, allerdings kann ich die Zone von dem DNS-Server aus dem entfernten Subnetz (noch) nicht abrufen, da das NetBox-LXC ja keine Verbindung zum anderen Standort hat. Tailscale will ich in dem LXC mit NetBox nicht installieren, also musste ich etwas tricksen.
Ich hatte in beiden Subnetzen bereits ein eigenes LXC mit Debian 13 und Tailscale installiert. Beide LXCs fungieren am jeweiligen Standort als Tailscale Subnet Router und Exit Nodes. Gestartet wurden die beiden mit

# auf ts-subnet-standort1
tailscale up --accept-routes --advertise-exit-node --advertise-routes=192.168.2.0/24
# auf ts-subnet-standort2
tailscale up --accept-routes --advertise-exit-node --advertise-routes=192.168.3.0/24

NetBox läuft im Subnetz 192.168.2.0/24 und soll den DNS-Server mit der IP 192.168.3.2 über einen Tunnel zwischen den beiden LXCs erreichen können. Damit die IP-Pakete bei der Rückantwort von Standort 2 an Standort 1 wieder zur richtigen IP-Adresse (von NetBox) zurückgeleitet werden, braucht es noch eine Masquerading-Regel in iptables. In der Shell des TS-Subnet-Router-LXCs an Standort 2 setze ich die notwendige Regel zunächst temporär

iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE

persistent machen mit

apt install iptables-persistent -y
netfilter-persistent save

Nun muss man die ACLs in Tailscale ein bisschen ergänzen. Die beiden Geräte müssen mit der jeweiligen LAN-IP eingetragen werden, in meinem Fall muss der Teil mit hosts folgendermaßen ergänzt werden

"hosts": {
    "netbox": "192.168.2.102",
    "dns-giesing": "192.168.3.2"
}

Man muss auch noch eine neue “action” bei den Tailscale-ACLs anlegen

{
    "action": "accept",
    "src": ["netbox"],
    "dst": ["dns-giesing:*"]
}

Das Prinzip ist ziemlich cool, weil ich einfach bei hosts und der neu angelegten action weitere Geräte aus dem Subnetz von Standort 2 eintragen und so NetBox darauf Zugriff geben kann. Zu guter Letzt muss ich noch in dem NetBox-LXC die Route ins Subnetz 192.168.3.0/24 eintragen. Temporär zu Testzwecken reicht bis zum nächsten Reboot ein

ip route add 192.168.3.0/24 via 192.168.2.128

Ich habe die Route gleich fest in die /etc/network/interfaces eingetragen, diese sieht nun so bei mir aus

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp
    post-up ip route add 192.168.3.0/24 via 192.168.2.128

Die IP-Adresse 192.168.2.128 ist in dem Beispiel die IP-Adresse des LXC mit Tailscale, das bei mir zuhause als Subnet Router fungiert. Wenn alles geklappt hat, sollte man aus dem NetBox-LXC den DNS-Server am entfernten Standort anpingen können. Wie man auf dem Screenshot sieht, läuft kein Tailscale in dem NetBox-LXC.

Bildschirmfoto_20260715_163134-1.png

Den Zonentransfer muss man bei dem zweiten Technitium-Server auch erlauben, in dem Fall ebenfalls für das eigene Subnetz (192.168.3.0/24), da es für Technitium an Standort 2 so aussieht, als ob die Anfrage von dem Tailscale-LXC von Standort 2 kommt. Der Import der zweiten Zone hat somit ebenfalls ausgezeichnet geklappt.

Bildschirmfoto_20260715_171919.png

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 😂