DNS-Verwaltung mit
NetBox DNS

GUUG-Frühjahrsfachgespräch 5. März 2026, Nürnberg

Peter Eckel

  • Beginn der "Hackerkarriere" Anfang der 80er-Jahre

  • Studium der Mathematik und Informatik

  • Seit 1994 freiberuflich tätig

  • Schwerpunkt auf freier und Open Source-Software

NetBox

Dazu hat Michael ja schon alles gesagt.

NetBox DNS

Kundenauftrag: "Wir brauchen ein GUI für DNS!"

Die Lösung: NetBox

  • Nur sehr rudimentärer Support für DNS

  • Sehr weitreichende Unterstützung für Plugins

Historie

  • Ab Ende 2021 zunächst Beiträge zu einem existierenden Projekt

  • Seit 2023 als eigener Fork

  • Seit März 2026 unter dem Dach von sys4

NetBox DNS 2026

  • Nameserver

  • Views

  • Zonen

  • Records

  • Zonen- und Recordtemplates

  • IPAM-Integration

  • Registrierungsinformationen

  • DNSSEC-Policies

NetBox DNS-Ökosystem

Grundlegende Funktionen

  • Automatische Verwaltung von SOA und NS-Records

  • Automatische Verwaltung von PTR-Records

  • Eingabevalidierung für Zonennamen und Namen und Werten für Records

  • Unterstützung von IDNs

  • NetBox REST- und GraphQL-API

  • Lokalisierung (neben Englisch derzeit Deutsch und Französisch)

Live Demo

zones
zone detail
zone records
zone managed records
address record
ptr record

Templates

Eine neue Zone anzulegen ist einfach:

  • Nameserver

  • SOA MNAME

  • SOA RNAME

  • MX-Record

  • SPF-Record

  • …​

Zehn neue Zonen anzulegen ist lästig.

Hundert neue Zonen …​ lieber nicht.

Zone Templates und Record Templates

Zone Templates enthalten Attribute, die immer wieder benötigt werden, wie SOA-Felder und Nameserver.

Record Templates sind Records ohne Zoneninformation, die Zone Templates zugewiesen werden.

Live Demo

zone templates
zone template detail
add zone with template
zone with template
zone records with template

IPAM DNSsync

NetBox enthält ein leistungsfähiges IPAM, das sich mit NetBox DNS integrieren läßt.

Dies erfolgt durch Zuweisung von IPAM-Prefixen an DNS-Zonen, alles weitere passiert automatisch.

Zuweisungslogik

  1. Eine IP-Adresse wird im IPAM angelegt oder modifiziert

  2. IPAM DNSsync durchsucht die Prefix-Hierarchie der Adresse nach einem Prefix, dem ein DNS-View zugewiesen ist

  3. Wenn es in diesem View eine zum DNS-Namen der Adresse passende Zone gibt, wird ein Adreßrecord darin angelegt

Mehrere Views pro Prefix sind möglich, dann werden ggf. mehrere Records angelegt.

Live Demo

view with prefix
prefix with view
add ip address
ip addresses
ip address with records

Provisionierung

NetBox DNS ist kein DNS-Server!

NetBox BIND Provisioner

NetBox BIND Provisioner ist eine schlanke und elegante Provisionierungslösung von Sven Lüthi.

  • DNS-Server für AXFR-Requests als NetBox-Plugin

  • Basierend auf NetBox DNS-Daten

  • Pro NetBox DNS-View:

    • eine Catalog Zone

    • ein TSIG-Key in der Konfiguration

Trotz des Namens ist NetBox BIND Provisioner nicht auf BIND als Nameserver beschränkt!

netbox dns bind provisioner

Plugin-Konfiguration

<<<<<<< HEAD
PLUGINS_CONFIG = {
    'netbox_plugin_bind_provisioner': {
        'tsig_keys': {
            'internal': {
                'keyname': 'view-internal',
                'algorithm': 'hmac-sha256',
                'secret': 'Yv8R1M4RjrytsXxyH7xQEAZ/HEk+RImyQrgFreXebZs=',
            },
            'external': {
                'keyname': 'view-external',
                'algorithm': 'hmac-sha256',
                'secret': 'wHJwO2QM/TKkuKe0XcyWiOVROrouJu/dJipsSlkeqKs=',
            },
        }
    },
}

BIND-Konfiguration

key "view-internal" {
    algorithm hmac-sha256;
    secret "Yv8R1M4RjrytsXxyH7xQEAZ/HEk+RImyQrgFreXebZs=";
};

view "internal" {
    match-clients {
        internal;
    };

    [...]
};

BIND-Konfiguration (Fortsetzung)

view "internal" {
    [...]

    zone "catz" {
        type secondary;
        primaries { 127.0.0.1 port 5354 key "view-internal"; };
        file "/var/named/slaves/catz_internal";
        notify no;
    };

    catalog-zones {
        zone "catz"
        default-primaries { 127.0.0.1 port 5354 key "view-internal"; }
        zone-directory "/var/named/slaves"
        min-update-interval 1;
    };

    [...]
};

Aktualisierung der Zonen nach Änderungen

NetBox BIND Provisioner kann derzeit kein NOTIFY versenden, daher muß die Benachrichtigung über Zonenänderungen eventgesteuert von NetBox aus erfolgen.

Hierzu kann ein Custom Script dienen.

Beispiel-Script

import subprocess

from extras.scripts import Script

class RetransferZone(Script):
    def run(self, data, commit):

        if "zone" in data:
            zone = data.get("zone")
            zone_name = zone.get("name")
            view = zone.get("view")
            view_name = view.get("name")

        else:
            zone_name = "catz"
            view = data.get("view")
            view_name = view.get("name")

        self.log_info(f"Requesting retransmit for zone {zone_name} in view {view_name}")

        subprocess.run(["/sbin/rndc", "retransfer", zone_name, "IN", view_name])

Live Demo

(netbox) [root@dns netbox]# dig @localhost guug.example.com SOA

; <<>> DiG 9.16.23-RH <<>> @localhost guug.example.com SOA
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 44464
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 920d3d273d7881ba010000006990726ca890d55ed6a60fa1 (good)
;; QUESTION SECTION:
;guug.example.com.		IN	SOA

;; Query time: 6 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sat Feb 14 13:02:36 UTC 2026
;; MSG SIZE  rcvd: 73
add guug zone
(netbox) [root@dns netbox]# dig @localhost guug.example.com SOA

; <<>> DiG 9.16.23-RH <<>> @localhost guug.example.com SOA
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28929
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: aafa0adaacaff99c01000000699072e55da9faf2dc411472 (good)
;; QUESTION SECTION:
;guug.example.com.		IN	SOA

;; ANSWER SECTION:
guug.example.com.	86400	IN	SOA	ns1.example.com. hostmaster.example.com. 1771074272 43200 7200 2419200 3600

;; Query time: 3 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sat Feb 14 13:04:37 UTC 2026
;; MSG SIZE  rcvd: 124
add guug record
guug record
(netbox) [root@dns netbox]# dig @localhost nürnberg.guug.example.com aaaa

; <<>> DiG 9.16.23-RH <<>> @localhost nürnberg.guug.example.com aaaa
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42834
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
; COOKIE: 2d6fa092ab1a9f4001000000699075761550afe12a2e6524 (good)
;; QUESTION SECTION:
;nürnberg.guug.example.com.	IN	AAAA

;; ANSWER SECTION:
nürnberg.guug.example.com. 86400 IN	AAAA	2001:db8:1::42

;; Query time: 4 msec
;; SERVER: ::1#53(::1)
;; WHEN: Sat Feb 14 13:15:34 UTC 2026
;; MSG SIZE  rcvd: 117