Skip to main content

Work and Progress

netbox migration

zielserver: SLES 15 SP7, kein direkter internetzugang -> nur über proxy mit einzeln freigeschalteten adressen.

setup

  • postgresql 17 (datenbank)
  • valkey 8 (redis-kompatibel, caching/background jobs)
  • nginx (reverse proxy davor)
  • gunicorn (wsgi server für die django-app)

→ das ist die von netbox offiziell empfohlene stack-kombi für native installs (kein docker)

warum kein podman/container? hatte ich erst überlegt, aber:

  • plugins gehen über pip → bei container müsste ich bei jedem plugin ein neues image bauen
  • hätte den proxy-freigabeprozess (siehe unten) nur noch mehr belastet → native installation gewählt

python versions-ärger

server hatte schon python 3.14 drauf (SLES bringt das mit). netbox braucht offiziell min. 3.10, aber:

  • strawberry-graphql (graphql dependency von netbox) ist mit 3.14 nicht kompatibel
  • migration bricht mit laufzeitfehler in der feld-initialisierung ab

→ fix: einfach die von SLES mitgelieferte python 3.11 genommen statt 3.14. lief dann sauber durch.

lesson learned: neueste version =! automatisch die beste


proxy shit

server ist nicht air-gapped --> proxy (freischaltung durch ticket)

genehmigungsprozess:

  1. ticket an proxy-team → quellsystem, zieladresse, port 443 ohne auth
  2. weil proxy SSL terminiert: zusätzliches ticket an infosec → SSL-bypass + freischaltung für application/zip und application/gzip mime-types
    • dazu noch nen risikobogen ausfüllen (auswirkung bei nichtverfügbarkeit, alternativen geprüft etc.)

konkrete probleme die aufgetreten sind:

problem ursache fix
407 bei pip install, curl ging aber proxy-var nicht dauerhaft gesetzt / sudo killt env in /etc/environment eintragen + sudo -E nutzen
407 bei internen suse-manager repos interne adressen liefen fälschlich über externen proxy intern in no_proxy aufnehmen
podman pull auf ghcr.io scheitert trotz freigabe freigabe deckte nur registry-api ab, nicht den separaten blob-storage (pkg-containers.githubusercontent.com) extra domain nachbeantragt
netbox source code nicht über pypi verfügbar netbox gibt's nur als github release, kein pypi paket einmal extern von jemandem mit internet geladen, per datenträger über sprungserver + SynaMan reingebracht

→ takeaway: jedes neue plugin = potenziell neues ticket


installation

  • psycopg (postgres adapter) will kompilieren, braucht pg_config → fehlte, nachinstalliert: postgresql17-server-devel
  • Pillow braucht jpeg dev-header → libjpeg8-devel nachinstalliert
  • postgres/valkey wollten nicht auf localhost hören → server hat das erst auf ::1 (ipv6) aufgelöst, dienste lauschten aber nur auf ipv4 loopback → fix: überall 127.0.0.1 statt localhost in der config
  • postgres auth: ident methode ging nicht (mein domänen-user ≠ db-user netbox) → auf md5 umgestellt
  • valkey config datei war gar nicht da, musste ich selbst minimal anlegen (nur loopback)

systemd service unter netbox.service angelegt → hat ausversehen die schon vorhandene datei vom netzwerkdienst wicked überschrieben. nach neustart → server komplett weg vom netz, nur noch über physische konsole erreichbar. 🙃 → merke: bei eigenen systemd units immer eindeutige namen die nicht mit bestehenden diensten kollidieren können


plugins

dns (F1)

  • erst falsches paket installiert (netbox-dns) → passt nicht zur plugin-api von netbox 4.2, nutzt noch das alte extras.plugins modul das es nicht mehr gibt
  • richtiges paket: netbox-plugin-dns v1.2.14 → über PLUGINS aktiviert
  • microsoft-typische namen mit unterstrich (z.b. _msdcs.domain.de) sind nach RFC 1034 eigentlich nicht erlaubt → musste tolerate_underscores_in_labels setzen

octoDNS test:

  • externes tool, liest zonen aus netbox (via NetBoxDNSProvider / octodns-netbox-dns paket) und kann die an andere systeme syncen
  • testzone test.lokal angelegt (ns + a record), erfolgreich als yaml exportiert
  • nicht getestet: gegen echten microsoft-dns server, dafür hätte ich nen provider gebraucht den's für das ökosystem nicht gab + schreibzugriff auf produktive windows infra → F1 = architektur-mäßig belegt, aber nicht produktiv verifiziert

dhcp (F2) - hat einfach nicht geklappt

drei anläufe, alle gescheitert:

  1. netbox-plugin-dhcp (offiziell) → braucht netbox 4.5 + python 3.12, hab aber 4.2/3.11
  2. netbox-kea-dhcp → gibt's nicht mehr auf pypi
  3. netbox-kea-ng → installiert sich, aber migration bricht ab, weil's core.exceptions.JobFailed importiert, was's in 4.2.6 noch nicht gibt

→ fazit: DNS-plugin-ökosystem ist für die netbox version ok, DHCP ist einfach noch nicht reif genug. kein grundsätzliches "geht nicht", eher momentaufnahme.


was ich sonst noch getestet hab

  • rechte (F5): testgruppe mit constraint (tenant__name) → nur präfixe vom zugewiesenen mandanten sichtbar. funktioniert.
  • vlan (F6): gleiche VID (100) in zwei verschiedenen vlan-groups → geht problemlos. gleiche VID nochmal in derselben group → wird zurückgewiesen. genau wie erwartet.
  • custom fields (F9): 3 felder angelegt (domaene, sicherheitsbereichs_id, svn_id) auf präfix-objekte. domaene erstmal als textfeld statt choice-set, weil ich die vollständige werteliste aus infoblox nicht hatte.
  • filter/export (F8): präfixliste nach mandant/status gefiltert, als csv exportiert. läuft.
  • ldap (F7): django-auth-ldap installiert, REMOTE_AUTH_BACKEND konfiguriert, verbindungsparameter vorbereitet — aber nicht live getestet, hatte keinen service-account und keinen zugriff aufs AD. offener punkt.

datenimport

  • 572 standorte aus infoblox importiert (region/site group/site mapping)
  • 4.262 präfixe importiert, über eigenes python-skript + netbox REST API
  • standortzuordnung war nervig weil netbox numerische IDs will, infoblox hatte klartext-kurzbezeichnungen
    • direkt eindeutig zuordenbar: 63,1%
    • über zusatzmatching (kurzbezeichnung ↔ beschreibungsfeld): +17,0% → macht 80,1% insgesamt
    • rest (15,9%) ohne standort importiert, 4,1% hatten gar keine standort-id im quelldatensatz
  • encoding-ärger: teile vom datensatz waren windows-1252 statt utf-8 → umlaute in ortsnamen kaputt, musste nachbearbeiten
  • ~500 nameserver-einträge + ein paar dns-zonen mit importiert
  • nicht importiert: einzelne IP-adressen (nur die präfixe/subnetze als ganzes). infoblox hat da schätzungsweise 10.000er bis 100.000er einträge, hätte entweder direkten API-zugriff aufs produktive infoblox gebraucht oder manuellen export pro subnetz — beides nicht machbar im rahmen der arbeit.

offene punkte

  • ldap gegen echtes AD testen (braucht service-account)
  • einzelne IP-adressen importieren für vollständige skalierbarkeits-aussage
  • die ~16% unzugeordneten präfixe manuell nacharbeiten
  • DHCP nochmal probieren sobald netbox 4.5 + python 3.12 möglich ist, oder netbox labs enterprise variante anschauen (soll DHCP vorkonfiguriert für offline-betrieb haben)