Einrichten eines DNS-Daemons auf Basis von ISC Bind unter Arch Linux

Bild: DNS Logo BIND1) des Internet Systems Consortium ist eine Software, die für die Ausführung der Aufgabe des DNS-Servers verantwortlich ist. Bind ist derzeit ein Standard und wird häufig in Linux-Betriebssystemen und auch in Unix verwendet.

Das Domain Name System (DNS) ist ein hierarchisches verteiltes Namenssystem für Computer, Dienste oder andere Ressourcen, die mit dem Internet oder einem privaten Netzwerk verbunden sind. DNS wurde in den beiden RFC 1034 und RFC 1035 definiert und bekam von der Internet Assigned Numbers Authority die beiden Ports 53/UDP und 53/TCP. Es verknüpft verschiedene Informationen mit Domain-Namen, die den einzelnen teilnehmenden Entitäten zugewiesen sind. Vor allem übersetzt es für Menschen verständliche Domain-Namen in numerische Kennungen, die mit Netzwerkgeräten verknüpft sind, um diese Geräte weltweit zu lokalisieren und anzusprechen.

In dem sehr ausführlichen Wikipedia-Artikel findet man eine ausführliche Beschreibung rund um den Nameserver ISC-Bind, dem u.a. weltweit am meisten eingesetzten Nameserver sowie bei den weltweiten ROOT-Nameservern. BIND 9 ist eine transparente Open-Source-Software, die unter der MPL 2.0-Lizenz lizenziert ist.

In der nachfolgenden WIKI-Artikel wollen wir uns nun eingehender mit der Installation und Konfiguration unseres ISC Bind 9 unter Arch Linux beschäftigen.

Herausforderung / Aufgabenstellung

In unserer SOHO/HomeLAB Umgebung haben wir ein folgende Zonen, für die wir eine Namensauflösung haben:

  • extern (Internet), Domainspezifisch:
    • nausch.org mit jeweils öffentlichen IP-Adressen (IPv4 und IPv6)
    • und ggf. weitere Domains
  • intern:
    • EDMZ mit privaten Adressen aus dem IPv4- und IPv6-Bereichen
    • IDMZ mit privaten Adressen aus dem IPv4- und IPv6-Bereichen
    • INTRA mit privaten Adressen aus dem IPv4- und IPv6-Bereichen

In unserer Umgebung wollen wir später dafür sorgen, dass je nachdem aus welcher Zone eine Anfrage kommt unterschiedliche Adressen genannt bekommen bzw. unter Umständen einzelne Netzbereich gar ausblenden. Werfen wir kurz einen Blick auf unsere Beispielumgebung:

Bild: symbolischer Netzwerkaufbau mit DNS-Abfragen

Wie wir auf dem Schaubild sehen, sollen bestimmte Adressen, je nachdem von welcher Stelle aus diese abgefragt werden, keine Antwort liefern. So können aus dem Internet lediglich offizielle Adressen erfragt werden, nicht jedoch für Interne Adresse aus den beiden Zonen idmz und intra sowie Anfragen aus der Zone edmz für Adressen aus der Zone intra sollen eben sowenig abfragbar sein. Nur Anfragen aus den beiden Sicherheitszonen idmz und intra sollen für alle Zonen entsprechende Antworten bekommen!

Ferner sollen Anfragen aus den beiden Schutzzonen intra und idmz, welche die offiziellen Domain nausch.org betreffen, als Antwort die „internen“ ULA aus der Zone IDMZ beinhalten, nicht aber die offiziellen GUA-Adressen!

Wir benötigen also einen primary DNS-Server, der als interner DNS-Server für ein privates Netzwerk mit den obigen Zonen agiert. Zusätzlich wollen wir auch noch definieren, wer bei einer Anfrage welche Adresse genannt bekommt. Hierzu werden wir views nutzen, die abhängig von der Stelle aus unserem Netzwerk von dem der Client eine Anfrage startet die passende IP-Adresse genannt bekommt. Ein Client von außen soll also zum Beispiel nach der Frage wie denn die AAAA Adresse von mx1.nausch.org lautet, als Antwort die Adresse 2003:a:e0d:7603:10:0:0:25 bekommen. Ein Client von Intern hingegen soll bei der gleichen Frage aber die Antwort fd00::3:10:0:0:25 bekommen. Realisieren werden wir das wie schon angeschnitten mit unterschiedlichen views für intern und extern.

Installation und Konfiguration des ISC-BIND-Servers

Dokumentation

Eine ausführliche Onlinedokumentation des ISC BIND Servers findet sich auf der entsprechenden Dokumentationsseite bei Read the Docshttps://bind9.readthedocs.io/en/latest/ .

Paketinstallation

Die Installation und Konfiguration des BIND-Servers gestaltet sich relativ einfach. Bei der Installation des BIND-Paketes verwenden wir unter Arch Linux den Paketmanager pacman.

  1. Als User:
     $ sudo pacman -S bind
  2. Als Nutzer mit Root-Rechten entsprechend:
     # pacman -S bind

Was uns das Paket bind alles in das System unseres Arch Linux Server gebracht hat, können wir wie folgt abfragen:

 # pacman -Qil bind

Paketinhalte

Grund-Konfiguration

Firewall/Paketfilter - firewalld

Bevor wir nun unseren ISC-BIND konfigurieren und starten müssen wir natürlich sicherstellen, dass auf dem betreffendem Host auch die Kommunikationsbeziehungen entsprechend erlaubt sind.

Wie auch schon früher bei CentOS ab Release 7 bzw. den nachfolgenden Release-Kandidaten Stream von RHEL nutzen wir auch unter Arch Linux den dynamischen firewalld Service. Ein grosser Vorteil der dynamischen Paketfilterregeln ist unter anderem, dass zur Aktivierung der neuen Firewall-Regel(n) nicht der Daemon durchgestartet werden muss und somit alle aktiven Verbindungen kurz getrennt werden. Sondern unsere Änderungen können on-the-fly aktiviert oder auch wieder deaktiviert werden.

In folgendem Konfigurationsbeispiel gehen wir von einem Host aus, der zwei Firewall-Zonen hält, einmal die Zone idmz und einmal die Zone intra. In beiden Zone intra sollen später die DNS-Anfragen der Clients entsprechend beantworten werden.

Damit unsere Clients Verbindungen zu dem geöffneten dhcpv4-Port 67/UDP und dhcpv6-server-Port 547/UDP der beiden zugehörigen Kea-Daemons aufbauen können, müssen wir für diese noch Änderungen am Paketfilter firewalld vornehmen.

Mit Hilfe des Programms firewall-cmd legen wir nun jeweils eine permanente Regel in den beiden Zonen idmz und intra an. Genug der Vorrede, mit nachfolgendem Befehl werden die Ports für den Service dns geöffnet.

 # firewall-cmd --permanent --zone=idmz --add-service=dns
success
 # firewall-cmd --permanent --zone=intra --add-service=dns
success

Anschliessend können wir den Firewall-Daemon einmal neu laden und überprüfen, ob die Regeln auch entsprechend unserer Definition, gezogen haben.

 # firewall-cmd --reload
success

Werfen wir noch kurz einen Blick in die Zone idmz:

 # firewall-cmd --zone=idmz --list-services
dhcp dhcpv6 dns ssh

Gleiches gilt natürlich für die Zone intra:

 # firewall-cmd --zone=intra --list-services
dhcp dhcpv6 dns ssh

Firewall/Paketfilter - firewalld auf einem Transitknoten (FWB)

# firewall-cmd --permanent --policy=edmz_2_idmz  --add-rich-rule='rule family="ipv4" destination address="10.0.0.110" port port=53 protocol=tcp accept'
# firewall-cmd --permanent --policy=edmz_2_idmz  --add-rich-rule='rule family="ipv4" destination address="10.0.0.110" port port=53 protocol=udp accept'
# firewall-cmd --permanent --policy=edmz_2_idmz  --add-rich-rule='rule family="ipv6" destination address="fd00::3:10:0:0:110" port port=53 protocol=tcp accept'
# firewall-cmd --permanent --policy=edmz_2_idmz  --add-rich-rule='rule family="ipv6" destination address="fd00::3:10:0:0:110" port port=53 protocol=udp accept'
# firewall-cmd --permanent --policy=edmz_2_idmz  --add-rich-rule='rule family="ipv6" destination address="2003:a:e0d:7603:10::110" port port=53 protocol=tcp accept'
# firewall-cmd --permanent --policy=edmz_2_idmz  --add-rich-rule='rule family="ipv6" destination address="2003:a:e0d:7603:10::110" port port=53 protocol=udp accept'

jeweils success

# firewall-cmd --reload 
success
 # firewall-cmd --policy=edmz_2_idmz --list-all
edmz_2_idmz (active)
  priority: -1
  target: REJECT
  ingress-zones: edmz
  egress-zones: idmz
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
	rule family="ipv6" destination address="2003:a:e0d:7603:10::110" icmp-type name="echo-request" accept
	rule family="ipv4" destination address="10.0.0.110" port port="53" protocol="tcp" accept
	rule family="ipv4" destination address="10.0.0.110" port port="53" protocol="udp" accept
	rule family="ipv6" destination address="fd00::3:10:0:0:110" port port="53" protocol="tcp" accept
	rule family="ipv6" destination address="fd00::3:10:0:0:110" port port="53" protocol="udp" accept

automatischer Start des Daemon

Damit der BIND-Servicedaemon namens named automatisch bei jedem Systemstart startet, kann die Einrichtung eines Start-Scriptes über folgenden Befehl erreicht werden:

 # systemctl enable named.service
Created symlink '/etc/systemd/system/multi-user.target.wants/named.service' → '/usr/lib/systemd/system/named.service'.

Ein Überprüfung ob der Dienste (Daemon) named wirklich bei jedem Systemstart automatisch mit gestartet wird, kann durch folgenden Befehl erreicht werden:

 # systemctl is-enabled named.service
enabled

Starten werden wir den Dienst aber jetzt noch nicht, da wir zunächst den BIND noch konfigurieren und die zugehörigen Zonen-Dateien anlegen müssen!

Basis-Konfiguration

Dokumentation / Man-Pages

Name Server Control Utility rndc

Zur administrativen Interaktion und Steuerung mit unserem DNS-Server nutzen wir das Name Server Control Utility rndc aus dem Paket bind. Die Optionen dieses User Interface finden am einfachsten in der zugehörigen manpage.

 # man rndc

rndc manpage

Die Kommunikation zwischen der UserInterface rndc und dem DNS-Daemon erfolgt nur noch über eine digital signierten Zugangskanal, der auf einem entsprechenden symmetrischen Schlüssel basiert. Dieses zugehörige Schlüsselmaterial muss direkt in einer entsprechenden Konfigurationsdateien hinterlegt werden und so dem Client rndc und dem Server bind bekannt gegeben werden.

Name Server Control Utility rndc Key Generations Tool rndc-confgen

Das zuvor genannte Schlüsselmaterial wird mit Hilfe des rndc key generation tool rndc-confgen aus dem Paket bind erzeugt. Die Optionen dieses User Interface finden am einfachsten in der zugehörigen manpage.

 # man rndc-confgen

rndc-confgen manpage

Name Server Konfigurationsdatei Syntax Prüftool named-checkconf

Zum Überprüfen der Konfiguration /etc/named.conf die wir später noch erstellen werden, befindet sich in dem ArchLinux-Paket das Hilfsprogramm named-checkconf. Die manpage des Programms liefert eine entsprechende Hilfe und zeigt auch die entsprechenden Optionen auf, mit deren Hilfe umfangreiche Tests durchgeführt werden können.

 # man named-checkconf

named-checkconf manpage

DNSSEC Tool zum Generieren der Schlüssel dnssec-keygen

Wollen wir später DNSSEC zum Einsatz bringen, benötigen wir entsprechendes Schlüsselmaterial. Zur Generierung dieser Schlüssel verwenden wir das Programm dnssec-keygen. Die manpage des Programms liefert eine entsprechende Hilfe und zeigt auch die entsprechenden Optionen auf, die bei der Erstellung des Schlüsselmaterials verwendet werden kann.

 # man dnssec-keygen

dnssec-keygen manpage

nsupdate - Tool für den dynamischen Update von Zonen-Dateien

Das Programm nsupdate wird verwendet, um Dynamic DNS Update-Anfragen, wie in RFC 2136 definiert, an einen Namenserver zu senden. Dadurch können Ressourceneinträge zu einer Zone hinzugefügt oder daraus entfernt werden, ohne die Zonendatei manuell zu bearbeiten. Die manpage des Programms liefert eine entsprechende Hilfe und zeigt auch die entsprechenden Optionen auf, die bei der Verwaltung dynamischer Zonen zum Tragen kommen.

 # man nsupdate

nsupdate manpage

ddns-confgen - Hilfsprogramm zur DDNS Schlüssel Generierung

ddns-confgen ist ein Hilfs-/Dienstprogramm, das Schlüssel für die Verwendung in der TSIG-Signatur generiert. Die resultierenden Schlüssel können beispielsweise verwendet werden, um dynamische DNS-Updates für eine Zone zu sichern, oder für den rndc-Befehlskanal. Die manpage des Programms liefert eine entsprechende Hilfe und zeigt auch die entsprechenden Optionen auf, die bei der Generierung des DDNS-Schlüsselmaterials verwendet werden können.

 # man ddns-confgen

nsupdate manpage

Schlüsselmaterial mit rndc-confgen für rndc erzeugen

Mit Hilfe des Befehls rndc-confgen aus dem ArchLinux-Paket bind kann sowohl dieser symmetrische Schlüssel wie auch die zugehörige Client-Konfigurationsdatei /etc/rndc.conf erzeugt, wie auch die benötigten Konfigurationsoptionen für die DNS-Server-Konfigurationsdatei /etc/named.conf angezeigt werden.

In folgendem Beispiel, welches wir lediglich zum Anzeigen der später benötigten Konfigurationsoptionen benutzen, nutzen wir folgende Optionen beim Aufruf des Hilfsprogramms rndc-confgen

  • -A algorithm (Diese Option gibt den Algorithmus an, der für den TSIG-Schlüssel verwendet werden soll.) = hmac-sha512
  • -b keysize (Diese Option gibt die Größe des Authentifizierungsschlüssels in Bits an.) = 512
  • -k keyname (Diese Option gibt den Schlüsselnamen des rndc-Authentifizierungsschlüssels an.) = rndc-key
# rndc-confgen -A hmac-sha512 -b 512 -c /etc/rndc.key -k rndc-key -u named
# Start of rndc.conf
key "rndc-key" {
	algorithm hmac-sha512;
	secret "7xt2MC8jnLUbO/GcBeW7uuKhzYi8LkDLNuVHEyEa8Eo2RPYyHEtDxF5ubrYFJsCJlVEzFjJ0WgbeFoR8iO/5Zw==";
};

options {
	default-key "rndc-key";
	default-server 127.0.0.1;
	default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "rndc-key" {
# 	algorithm hmac-sha512;
# 	secret "7xt2MC8jnLUbO/GcBeW7UUKhzYi8LkDLNuVHEyEa8Eo2RPYyHEtDxF5ubrYFJsCJlVEzFjJ0WEgB13rR8iO/5Zw==";
# };
# 
# controls {
# 	inet 127.0.0.1 port 953
# 		allow { 127.0.0.1; } keys { "rndc-key"; };
# };
# End of named.conf

Wichtig:
Der symmetrische Schlüssel muss sowohl in der Client-Konfigurationsdatei /etc/rndc.conf wie auch Server-Konfigurationsdatei /etc/named.conf hinterlegt werden. Zweckmässiger ist es jedoch diesen Schlüssel in eine eigene Konfigurationsdatei zu hinterlegen und diese Datei dann entsprechend zu inkludieren! Wir werden diesen Konfigurationsvorschlag also so nicht 1:1 umsetzen, sondern die ganze Sache besser angehen und realisieren!

Wir erstellen also nun unseren eigenen Schlüssel und schreiben diesen in eine eigene Datei, hierzu benutzen wir folgende Optionen beim Aufruf von rndc-confgen:

  • -A algorithm (Diese Option gibt den Algorithmus an, der für den TSIG-Schlüssel verwendet werden soll.) = hmac-sha512
  • -b keysize (Diese Option gibt die Größe des Authentifizierungsschlüssels in Bits an.) = 512
  • -a (Diese Option legt die automatische rndc-Konfiguration fest, die eine Datei /etc/rndc.key erstellt, die sowohl von rndc als auch von named beim Start gelesen wird.)
  • -c keyfile (Diese Option wird zusammen mit der Option -a verwendet, um einen alternativen Speicherort für rndc.key anzugeben.) = /etc/rndc.key
  • -k keyname (Diese Option gibt den Schlüsselnamen des rndc-Authentifizierungsschlüssels an.) = homelab-key
  • -u user (Diese Option wird zusammen mit der Option -a verwendet, um den Eigentümer der generierten rndc.key-Datei festzulegen.) = named

Wichtig:

Der Name unseres eigenen symmetrischen Schlüssels, den wir nachfolgend generieren werden, darf nicht rndc-key lauten, da ansonsten beim Verwendung in der Konfigurationsdatei /etc/rndc.conf und bei Verwendung des Schlüsselnamens rndc-key in der Konfigurationsdatei folgender Warnhinweis erscheinen würde:

WARNING: key file (/etc/rndc.key) exists, but using default configuration file (/etc/rndc.conf)

Aus diesem Grund verwenden wir, wie oben vermerkt den Schlüsselnamen homelab.key!

# rndc-confgen -A hmac-sha512 -b 512 -a -c /etc/rndc.key -k homelab-key -u named
wrote key file "/etc/rndc.key"

Ob unsere Schlüsseldatei wunschgemäß angelegt und mit dem gewünschten Informationen versorgt wurde, wurde können wir mit einem Blick in die Datei /etc/rndc.key werfen.

# ll /etc/rndc.key
-rw------- 1 named root 147 Dec 28 17:53 /etc/rndc.key
 # bat /etc/rndc.key
───────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       │ File: /etc/rndc.key
───────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────
   1   │ key "homelab-key" {
   2   │     algorithm hmac-sha512;
   3   │     secret "NyUpT/YME/zzcxkyfyUBTzwS4eCEcb5S2hifWlArCh11nux157h3Be57qfKtnahRBE4hGkd9EwzQuzCI7fu4vlw==";
   4   │ };
───────┴─────────────────────────────────────────────────────────────────────────────────────────────────────────────────

Damit nun nur noch der Nutzer mit root-Rechten die Datei verändern kann, aber der User named diese weiterhin lesen kann, werden wir nun noch die Datei- und Nutzerrechte noch etwas anpassen und somit die Sicherheit ein klein wenig erhöhen, nicht daß uns da noch jemand kommt mit dem Hinweis, wir würden hier nur eine Frickel-/Bastellösung bauen! m(

 # chown root:named /etc/rndc.key
 # chmod 640 /etc/rndc.key

Als Ergebnis haben wir nun:

# ll /etc/rndc.key
-rw-r----- 1 root named 147 Dec 28 17:53 /etc/rndc.key

Root-Nameserver

Damit unser Nameserver ordnungsgemäß DNS-Anfragen „top-down“ durchführen kann, muß dieser natürlich Kenntnis von den 13 Root Nameservern haben. Bei der Installation des ArchLinux Pakets bind keine Default-Konfigurationsdatei mit diesen Informationen mitgeliefert wurde, werden wir uns nun die betreffenden Informationen besorgen und in der Datei /var/named/named.root ablegen.

# dig +bufsize=1200 +norec NS . @a.root-servers.net > /var/named/named.root ; chown named: /var/named/named.root

Wir haben nun die nötigen Informationen vorliegen:

# ll /var/named/named.root
-rw-r--r-- 1 named named 2240 Dec 28 17:58 /var/named/named.root

Diese Datei hat nun folgenden Inhalt.

# bat /var/named/named.root

Inhalt der erzeugten Konfigurationsdatei /var/named/named.root

Zonen und Views

Damit unser Nameserver nun für die unterschiedlichen Zonen, die wir zu Beginn dieses WIKI-Artikels im Abschnitt Herausforderung / Aufgabenstellung ausgemacht haben, müssen wir nun noch die erforderlichen Zonen-Dateien erstellen und unserem BIND bekannt geben.

  • extern (Internet), Domainspezifisch:
    • nausch.org mit jeweils öffentlichen IP-Adressen IPv4 und IPv6 (GUA)
    • und später ggf. für weitere weitere Domains
  • intern:
    • EDMZ mit privaten Adressen aus dem IPv4- und IPv6-Bereichen
    • IDMZ mit privaten Adressen aus dem IPv4- und IPv6-Bereichen
    • INTRA mit privaten Adressen aus dem IPv4- und IPv6-Bereichen

ACHTUNG:
Da wir später DNSSEC einführen und verwenden wollen, müssen wir unbedingt auf folgendes achten:
Jedes Zone-File darf nur einmal existieren, auch wenn ein und die selbe Information in mehreren views verwendet werden soll!
Wir müssen also für die Zonen EDMZ und IDMZ, welche ja in beiden views verwendet werden sollen, separate Dateien anlegen. Diesen Dateien stellen wir dann zur Unterscheidung einfach ein e. für die externe view voran und i. für die interne view! Wir werden später sowieso die Zonendateien mit Hilfe von Ansible verwalten, so daß dieser vermeintliche Mehraufwand nicht weiter ins Gewicht fallen wird!

Wir werden also nun für diese unterschiedlichen Zonen jeweils zwei zugehörige Zonen-Dateien anlegen, eine für die forward- und eine für die reverse-Auflösung:

Adresspool Zone View Zonen-Datei Quelle / Hinweis Verwendung
lokal localhost intern /var/named/localhost.zone ArchLinux Installationspaket Forward
lokal 0.0.127.in-addr.arpa intern /var/named/127.0.0.zone ArchLinux Installationspaket IPv4-Reverse
lokal 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa intern /var/named/localhost.ip6.zone ArchLinux Installationspaket IPv6-Reverse
. intern /var/named/named.root selbst generiert → Root-Nameserver Root-Nameserver
Intranet intra.nausch.org intern /var/named/zones/i.intra.nausch.org.db selbst angelegt und gepflegt Forward
Intranet 10.0.10.in-addr.arpa intern /var/named/zones/i.intra.nausch.org.in-addr.db selbst angelegt und gepflegt IPv4-Reverse
Intranet 7.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa intern /var/named/zones/i.intra.nausch.org.ip6.db selbst angelegt und gepflegt IPv6-Reverse
IDMZ idmz.nausch.org intern /var/named/zones/i.idmz.nausch.org.db selbst angelegt und gepflegt Forward
IDMZ 0.0.10.in-addr.arpa intern /var/named/zones/i.idmz.nausch.org.in-addr.db selbst angelegt und gepflegt IPv4-Reverse
IDMZ 3.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa intern /var/named/zones/i.idmz.nausch.org.ip6.db selbst angelegt und gepflegt IPv6-Reverse
EDMZ edmz.nausch.org intern /var/named/zones/i.edmz.nausch.org.db selbst angelegt und gepflegt Forward
EDMZ 2.17.172.in-addr.arpa intern /var/named/zones/i.edmz.nausch.org.in-addr.db selbst angelegt und gepflegt IPv4-Reverse
EDMZ 0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa intern /var/named/zones/i.edmz.nausch.org.ip6.db selbst angelegt und gepflegt IPv6-Reverse
„interne“ nausch.org intern /var/named/zones/i.nausch.org.db selbst angelegt und gepflegt
(externe Namen und interne Adressen!)
Forward
lokal localhost extern /var/named/localhost.zone ArchLinux Installationspaket Forward
lokal 0.0.127.in-addr.arpa extern /var/named/127.0.0.zone ArchLinux Installationspaket IPv4-Reverse
lokal 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa extern /var/named/localhost.ip6.zone ArchLinux Installationspaket IPv6-Reverse
. extern /var/named/named.root generiert → Root-Nameserver Root-Nameserver
IDMZ idmz.nausch.org extern /var/named/zones/e.idmz.nausch.org.db selbst angelegt und gepflegt Forward
IDMZ 0.0.10.in-addr.arpa extern /var/named/zones/e.idmz.nausch.org.in-addr.db selbst angelegt und gepflegt IPv4-Reverse
IDMZ 3.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa extern /var/named/zones/e.idmz.nausch.org.ip6.db selbst angelegt und gepflegt IPv6-Reverse
EDMZ edmz.nausch.org extern /var/named/zones/e.edmz.nausch.org.db selbst angelegt und gepflegt Forward
EDMZ 2.17.172.in-addr.arpa extern /var/named/zones/e.edmz.nausch.org.in-addr.db selbst angelegt und gepflegt IPv4-Reverse
EDMZ 0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa extern /var/named/zones/e.edmz.nausch.org.ip6.db selbst angelegt und gepflegt IPv6-Reverse
„externe“ nausch.org extern /var/named/zones/e.nausch.org.zone selbst angelegt und gepflegt Forward
„externe“ 131.13.92.217.in-addr.arpa extern /var/named/zones/e.nausch.org.in-addr.db selbst angelegt und gepflegt IPv4-Reverse
„externe“ 3.0.6.7.d.0.e.0.a.0.0.0.3.0.0.2.ip6.arpa extern /var/named/zones/e.nausch.org.ip6.db selbst angelegt und gepflegt IPv6-Reverse

Damit alle unsere eigenen Zonen-Dateien aufgeräumt in einem eigenen (Unter-)Verzeichnis liegen, legen wir uns nun noch ein entsprechendes Verzeichnis an.

 # mkdir /var/named/zones

Hier passen wir noch die Berechtigung des gerade angelegten Verzeichnisses an.

 # chmod 770 /var/named/zones

Zu guter Letzt korrigieren wir noch die User- und Gruppenberechtigungen unseres neuen Unterverzeichnisses für die Zonen-Dateien.

 # chown root:named /var/named/zones

Zone-Files

Was nun noch fehlt sind die einzelnen Zonen-Dateien, welche nun wir anlegen und mit Leben füllen wollen.

zones/i.intra.nausch.org.db

Als erstes legen wir das Zonenfile für die forward-Auflösung unserer Subdomain/Zone intra.nausch.organ.

 # vim /var/named/zones/i.intra.nausch.org.db
$TTL 2H                                       ; Defaultwert für die TTL                                              
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
 
                                IN  NS        ns1
 
                                IN  MX  10    mx1
 
ns1                             IN  A         10.0.10.110
 
mx1                             IN  A         10.0.10.110
 
pml010070                       IN  A         10.0.10.70
                                IN  AAAA      fd00::7:10:0:10:70
nitro-pc                        IN  CNAME     pml010070
 
vml010110                       IN  A         10.0.10.110
                                IN  AAAA      fd00::7:10:0:10:110
fwc                             IN  CNAME     vml010110

Zum Validieren unseres Zone File benutzen wir das Programm named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone intra.nausch.org /var/named/zones/i.intra.nausch.org.db
zone intra.nausch.org/IN: loaded serial 2025122801
OK

Dieses exemplarische Zone-File wollen wir uns nun noch etwas genauer ansehen.

  • Die $ORIGIN-Direktive:
    $ORIGIN definiert den Domain-Namen. Immer wen eine $ORIGIN-Zeile in einer Zonendatei vermerkt wird, handelt es sich hierbei um eine Abkürzung, die BIND wissen lässt, dass alle nicht abgeschlossenen Hostnamen-Verweise, die auf diese Zeile folgen, vermutlich auf das Argument enden, das auf $ORIGIN folgt. Diese Zeile ist optional, da wir nachfolgend die @-Zeichen verwenden werden und sei hier nur der Vollständigkeit halber erwähnt.
  • Die $TTL-Anweisung:
    MIT $TTL legen wird die Standard-TTL 2) für nachfolgende Datensätze fest, welche keine eigene separaten definierten TTLs haben.

Sowohl $ORIGIN als auch $TTL können in derselben Zone mehrfach definiert werden. Jedes Mal, wenn wir diese neu definieren, ändern man damit ihre Werte für alle Zeilen unterhalb der neuen Werte in derselben Zonendatei.

  • Der SOA-Record:
    @                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                    2024110202    ; serial - Seriennummer im Format YYYYMMDDnn
                                            1h    ; refresh (1 Stunde)
                                            15m   ; retry   (15 Minuten)
                                            2W    ; expire  (2 Wochen)
                                            10m ) ; negative caching TTL (10 Minuten)
    • Das @-Zeichen ist ein Platzhalter, der sogenannte Origin, den BIND9 für die in der /etc/named.conf genannte Zone (intra.nausch.org) einsetzt. Wird in der Zonendatei der Zonenname ohne jegliche Extension isoliert genannt, dann darf dieser durch das Zeichen „@“ ersetzt werden.
    • Die Datenklasse-IN:
      Die Datenklasse IN steht für „Internet“. Die Datensatzklasse ist optional und könnte auch weggelassen werden - BIND geht dann davon aus, dass der angegebene Datensatz zur Klasse IN gehört. Es wir aber grundsätzlich empfohlen diese anzugeben und nicht wegzulassen, damit nicht bei etwaigen Änderungen plötzlich z.B. nach einer Aktualisierung des BIND-Paketes alle Zonen-Dateien beschädigt und somit unbrauchbar sein könnten!
    • SOA ist der hier verwendete Record-Typ.
    • ns1 Dies ist der FQDN des primären Nameservers für die Domain selbst. Da in diesem Fall der abschliessende . fehlt, zeigt dies dem BIND an, dass der FQDN noch aus dem genannten Namen mit dem Wert der $ORIGIN-Direktive b.z.w. dem verwendeten Verweis auf das @-Zeichen erweitert werden muss um den tatsächlichen FQDN zu erhalten!
    • Das nächste Argument hostmaster.nausch.org. ist kein FQDN, obwohl dies auf den ersten Blick so scheinen mag. Da es sich beim @-Zeichen in einer Zonen-Datei um ein reserviertes handelt, ist dieser vermeintliche FQDN, nichts anderes als eine eMail-Adresse, in diesem Fall also hostmaster@nausch.org.
    • Weiter geht es mit den Angaben zu serial, refresh, retry, expire und negative caching TTL für die Zone innerhalb der runden Klammern. Die Kommentare hier sind optional und werden vom BIND nicht weiter beachtet, erleichtern aber dem Admin später doch ein wenig das Leben. Aus diesem Grund geben wir diese hier entsprechend an.
      • serial – Dies ist eine einfache Seriennummer für die Zonendatei, die bei jeder Änderung des Zoneninhalts erhöht werden muss. Wird die Seriennummer der Zonendatei nicht aktualisiert, werden Ihre Änderungen an der Zone bei einem rndc reload nicht übernommen, sondern die zuvor zwischengespeicherten Einträge aus der Zone verwendet! Die Verwendung der Seriennummerformates YYYMMDDnn ist empfohlen, da ein Administrator es hier wesentlich leichter hat, wenn er ermitteln wollte wie lange die letzte Änderung schon her ist bzw. ob am betreffenden Tag schon mehrmals das Zone-File angepasst worden ist.
      • refresh - Nach Ablauf dieser definierten Zeit sollten sekundäre Nameserver den primären Nameserver nach diesem SOA-Eintrag abfragen, um Änderungen der Seriennummer zu erkennen. Sofern die Seriennummer erhöht wurde, müssen alle zwischengespeicherten Datensätze ungültig gemacht und erneut vom primären Nameserver abgerufen werden.
      • retry - Sofern der primäre Nameserver nicht auf eine SOA-Anfrage reagiert, sollte ein sekundärer Nameserver so lange warten, bevor er erneut versucht, den primären Nameserver abzufragen.
      • expire - Reagierte der primäre Nameserver innerhalb dieses Zeitraums nicht auf die SOA-Anfrage eines sekundären Nameservers, sollte der sekundäre Nameserver die DNS-Auflösung für die Domain vollständig einstellen und keine Anfragen mehr beatworten.
      • negative caching TTL – Diese steuert, wie lange andere Server „No-Such-Domain“-Antworten (NXDOMAIN) von diesem Server zwischenspeichern. Weitere Einzelheiten hierzu findet man in RFC 2308.
  • Der NS-Record(s):
    In einem oder mehreren Einträgen wird hier definiert, wer der oder die autoritative Nameserver für unsere Zone ist bzw. sind. Die Hostnamen können entweder als FQDN mit einem abschliessenden . versehen werden oder auch nur mit ihrem Hostnamen definiert werden, der dann mit Hilfe des @-Zeichens bzw. der $ORIGIN-Direktive verfollständigt wird. Zu beachten ist, dass hier keinesfalls eine IP-Adresse sondern ausschliesslich Hostnamen verwendet werden dürfen!
  • Der MX-Record:
    Hier wird festgelegt welche® Mailserver für die Zone zuständig sind. Mit Hilfe des MX-Records wissen alle Clients und User, die eMails an eine beliebige Adresse der Subdomain intra.nausch.org senden möchten, über welches Mailrelay sie ihre SMTP-Verbindung herzustellen haben.
  • Der A-Record :
    A-Records sind der Teil einer Zonendatei, der tatsächlich das tut, was die meisten Menschen mit DNS verbinden. Sie übersetzen einen Hostnamen in eine reine IPv4-Adresse. Bei Bedarf können auch einem Namen mehrere IPv4-Adressen zugewiesen werden.
  • Der AAAA-Record*:
    Der „Quad-A“-Record und keinesfalls der „Ahhh“-Record ;-) ist das Äquivalent für die IPv6-Adresszuweisung, was eben der A-Record bei IPv4 entspricht.
  • Der CNAME-Record:
    Der letzte Datensatztyp, auf welchen wir hier in diesem Beispiel noch kurz eingehen wollen, ist der CNAME was für Canonical Name steht. Dies ist ein Alias, mit dem man BIND anweisen kann, Anfragen für den CNAME jeweils immer mit dem im Zielargument angegebenen A- oder AAAA-Record aufzulösen.
zones/i.intra.nausch.org.in-addr.db

Als nächstes legen wir das Zone-File für die IPv4-Reverseauflösung für unsere Subdomain/Zone intra.nausch.organ.

 # vim /var/named/zones/i.intra.nausch.org.in-addr.db
$TTL 2H                                       ; Defaultwert für die TTL                                              
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn                                                                             
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
                                          
                                IN  NS        ns1
                                          
                                IN  MX  10    mx1
                                          
ns1                             IN  A         10.0.10.110
                                          
mx1                             IN  A         10.0.10.110
                                          
70                              IN  PTR       pml000070.intra.nausch.org.
                                IN  PTR       nitro-pc.intra.nausch.org.
                                          
110                             IN  PTR       vml000110.intra.nausch.org.
                                IN  PTR       fwc.intra.nausch.org.

Auch hier validieren wir unseres Zone File mit Hilfe des Programms named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone intra.nausch.org.in-addr.db /var/named/zones/i.intra.nausch.org.in-addr.db
zone intra.nausch.org.in-addr.db/IN: loaded serial 2025122801
OK
zones/i.intra.nausch.org.ip6.db

Was nun noch fehlt ist die Zonen-Datei für die IPv6-Reverseauflösung unserer Subdomain/Zone intra.nausch.org, die wir nun auch noch anlegen.

Zur Erinnerung schauen wir uns kurz nochmals an, wie der Reverse-Eintrag für die Adresse fd00::7:10:0:10:70 auszusehen hat:
0.7.0.0.0.1.0.0.0.0.0.0.0.1.0.0.7.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f

Damit wir uns nicht nun bei der Adresse jedes mal einen Wolf tippen und die Tasten 0 und . auf unserer Tastatur überbeanspruchen müssen, verwenden wir hier die $ORIGIN-Direktive
$ORIGIN 0.1.0.0.0.0.0.0.0.1.0.0. Ferner lassen wir die letzten 4 Stellen der Adresse „unterminiert“, d.h. diese Adressangabe endet nicht mit einem Punkt . und diese wird somit mit den Angaben der $ORIGIN-Direktive ergänzt. Aus 0.7.0.0 und der $ORIGIN-Direktive wird also in Verbindung mit der Zone-Definition (zone „7.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa“)in der /etc/named.conf die vollständige Adresse:
0.7.0.0.0.1.0.0.0.0.0.0.0.1.0.0.7.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f

 # vim /var/named/zones/i.intra.nausch.org.ip6.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
                               
                                IN  NS        ns1
                               
                                IN  MX  10    mx1
                               
ns1                             IN  A         10.0.10.110
                               
mx1                             IN  A         10.0.10.110
                               
$ORIGIN 0.1.0.0.0.0.0.0.0.1.0.0
                                         
0.7.0.0                         IN PTR        pml000070.intra.nausch.org.                                                                                              
                                IN PTR        nitro-pc.intra.nausch.org.
                               
0.1.1.0                         IN PTR        vml000110.intra.nausch.org.
                                IN PTR        fwc.intra.nausch.org.

Wie schon zuvor auch validieren wir hier unseres Zone File mit Hilfe des Programms named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

# named-checkzone intra.nausch.org.ip6.db /var/named/zones/i.intra.nausch.org.ip6.db
zone intra.nausch.org.ip6.db/IN: loaded serial 2025122801
OK

Somit haben wir alle drei benötigten Zonen-Dateien für die Zone intra.nausch.org fehlerfrei angelegt.

zones/[i|e].idmz.nausch.org.db

Kommen wir nun zur Subdomain/Zone idmz.nausch.org. Hier benötigen wir zwei identische Zonefiles, einmal für die view internal und einmal für die view external. Als erstes legen wir das Zone-File für die view internal zur forward-Auflösung für die Subdomain/Zone idmz.nausch.org an.

 # vim /var/named/zones/i.idmz.nausch.org.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn                                                                             
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
                                          
                                IN  NS        ns1
                                          
                                IN  MX  10    mx1
                                          
ns1                             IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
mx1                             IN  A         10.0.0.80
                                IN  AAAA      fd00::3:10:0:0:80
                                          
vml000070                       IN  A         10.0.0.70
                                IN  AAAA      fd00::3:10:0:0:70
imap                            IN  CNAME     vml000070
mda                             IN  CNAME     vml000070
pop3                            IN  CNAME     vml000070
                                          
vml000080                       IN  A         10.0.0.80
                                IN  AAAA      fd00::3:10:0:0:80
mta                             IN  CNAME     vml000080
                                          
vml000110                       IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
dns                             IN  CNAME     vml000110
                                          
vml000210                       IN  A         10.0.0.210
                                IN  AAAA      fd00::3:10:0:0:210

Für die view external benötigen wir nun die gleiche Datei nochmals, da wir ja später DNSSEC nutzen wollen - also kopieren wir kurzerhand die gerade angelegte Zonen-Datei einfach.

 # cp -a i.idmz.nausch.org.db e.idmz.nausch.org.db

Wie soll es anderes sein, zum Validieren unseres Zone File benutzen wir auch hier das Programm named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone idmz.nausch.org /var/named/zones/i.idmz.nausch.org.db
zone idmz.nausch.org/IN: loaded serial 2025122801
OK

bzw.

 # named-checkzone idmz.nausch.org /var/named/zones/e.idmz.nausch.org.db
zone idmz.nausch.org/IN: loaded serial 2025122801
OK
zones/[i|e].idmz.nausch.org.in-addr.db

Als nächstes benötigen wir die beiden Zonendateien für die IPv4-Reverse-Auflösung der beiden views internal und external. Wir legen zunächst das Zone-File für die view internal zur IPv4-reverse-Auflösung für die Subdomain/Zone idmz.nausch.org an.

 # vim /var/named/zones/i.idmz.nausch.org.in-addr.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  ( 
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
 
                                IN  NS        ns1 
 
                                IN  MX  10    mx1 
 
ns1                             IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
mx1                             IN  A         10.0.0.80
                                IN  AAAA      fd00::3:10:0:0:80
 
70                              IN  PTR       vml000070.idmz.nausch.org.
                                IN  PTR       imap.idmz.nausch.org.     
                                IN  PTR       mda.idmz.nausch.org.      
                                IN  PTR       pop3.idmz.nausch.org.     
 
80                              IN  PTR       vml000080.idmz.nausch.org.
                                IN  PTR       mta.idmz.nausch.org.      
                                IN  PTR       mx1.idmz.nausch.org.      
 
110                             IN  PTR       vml000110.idmz.nausch.org.
                                IN  PTR       dns.intra.nausch.org.     
 
210                             IN  PTR       vml000210.idmz.nausch.org.

Für die view external benötigen wir nun die gleiche Datei nochmals, da wir ja später DNSSEC nutzen wollen - also kopieren wir kurzerhand auch diese soeben angelegte Zonen-Datei einfach.

 # cp -a i.idmz.nausch.org.in-addr.db e.idmz.nausch.org.in-addr.db

Wie soll es anderes sein, zum Validieren unseres Zone File benutzen wir auch hier das Programm named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone idmz.nausch.org /var/named/zones/i.idmz.nausch.org.in-addr.db
zone idmz.nausch.org/IN: loaded serial 2025122801
OK

bzw.

 # named-checkzone idmz.nausch.org /var/named/zones/e.idmz.nausch.org.in-addr.db
zone idmz.nausch.org/IN: loaded serial 2025122801
OK
zones/[i|e].idmz.nausch.org.ip6.db

Was nun noch fehlt sind die beiden die Zonen-Dateien für die IPv6-revers-Auflösung unserer Subdomain/Zone idmz.nausch.org vie die beiden views internal und external, welche wir nun auch noch anlegen.

Auch hier werden wir die Direktive $ORIGIN verwenden, wie wir dies auch schon bei der Zone intra.nausch.org gemacht hatten.

 # vim /var/named/zones/i.idmz.nausch.org.ip6.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn              
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
                                          
                                IN  NS        ns1
                                          
                                IN  MX  10    mx1
                                          
ns1                             IN  A         10.0.10.110
                                          
mx1                             IN  A         10.0.10.110
                                          
$ORIGIN 0.0.0.0.0.0.0.0.0.1.0.0           
                                          
0.7.0.0                         IN  PTR       vml000070.idmz.nausch.org.
                                IN  PTR       imap.idmz.nausch.org.
                                IN  PTR       mda.idmz.nausch.org.
                                IN  PTR       pop3.idmz.nausch.org.
                                          
0.8.0.0                         IN  PTR       vml000080.idmz.nausch.org.
                                IN  PTR       mta.idmz.nausch.org.
                                IN  PTR       mx1.idmz.nausch.org.
                                          
0.1.1.0                         IN  PTR       vml000110.idmz.nausch.org.
                                IN  PTR       fwc.idmz.nausch.org.
                                IN  PTR       dns.idmz.nausch.org.
                                          
0.1.2.0                         IN  PTR       vml000210.idmz.nausch.org.
                                IN  PTR       fwb.idmz.nausch.org.

Auch hier kopieren wir die Datei für unsere zweite view.

 # cp -a /var/named/zones/i.idmz.nausch.org.ip6.db /var/named/zones/e.idmz.nausch.org.ip6.db

Wie schon zuvor auch validieren wir hier unseres Zone File mit Hilfe des Programms named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

# named-checkzone idmz.nausch.org.ip6.db /var/named/zones/i.idmz.nausch.org.ip6.db
zone idmz.nausch.org.ip6.db/IN: loaded serial 2025122801
OK

bzw.

# named-checkzone idmz.nausch.org.ip6.db /var/named/zones/e.idmz.nausch.org.ip6.db
zone idmz.nausch.org.ip6.db/IN: loaded serial 2025122801
OK

Somit haben wir auch hier alle sechs benötigten Zonen-Dateien für die Zone idmz.nausch.org für beide views fehlerfrei angelegt.

zones/[i|e]edmz.nausch.org.db

Machen wir nun weiter mit der nächsten Schutz-Zone und legen zunächst die Zonen-Datei für die forward-Auflösung für die Subdomain/Zone edmz.nausch.org für die view internal an.

 # vim /var/named/zones/i.edmz.nausch.org.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
 
                                IN  NS        ns1
 
                                IN  MX  10    mx1
 
ns1                             IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
 
mx1                             IN  A         10.0.0.80
                                IN  AAAA      fd00::3:10:0:0:80
 
pnc172001                       IN  A         172.17.2.1
fwa                             IN  CNAME     pnc172001
 
vml000017                       IN  A         172.17.2.17
fwe                             IN  CNAME     vml000017
 
ptc172030                       IN  A         172.17.2.30
snom385                         IN  CNAME     ptc172030
tel-buero                       IN  CNAME     ptc172030
 
ptc172031                       IN  A         172.17.2.31
snom360                         IN  CNAME     ptc172031
tel-wohnzimmer                  IN  CNAME     ptc172031
 
ptc172032                       IN  A         172.17.2.32
snom320                         IN  CNAME     ptc172032
tel-keller                      IN  CNAME     ptc172032
 
ptc172033                       IN  A         172.17.2.33
t24-tfe                         IN  CNAME     ptc172033
mobotix-t24                     IN  CNAME     ptc172033
 
ptc172108                       IN  A         172.17.2.108
dect-basis                      IN  CNAME     ptc172108
elmeg-dect160                   IN  CNAME     ptc172108
 
vml000210                       IN  A         172.17.2.210
                                IN  AAAA      fd00::172:17:2:210
fwb                             IN  CNAME     vml000210

Für die view external benötigen wir auch hier ein entsprechenden Pondon - wir kopieren also das gerade angelegte Zonenfile für die zweite view.

 # cp -a /var/named/zones/i.edmz.nausch.org.db /var/named/zones/e.edmz.nausch.org.db

Wie soll es anderes sein, zum Validieren unseres Zone File benutzen wir auch hier das Programm named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone edmz.nausch.org /var/named/zones/i.edmz.nausch.org.db
zone edmz.nausch.org/IN: loaded serial 2025122801
OK

bzw.

 # named-checkzone edmz.nausch.org /var/named/zones/e.edmz.nausch.org.db
zone edmz.nausch.org/IN: loaded serial 2025122801
OK
zones/[i|e].edmz.nausch.org.in-addr.db

Kommen wir nun zu den beiden Zone-Files für die reverse-Auflösung für die Subdomain/Zone edmz.nausch.org. Zunächst legen wir die Datei für die view internal an.

 # vim /var/named/zones/i.edmz.nausch.org.in-addr.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
 
                                IN  NS        ns1
 
                                IN  MX  10    mx1
 
ns1                             IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
 
mx1                             IN  A         10.0.0.80
                                IN  AAAA      fd00::3:10:0:0:80
 
1                               IN  PTR       pnc172001.edmz.nausch.org.
                                IN  PTR       fwa.edmz.nausch.org.
 
17                              IN  PTR       vml000017.edmz.nausch.org.
                                IN  PTR       fwe.edmz.nausch.org.
 
30                              IN  PTR       ptc172030.edmz.nausch.org.
                                IN  PTR       snom385.edmz.nausch.org.
                                IN  PTR       tel-buero.edmz.nausch.org.
 
31                              IN  PTR       ptc172031.edmz.nausch.org.
                                IN  PTR       snom360.edmz.nausch.org.
                                IN  PTR       tel-wohnzimmer.edmz.nausch.org.
 
32                              IN  PTR       ptc172032.edmz.nausch.org.
                                IN  PTR       snom320.edmz.nausch.org.
                                IN  PTR       tel-keller.edmz.nausch.org.
 
33                              IN  PTR       ptc172033.edmz.nausch.org.
                                IN  PTR       mobotix-t24.edmz.nausch.org.
                                IN  PTR       t24-tfe.edmz.nausch.org.
 
108                             IN  PTR       ptc172108.edmz.nausch.org.
                                IN  PTR       elmeg-dect160.edmz.nausch.org.
                                IN  PTR       dect-basis.edmz.nausch.org.
 
210                             IN  PTR       vml000210.edmz.nausch.org.
                                IN  PTR       fwb.edmz.nausch.org.

Nun kopieren wir diese Datrei für die andere view entsprechend.

 # cp -a /var/named/zones/i.edmz.nausch.org.db /var/named/zones/e.edmz.nausch.org.db

Wie soll es anderes sein, zum Validieren unseres Zone File benutzen wir auch hier das Programm named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone edmz.nausch.org /var/named/zones/i.edmz.nausch.org.db
zone edmz.nausch.org/IN: loaded serial 2025122801
OK

bzw.

 # named-checkzone edmz.nausch.org /var/named/zones/e.edmz.nausch.org.db
zone edmz.nausch.org/IN: loaded serial 2025122801
OK
zones/[i|e]edmz.nausch.org.ip6.db

Zu guter Letzt legen wir auch hier noch für die IPv6-reverse-Auflösung unserer Subdomain/Zone edmz.nausch.org die beiden betreffenden Zone-Files an.

 # vim /var/named/zones/i.edmz.nausch.org.ip6.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
                              
                                IN  NS        ns1
                              
                                IN  MX  10    mx1
                              
ns1                             IN  A         10.0.10.110
                              
mx1                             IN  A         10.0.10.110
                              
0.1.2.0.2.0.0.0.7.1.0.0.2.7.1.0 IN  PTR             vml000210.edmz.nausch.org.
                                IN  PTR             fwb.edmz.nausch.org.

Auch hier kopieren wir die Datei noch für die view external entsprechend.

 # cp -a /var/named/zones/i.edmz.nausch.org.in-addr.db /var/named/zones/e.edmz.nausch.org.in-addr.db

Wie schon zuvor auch validieren wir hier unseres Zone File mit Hilfe des Programms named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

# named-checkzone edmz.nausch.org /var/named/zones/i.edmz.nausch.org.ip6.db
zone edmz.nausch.org/IN: loaded serial 2025122801
OK

bzw.

# named-checkzone edmz.nausch.org /var/named/zones/e.edmz.nausch.org.ip6.db
zone edmz.nausch.org/IN: loaded serial 2025122801
OK

Somit haben wir auch hier alle sechs benötigten Zonen-Dateien für die Zone edmz.nausch.org für die beiden views internal und external fehlerfrei angelegt.

zones/e.nausch.org.db

Nachdem wir nun aus Sicht der Domäne nausch.org alle internen Zonen-Dateien angelegt haben, machen wir uns nun zum Schluss daran, auch die externe Sicht, also die externen Zonen-Files anzulegen. Fangen wir mit der Zonen-Datei für die forward-Auflösung für die Domain nausch.organ und zwar für die view external, bei der die öffentlichen IPv4 und IPv6-GUA aufgelöst werden sollen.

 # vim /var/named/zones/e.nausch.org.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1.idmz  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
 
                                IN  NS        ns1.idmz
 
                                IN  MX  10    mx1.idmz
 
ns1.idmz                        IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
 
mx1.idmz                        IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
 
nausch.org                      IN  A         217.92.13.131
                                IN  AAAA      2003:a:e0d:7603:10::90
 
imap                            IN  A         217.92.13.131
                                IN  AAAA      2003:a:e0d:7603:10::70
mda                             IN  CNAME     imap
pop3                            IN  CNAME     imap
 
mx1                             IN  A         217.92.13.131
                                IN  AAAA      2003:a:e0d:7603:10::80
mta                             IN  CNAME     mx1

Wie soll es anderes sein, zum Validieren unseres Zone File benutzen wir auch hier das Programm named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone nausch.org /var/named/zones/e.nausch.org.db
zone nausch.org/IN: loaded serial 2025122801
OK
zones/i.nausch.org.db

Bei der Eingangs betrachteten Herausforderung und Aufgabenstellung hatten wir definiert, daß Anfragen aus den beiden Schutzzonen intra und idmz, welche die offiziellen Domain nausch.org betreffen als Antwort die „internen“ ULA aus der Zone IDMZ beinhalten sollen nicht aber die offiziellen GUA-Adressen!

Somit benötigen wir hierzu eine separate Zonen-Datei, der wir den Namen i.nausch.org geben um diese vom Rest einfach unterscheiden zu können.

Wir legen uns also nun eine Pseudo-Sub-Domain Zone-File mit dem Namen i.nausch.org an.

 # vim /var/named/zones/i.nausch.org.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1.idmz.nausch.org.  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
 
                                IN  NS        ns1.idmz
 
                                IN  MX  10    mx1.idmz
 
ns1.idmz                        IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
 
mx1.idmz                        IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
 
imap                            IN  A         10.0.0.70
                                IN  AAAA      fd00::3:10:0:0:70
mda                             IN  CNAME     imap
pop3                            IN  CNAME     imap
 
mx1                             IN  A         10.0.0.80
                                IN  AAAA      fd00::3:10:0:0:80
mta                             IN  CNAME     mx1

Auch hier prüfen wir das Zone-File ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone nausch.org /var/named/zones/i.nausch.org.db
zone nausch.org/IN: loaded serial 2025122801
OK
zones/e.nausch.org.in-addr.db

Nun legen wir die Zonen-Datei für die reverse-Auflösung für die Domain nausch.org an.

 # vim /var/named/zones/e.nausch.org.in-addr.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)
                                        10m ) ; negative caching TTL (10 Minuten)
                                              
                                IN  NS        ns1
                                              
                                IN  MX  10    mx1
                                              
ns1                             IN  A         10.0.0.110
                                IN  AAAA      fd00::3:10:0:0:110
                                              
mx1                             IN  A         10.0.0.80
                                IN  AAAA      fd00::3:10:0:0:80
                                              
@                               IN  PTR       imap.nausch.org.
                                IN  PTR       mda.nausch.org.
                                IN  PTR       pop3.nausch.org.
                                IN  PTR       mta.nausch.org.
                                IN  PTR       mx1.nausch.org.

Wie soll es anderes sein, zum Validieren unseres Zone File benutzen wir auch hier das Programm named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone nausch.org /var/named/zones/e.nausch.org.in-addr.db
zone nausch.org/IN: loaded serial 2025122801
OK
zones/e.nausch.org.ip6.db

Abschließend zu guter Letzt benötigen wir auch hier für die IPv6-Reverseauflösung unserer Domain nausch.org ein zugehörige Zone-File, welches wir zum Schluß auch noch anlegen.

 # vim /var/named/zones/e.nausch.org.ip6.db
$TTL 2H                                       ; Defaultwert für die TTL                                 
@                               IN  SOA  ns1  hostmaster.nausch.org.  (
                                2025122801    ; serial - Seriennummer im Format YYYYMMDDnn
                                        1h    ; refresh (1 Stunde)  
                                        15m   ; retry   (15 Minuten)
                                        2W    ; expire  (2 Wochen)  
                                        10m ) ; negative caching TTL (10 Minuten)
                                                                    
                                IN  NS        ns1                   
                                                                    
                                IN  MX  10    mx1                   
                                                                    
ns1                             IN  A         10.0.0.110            
                                IN  AAAA      fd00::3:10:0:0:110    
                                                                    
mx1                             IN  A         10.0.0.80             
                                IN  AAAA      fd00::3:10:0:0:80     
                                                                    
$ORIGIN 0.0.0.0.0.0.0.0.0.1.0.0                                     
                                                                    
0.7.0.0                         IN  PTR         vml000070.nausch.org.
                                IN  PTR         imap.nausch.org.    
                                IN  PTR         mda.nausch.org.     
                                IN  PTR         pop3.nausch.org.    
                                                                    
0.8.0.0                         IN  PTR         vml000080.nausch.org.
                                IN  PTR         mx1.nausch.org.     
                                                                    
0.1.1.0                         IN  PTR         vml000110.nausch.org.
                                IN  PTR         fwc.idmz.nausch.org.
                                                                    
0.1.2.0                         IN  PTR         vml000210.nausch.org.
                                IN  PTR         fwb.idmz.nausch.org.

Wie schon zuvor auch validieren wir hier unseres Zone File mit Hilfe des Programms named-checkzone und prüfen so, ob sich syntaktische Fehler eingeschlichen haben.

 # named-checkzone nausch.org /var/named/zones/e.nausch.org.ip6.db
zone nausch.org/IN: loaded serial 2025122801
OK

Somit haben wir auch hier alle vier benötigten Zonen-Dateien für die Domain/Zone nausch.org fehlerfrei angelegt.

Zum Schluß passen wir noch abschließend die User- und Gruppenberechtigungen unserer gerade angelegten Zonen-Dateien an.

 # chown named: /var/named/zones/*

Somit hat unser Zonen-Verzeichnis aktuell folgende Inhalte.

 # ls -l /var/named/zones/*

Ausgabe des Befehlsaufrufes ls -l /var/named/zones/*

named.conf

Damit unsere anfragenden Clients die von uns gewünschte und legitimierte Antwort bekommen werden wir nun in unser BIND8-Konfigurationsdatei verschiedene Zonen und Views anlegen.

 # vim /etc/named.conf

/etc/named.conf

In oben gezeigtem Konfigurationsbeispiel wurden die entsprechenden Parametere in der Konfigurationsdatei /etc/named.conf jeweils entsprechend beschrieben!

Start des Daemon named

Überprüfen der bisherigen Konfiguration

Bevor wir unseren gerade konfigurierten ISC BIND Nameserver das erste mal starten werden, führen wir mit Hilfe des Programms named-checkconf noch ein paar einzelne Tests durch. Für eine reine Syntaktische Prüfung rufen wird das Programm ohne weitere optionale Parameter auf. Wie unter Unixoiden-Betriebssystem, bedeutet keine Rückmeldung hier alles in Ordung!

 # named-checkconf

Mit der Option -l werden alle konfigurierten Zonen aufgelistet. Jede Ausgabezeile enthält den Zonennamen, die Klasse (z. B. IN), die Ansicht und den Typ (z. B. primär oder sekundär).

 # named-checkconf -l
localhost IN intern master
0.0.127.in-addr.arpa IN intern master
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa IN intern master
. IN intern hint
intra.nausch.org IN intern master
10.0.10.in-addr.arpa IN intern master
7.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa IN intern master
idmz.nausch.org IN intern master
0.0.10.in-addr.arpa IN intern master
3.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa IN intern master
edmz.nausch.org IN intern master
2.17.172.in-addr.arpa IN intern master
0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa IN intern master
nausch.org IN intern master
localhost IN extern master
0.0.127.in-addr.arpa IN extern master
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa IN extern master
. IN extern hint
idmz.nausch.org IN extern master
0.0.10.in-addr.arpa IN extern master
3.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa IN extern master
edmz.nausch.org IN extern master
2.17.217.in-addr.arpa IN extern master
0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa IN extern master
nausch.org IN extern master
131.13.92.217.in-addr.arpa IN extern master
3.0.6.7.d.0.e.0.a.0.0.0.3.0.0.2.ip6.arpa IN extern master

Mit der Option -z erfolgt eine Lade-Test aller Zonen vom Typ „primary“, die in Konfigurationsdatei /etc/named.conf gefunden wurden.

 # named-checkconf -z
zone localhost/IN: loaded serial 42
zone 0.0.127.in-addr.arpa/IN: loaded serial 42
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 42
zone intra.nausch.org/IN: loaded serial 2025122801
zone 10.0.10.in-addr.arpa/IN: loaded serial 2025122801
zone 7.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa/IN: loaded serial 2025122801
zone idmz.nausch.org/IN: loaded serial 2025122801
zone 0.0.10.in-addr.arpa/IN: loaded serial 2025122801
zone 3.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa/IN: loaded serial 2025122801
zone edmz.nausch.org/IN: loaded serial 2025122801
zone 2.17.172.in-addr.arpa/IN: loaded serial 2025122801
zone 0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa/IN: loaded serial 2025122801
zone nausch.org/IN: loaded serial 2025122801
zone localhost/IN: loaded serial 42
zone 0.0.127.in-addr.arpa/IN: loaded serial 42
zone 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa/IN: loaded serial 42
zone idmz.nausch.org/IN: loaded serial 2025122801
zone 0.0.10.in-addr.arpa/IN: loaded serial 2025122801
zone 3.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa/IN: loaded serial 2025122801
zone edmz.nausch.org/IN: loaded serial 2025122801
zone 2.17.217.in-addr.arpa/IN: loaded serial 2025122801
zone 0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa/IN: loaded serial 2025122801
zone nausch.org/IN: loaded serial 2025122801
zone 131.13.92.217.in-addr.arpa/IN: loaded serial 2025122801
zone 3.0.6.7.d.0.e.0.a.0.0.0.3.0.0.2.ip6.arpa/IN: loaded serial 2025122801

Start des named

Da die vorherigen Tests keinerlei Konfigurationsfehler aufzeigten und alle Zone-File richtig geladen werden können, spricht nun nichts mehr dagegen unseren DNS-Daemon named zu starten.

 # systemctl start named.service

Im Journal wir der Start entsprechend dokumentiert.

Protokollierung des bind im journal

Bei Bedarf können wir natürlich auch den Status unseres Daemons jederzeit abfragen.

 # systemctl status named.service

 named.service - Internet domain name server
     Loaded: loaded (/usr/lib/systemd/system/named.service; enabled; preset: disabled)
   Active:active (running) since Sun 2025-12-28 20:26:33 CET; 1min 2s ago
 Invocation: 9d9868c5dfe74ecabdcc8527a7d8713a
   Main PID: 2536 (named)
      Tasks: 14 (limit: 9501)
     Memory: 54.4M (peak: 55.9M)
        CPU: 123ms
     CGroup: /system.slice/named.service
             └─2536 /usr/bin/named -f -u named

Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.973 zoneload: info: zone 0.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa/IN/extern: loaded serial 2025122801
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.973 zoneload: info: zone 3.0.0.0.0.0.0.0.0.0.0.0.0.0.d.f.ip6.arpa/IN/extern: loaded serial 2025122801
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.973 zoneload: info: zone localhost/IN/extern: loaded serial 42
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.977 zoneload: info: zone 2.17.217.in-addr.arpa/IN/extern: loaded serial 2025122801
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.977 zoneload: info: zone 131.13.92.217.in-addr.arpa/IN/extern: loaded serial 2025122801
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.977 zoneload: info: zone 3.0.6.7.d.0.e.0.a.0.0.0.3.0.0.2.ip6.arpa/IN/extern: loaded serial 2025122801
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.977 zoneload: info: zone edmz.nausch.org/IN/extern: loaded serial 2025122801
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.977 general: notice: all zones loaded
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.977 general: notice: FIPS mode is disabled
Dec 28 20:26:33 vml000110 named[2536]: 28-Dec-2025 20:26:33.977 general: notice: running

Alternativ dazu können wir auch einen Blick in die Prozess-Liste werfen um uns zu vergewissern ob der Daemon läuft.

 # ps auxwf | grep named

root        2573  0.0  0.0   7952  6180 pts/1    S+   20:219   0:00  |                   \_ grep --color=auto named
named       2536  0.0  0.8 223856 70648 ?        Ssl  20:26   0:00 /usr/bin/named -f -u named

Wir können jetzt auch schon mit Hilfe des Utility ss abfragen ob der NAMED nun Ports auf zugehörigen Addressen geöffnet hat.

 # ss -tulpn

Ausgabe des Befehls ss -tulpn

Im Logverzeichnis unseres Servers finden wir auch entsprechende zusätzliche Logdateien zu unserem DNS-Daemon named.

 # tree /var/log/named/
/var/log/named//
├── auth_servers
├── client_security
├── ddns
├── default
├── dnssec
├── dnstap
├── named.run
├── queries
├── query-errors
├── rate_limiting
├── rpz
└── zone_transfers

1 directory, 12 files
 # ls -l /var/log/named/
total 12
-rw-r--r-- 1 named named    0 Nov  8 20:26 auth_servers
-rw-r--r-- 1 named named    0 Nov  8 20:26 client_security
-rw-r--r-- 1 named named    0 Nov  8 20:26 ddns
-rw-r--r-- 1 named named 3206 Nov  8 20:26 default
-rw-r--r-- 1 named named  258 Nov  8 20:26 dnssec
-rw-r--r-- 1 named named    0 Nov  8 20:26 dnstap
-rw-r--r-- 1 named named 3464 Nov  8 20:26 named.run
-rw-r--r-- 1 named named    0 Nov  8 20:26 queries
-rw-r--r-- 1 named named    0 Nov  8 20:26 query-errors
-rw-r--r-- 1 named named    0 Nov  8 20:26 rate_limiting
-rw-r--r-- 1 named named    0 Nov  8 20:26 rpz
-rw-r--r-- 1 named named    0 Nov  8 20:26 zone_transfers

In der Datei /var/log/named/default und /var/log/named/named.runfinden wir Informationen zu den geladenen Zonen-Dateien.

 # less /var/log/named/default

Ausgabe des Befehlsaufrufes less /var/log/named/default

 # less /var/log/named/named.run

Ausgabe des Befehlsaufrufes less /var/log/named/namd.run

DNS Abfragen

Nun können wir auch die ersten DNS-Abfragen an unseren BIND9 richten. Rufen wir uns hierzu am besten nochmals die Eingangs angestellten Überlegungen in Erinnerung, die wir im Abschnitt Herausforderungen / Aufgabenstellung angestellt hatten:

In unserer SOHO/HomeLAB Umgebung haben wir ein folgende Zonen, für die wir eine Namensauflösung haben:

  • extern (Internet), Domainspezifisch:
    • nausch.org mit jeweils öffentlichen IP-Adressen (IPv4 und IPv6)
    • und ggf. weitere Domains
  • intern:
    • EDMZ mit privaten Adressen aus dem IPv4- und IPv6-Bereichen
    • IDMZ mit privaten Adressen aus dem IPv4- und IPv6-Bereichen
    • INTRA mit privaten Adressen aus dem IPv4- und IPv6-Bereichen

In unserer Umgebung wollen wir später dafür sorgen, dass je nachdem aus welcher Zone eine Anfrage kommt unterschiedliche Adressen genannt bekommen bzw. unter Umständen einzelne Netzbereich gar ausblenden. Werfen wir kurz einen Blick auf unsere Beispielumgebung:

Bild: symbolischer Netzwerkaufbau mit DNS-Abfragen

Wie wir auf dem Schaubild sehen, sollen bestimmte Adressen, je nachdem von welcher Stelle aus diese abgefragt werden, keine Antwort liefern. So können aus dem Internet lediglich offizielle Adressen erfragt werden, nicht jedoch für Interne Adresse aus den beiden Zonen idmz und intra sowie Anfragen aus der Zone edmz für Adressen aus der Zone intra sollen eben sowenig abfragbar sein. Nur Anfragen aus den beiden Sicherheitszonen idmz und intra sollen für alle Zonen entsprechende Antworten bekommen!

Ferner sollen Anfragen aus den beiden Schutzzonen intra und idmz, welche die offiziellen Domain nausch.org betreffen, als Antwort die „internen“ ULA aus der Zone IDMZ beinhalten, nicht aber die offiziellen GUA-Adressen!

Wir benötigen also einen primary DNS-Server, der als interner DNS-Server für ein privates Netzwerk mit den obigen Zonen agiert. Zusätzlich wollen wir auch noch definieren, wer bei einer Anfrage welche Adresse genannt bekommt. Hierzu werden wir views nutzen, die abhängig von der Stelle aus unserem Netzwerk von dem der Client eine Anfrage startet die passende IP-Adresse genannt bekommt. Ein Client von außen soll also zum Beispiel nach der Frage wie denn die AAAA Adresse von mx1.nausch.org lautet, als Antwort die Adresse 2003:a:e0d:7603:10:0:0:25 bekommen. Ein Client von Intern hingegen soll bei der gleichen Frage aber die Antwort fd00::3:10:0:0:25 bekommen. Realisieren werden wir das wie schon angeschnitten mit unterschiedlichen views für intern und extern.

lokale Abfrage nach einem AAAA-Adresse

Im ersten Beispiel fragen wir den named auf dem IDMZ-Host vml010110, also auf dem Host auf dem der named selbst läuft:

 # dig @::1 AAAA imap.idmz.nausch.org
; <<>> DiG 9.20.17 <<>> @::1 AAAA imap.idmz.nausch.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40417
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 0b05dab57c378407010000006951873afa0f20e982a33d6d (good)
;; QUESTION SECTION:
;imap.idmz.nausch.org.		IN	AAAA

;; ANSWER SECTION:
imap.idmz.nausch.org.	7200	IN	CNAME	vml000070.idmz.nausch.org.
vml000070.idmz.nausch.org. 7200	IN	AAAA	fd00::3:10:0:0:70

;; AUTHORITY SECTION:
idmz.nausch.org.	7200	IN	NS	ns1.idmz.nausch.org.

;; ADDITIONAL SECTION:
ns1.idmz.nausch.org.	7200	IN	AAAA	fd00::3:10:0:0:110
ns1.idmz.nausch.org.	7200	IN	A	10.0.0.110

;; Query time: 0 msec
;; SERVER: ::1#53(::1) (UDP)
;; WHEN: Sun Dec 28 20:38:34 CET 2025
;; MSG SIZE  rcvd: 191

Im Response Header unserer DNS-Anfrage via dig sehen wir mehrere Flags, diese haben folgende Bedeutung:

  • qr (Query Response): Dieses Bit wird gesetzt, wenn das Paket eine Abfrageantwort ist.
  • aa (Authoritative Answer): Die Antwort ist autoritativ, d.h. sie stammt von einem der autoritativen Nameserver für die Domain. Sie stammt nicht von einem Resolver oder DNS-Cache. Dieses Flag sollte nur angezeigt werden, wenn wir einen autoritativen Nameserver direkt mit @nameserver abfragen.
  • rd (Recursion Desired): Die Abfrage wurde mit der Anforderung einer Rekursion gesendet; dies ist das Standardverhalten für dig und macht in den meisten Fällen keinen Unterschied. Wenn der Client (dig) eine Rekursion anfordert und von einem Server beantwortet wird, der diese nicht anbietet, wird kein ra-Flag angezeigt. Wir können das Senden von rd mit dem +norecurse-Flag überschreiben und kann so beim Debuggen bestimmter CNAME-Ketten helfen.
  • cd (Checking Disabled): Die DNSSEC-signierten Antworten werden nicht auf Gültigkeit überprüft.
  • ad (Authenticated Data): Eine Zone ist DNSSEC-signiert und alle RRs, die für die Abfrage relevant sind, wurden validiert.
  • tc (Truncated): Dies signalisiert dem Client, den Versuch über TCP zu wiederholen.

Interessiert uns nur das Ergebnis verwenden wir zusätzlich die Option +short

 # dig @::1 AAAA imap.idmz.nausch.org +short
vml000070.idmz.nausch.org.
fd00::3:10:0:0:70

lokale Abfrage nach einem MX-Adresse

Grundsätzlich können wir alle Records mit Angabe des Typs via DNS anfragen. Mit Angabe des Typ MX können wir nachfragen, wer denn der zuständige Mailserver zur Annahme von eMails für einen Host oder eine Domain ist. Nachfolgend fragen wir nach, wer denn der zuständige Mailserver für die Subdomain idmz.nausch.org ist.

 # dig @::1 MX idmz.nausch.org +short
10 mx1.idmz.nausch.org.

Damit nun ein Client eine eMail auch dort einkippen kann, benötigt er noch die zugehörige IP-Adresse zum Hostnamen mx1.idmz.nausch.org, den dieser nun in einer weiteren DNS-Anfrage ermitteln muß, je nachdem welchen Adresse er benötigt entweder die A bzw die AAAA:

 # dig @::1 A mx1.idmz.nausch.org +short
10.0.0.80

bzw.

 # dig AAAA mx1.idmz.nausch.org. +short
fd00::3:10:0:0:80

Abfragen aus dem Netz-Segment EDMZ - view "extern"

Gemäß unserer Vorüberlegungen zu den Zonen und Views überprüfen wir nun, ob ein Client aus der Schutzzone EDMZ nur die entsprechend in den Vorüberlegungen zu den Herausforderungen / Aufgabenstellung gewünschten Ergebnisse kommen:

AAAA-Record eines Hosts aus der Schutzzone EDMZ
 # dig @10.0.0.110 +short AAAA vml000210.edmz.nausch.org
fd00::172:17:2:210

:OK: Es wird die ULA-Adresse fd00::172:17:2:210 des Hosts vml000210.edmz.nausch.org ausgegeben, nicht aber seine global gültige GUA. :OK:

A-Record eines Hosts aus der Schutzzone EDMZ
 # dig @10.0.0.110 +short A vml000210.edmz.nausch.org
172.17.2.210

:OK: Es wird nur die IPv4-Adresse 172.17.2.210 des Hosts vml000210.edmz.nausch.org ausgegeben. :OK:

IPv6-Reverseauflösung eines Hosts aus der Schutzzone EDMZ
 # dig @10.0.0.110 +short -x fd00::172:17:2:210
fwb.edmz.nausch.org.
vml000210.edmz.nausch.org.

:OK: Es wird sowohl der FQDN wie auch der CNAME der-Adresse fd00::172:17:2:210 ausgegeben. :OK:

IPv4-Reverseauflösung eines Hosts aus der Schutzzone EDMZ
 # dig @10.0.0.110 +short -x 172.17.2.210
fwb.edmz.nausch.org.
vml000210.edmz.nausch.org.

:OK: Es wird sowohl der FQDN wie auch der CNAME der-Adresse 172.17.2.210 ausgegeben. :OK:

AAAA-Record eines Hosts aus der Schutzzone IDMZ
 # dig @10.0.0.110 +short AAAA imap.idmz.nausch.org
vml000070.idmz.nausch.org.
fd00::3:10:0:0:70

:OK: Bei der Frage nach der IPv6-Adresse des Hosts imap.idmz.nausch.org wird uns dessen CNAME und die zugehörige ULA ausgegeben, nicht aber seine global gültige GUA. :OK:

IPv6-Reverseauflösung eines Hosts aus der Schutzzone IDMZ
 # dig @10.0.0.110 +short -x fd00::3:10:0:0:70
pop3.idmz.nausch.org.
mda.idmz.nausch.org.
vml000070.idmz.nausch.org.
imap.idmz.nausch.org.

:OK: Es wird sowohl der FQDN wie auch die weiteren CNAMEs der-Adresse fd00::3:10:0:0:70 ausgegeben. :OK:

IPv4-Reverseauflösung eines Hosts aus der Schutzzone IDMZ
 # dig @10.0.0.110 +short -x 10.0.0.70
mda.idmz.nausch.org.
imap.idmz.nausch.org.
vml000070.idmz.nausch.org.
pop3.idmz.nausch.org.

:OK: Es wird sowohl der FQDN wie auch die weiteren CNAMEs der-Adresse 10.0.0.70 ausgegeben. :OK:

IPv4|6-Auflösung eines Hosts aus der Schutzzone INTRA
 # dig @10.0.0.110 +short A pml010070.intra.nausch.org
 # dig @10.0.0.110 +short AAAA pml010070.intra.nausch.org

:NOK: Wir bekommen bei der Frage nach der IPv4- oder auch der IPv6-Adresse keine Antwort, da in der view diese Adressen exkludiert wurden! :NOK:

Alle Abfragen wurden also gemäß unserer Vorüberlegungen richtig beantwortet. Unsere view extern paßt also soweit!

Abfragen aus dem Netz-Segment INTRA - view "intern"

Gemäß unserer Vorüberlegungen zu den Zonen und Views überprüfen wir nun, ob ein Client aus der Schutzzone EDMZ nur die entsprechend in den Vorüberlegungen zu den Herausforderungen / Aufgabenstellung gewünschten Ergebnisse kommen:

AAAA-Record eines EDMZ-Hosts aus dem Netzsegment EDMZ
 # dig @10.0.0.110 +short AAAA fwb.edmz.nausch.org
vml000210.edmz.nausch.org.
fd00::172:17:2:210

:OK: Es wird der CNAME = vml000210.edmz.nausch.org und die zugehörige ULA-Adresse fd00::172:17:2:210 des Hosts vml000210.edmz.nausch.org präsentiert, nicht aber seine global gültige GUA. :OK:

A-Record eines Hosts aus dem Netzsegment EDMZ
 # dig @10.0.0.110 +short A vml000210.edmz.nausch.org
172.17.2.210

:OK: Es wird nur die IPv4-Adresse 172.17.2.210 des Hosts vml000210.edmz.nausch.org ausgegeben. :OK:

Reverseauflösung eines Hosts aus der Schutzzone IDMZ
 # dig @10.0.0.110 +short -x fd00::3:10:0:0:70
pop3.idmz.nausch.org.
mda.idmz.nausch.org.
vml000070.idmz.nausch.org.
imap.idmz.nausch.org.

:OK: Es wird sowohl der FQDN wie auch die weiteren CNAMEs der-ULA-Adresse fd00::3:10:0:0:70 ausgegeben. :OK:

 # dig @10.0.0.110 +short -x 10.0.0.70
pop3.idmz.nausch.org.
mda.idmz.nausch.org.
vml000070.idmz.nausch.org.
imap.idmz.nausch.org.

:OK: Es wird sowohl der FQDN wie auch die weiteren CNAMEs der-IPv4-Adresse 10.0.0.70 ausgegeben. :OK:

IPv4|6-Auflösung eines Hosts aus der Schutzzone INTRA
 # dig @10.0.0.110 +short AAAA nitro-pc.intra.nausch.org
pml010070.intra.nausch.org
fd00::7:10:0:10:70
 # dig @10.0.0.110 +short A nitro-pc.intra.nausch.org
pml010070.intra.nausch.org
10.0.10.70

:OK: Im Gegensatz zu der Abfrage aus der Schutzzone extern erhalten wir nunmehr ein Antwort auf die Frage nach der IPv4|6-Adresse aus dem Netzsegment internal. :OK:

IPv4|6-Auflösung eines Hosts aus dem Internet
 # dig +short AAAA vml000210.edmz.nausch.org
2003:a:e0d:7600:1720:17:2:210
 # dig +short A dokuwiki.nausch.org
217.92.13.131

:OK: Im Gegensatz zu der Abfrage aus der Schutzzone edmz erhalten wir nunmehr ein Antwort mit demn offiziellen IPv4 und IPv6-Adressen. :OK:

Alle Abfragen wurden also gemäß unserer Vorüberlegungen richtig beantwortet. Unser Nameserver antwortet also entsprechend unserer Vorgaben.

Pflege einer Zone

Im Laufe eines Betriebes kommt es gewöhnlich ab und an vor, dass sich Adressen ändern, bzw. Hosts dazukommen oder auch wieder abgebaut werden. Wir schauen uns nun den Fall an, dass ein neuer Client in unserem Netzwerk neu eingebracht werden soll:

  • Nodename: pnc010023
  • Alias: apc-usv
  • IPv4: 10.0.10.23
  • IPv6: fd00:0:0:7:10:0:10:23

Dazu erweitern wir unsere bereits bestehenden Zonendateien:

  • i.intra.nausch.org.db für die forward-Auflösungen für IPv4 und IPv6
  • i.intra.nausch.org.in-addr.db für die IPv4 reverse-Auflösung und
  • i.intra.nausch.org.ip6.db
 # vim /var/named/zones/i.intra.nausch.org.db

Zonen-Datei : i.intra.nausch.org.db

 # vim /var/named/zones/i.intra.nausch.org.in-addr.db

Zonen-Datei : i.intra.nausch.org.in-addr.db

 # vim /var/named/zones/i.intra.nausch.org.ip6.db

Zonen-Datei : i.intra.nausch.org.ip6.db

WICHTIG:
Bei Änderungen an den Zonen-Dateien ist es zwingend notwendig die Seriennummer (im Format YYYYMMDDnn anzupassen bzw. hochzuzählen, da sonst unser bind9 das Neuladen der veränderten Zonen-Dateien mit Hilfe von rndc reload wie im nachfolgenden Beispiel verweigern und dies im Journal entsprechend dokumentieren würde!

Dec 28 22:12:25 vml000110 named[2981]: 28-Dec-2025 22:12:20.250 zoneload: error: zone intra.nausch.org/IN/intern: zone serial (2025122801) unchanged. zone may fail to transfer to secondaries.

Klar man könnte den named auch neu starten und so das Laden aller Zonen-Dateien, unabhängig davon ob diese verändert wurden oder nicht, erzwingen. Nur würden dabei auch alle gecachten (externen) Ziele verworfen werden und in aller Regel ist das bei höher frequentierten bind alles andere als gewünscht!

Bevor wir jedoch unsere geänderten Zone-Files neu laden checken wir diese auf syntaktische Fehler!

 # named-checkzone intra.nausch.org /var/named/zones/i.intra.nausch.org.db
dns_rdata_fromtext: /var/named/zones/i.intra.nausch.org.db:2: near '20251228022': out of range
zone intra.nausch.org/IN: loading from master file /var/named/zones/i.intra.nausch.org.db failed: out of range
zone intra.nausch.org/IN: not loaded due to errors.

Hoppala, da hat sich doch glett ein Fehler eingeschlichen. Statt 2025122802 hatten wir 20251228022 eingegeben, also eine Stelle zu viel. Wir korrigieren also die Seriennummer und prüfen erneut:

 # named-checkzone intra.nausch.org /var/named/zones/i.intra.nausch.org.db
zone intra.nausch.org/IN: loaded serial 2025122802
OK

Alles klar und passt es wieder und wir können die anderen Zonenfiles auch noch entsprechend prüfen.

 # named-checkzone intra.nausch.org /var/named/zones/i.intra.nausch.org.in-addr.db
zone intra.nausch.org/IN: loaded serial 2025122802
OK

sowie

 # named-checkzone intra.nausch.org /var/named/zones/i.intra.nausch.org.ip6.db
zone intra.nausch.org/IN: loaded serial 2025122802
OK

Da nun alle drei erweiterten Zonenfiles passen, laden wir nun die geänderten Zonendateien durch einen rndc reload:

 # rndc reload

Im Journal unseres BIND9-Hosts wird dies entsprechend dokumentiert:

DNSSEC

Theorie

DNS-Anfragen auf Port 53, egal ob nun via TCP oder UDP übertragen, können grundsätzlich von einem Angreifer z.B. durch DNS-Spoofing oder Cache Poisoning manipuliert werden, da diese ungesichert übertragen werden. Ziel ist jeweils dabei, daß bei einer Abfrage eine falsche IP-Adresse übermittelt wird, um den Nutzer auf eine manipulierte Website zu leiten. Es wäre als möglich, daß bei der DNS-Anfrage für die Adresse der Hausbank, ein Angreifer die Adresse einer Phising-Seite uns unterjubelt. Jetzt könnte man einwenden: „Ja, warum verschlüsseln wir den Transportkanal nicht einfach?“ Nun, wir wüsten dann zwar, daß wir die DNS-Kommunikation zwar verschlüsselt haben, aber viel wichtiger wäre doch, daß wir uns sicher sein können, daß unsere Antwort entsprechend valide ist und hier bietet sich die DNSSEC-Unterstützung des ISC (Internet System Consortium) an.

DNSSEC wurde im RFC 9364 diskutiert und definiert. DNSSEC fügt eine Schicht digitaler Signaturen hinzu, die sicherstellt, dass die DNS-Antworten, die man erhält, authentisch sind und nicht manipuliert wurden. DNSSEC steht für Domain Name System Security Extensions mit dem das herkömmlichen Domain Name Systems (DNS) erweitert wurde.

Die Erweiterung DNSSEC wurde als Sicherheitsmechanismus eingeführt, um die Echtheit (Authentizität) und die Vollständigkeit (Integrität) der Daten von DNS-Antworten sicherzustellen, so daß diese nicht unerkannt manipuliert werden können.

Folgende Vorteile versprechen wir uns nun beim Einsatz von DNSSEC:

  • Sicherheit: Durch die Nutzung digitaler Signaturen schützt DNSSEC vor Manipulationen und stellt so die Authentizität der DNS-Antworten sicher.
  • Vertrauenswürdigkeit: DNSSEC kann das Vertrauen der Nutzer bei der Kommunikation im Internet erhöhen, da es hilft sicherzustellen, das die Adressen, die per DNS-Anfragen ermittelt wurden, echt sind.
  • Privatsphäre: DNSSEC hilft die Privatsphäre zu schützen indem es die Möglichkeit von Man-in-the-Middle-Angriffen verringert.

Doch wie läuft nun das Signieren und Validieren der DNS-Antworten ab? Wie wir schon eingangs festgehalten haben, hilft DNSSEC die Authentizität und Integrität von DNS-Antworten zu gewährleisten. Hierzu signiert der zuständige DNS-Server die Antworten die er verschickt mit einer digitalen Signatur, welche er dann mit den DNS-Antwortdaten verschickt.

Dem ganzen Signaturprozess liegen folgende Dinge zu Grunde:

  • Schlüsselerstellung: Zunächst werden zwei Schlüsselpaare benötigt, die erzeugt werden müssen und zwar den ZSK (Zone Signing Key) und den KSK (Key Signing Key). Der längere KSK Schlüssel hat dabei i.D.R. eine lange Lebensdauer, der kürzere ZSK hingegen eine kürzere Lifetime. Der ZSK, welcher durch den KSK signiert wurde, wird für das Signieren der DNS-Einträge verwendet. Der KSK hat eine höhere Sicherheitsstufe und wird ausschließlich verwendet um den ZSK zu signieren. Dies stellt sicher, das selbst bei einer Kompromittierung des ZSK der KSK sicher bleibt, vorausgesetzt dieser wird sicher außerhalb des direkt zugänglichen Systems gespeichert!
    Alternativ zu den beiden Schlüssel (ZSK und KSK) kann auch ein sogenannter Combined Signing Key (CSK) zur Anwendung kommen. Bind bringt seit Version 9.16 eine eingebaute policy default mit und verwendet einen einzelnen ECDSAP256SHA-Schlüssel (kombinierter Signaturschlüssel (CSK), der sowohl die Aufgaben eines KSK als auch eines ZSK erfüllt, auch bekannt als Single Type Signing Scheme.
  • Signatur: Bevor der DNS-Server seine Antwort verschickt signiert er diese Daten mit dem privaten Schlüssel des ZSK. In der Antwort an den anfragenden Client befinden sich dann die Antwortdaten zusammen mit der erzeugten Signatur und auch dem public key des ZSK.
  • Validierung auf Clientseite: Der empfangende DNS-Resolver, meist ist dies der DNS-Server des Internetanbieters oder ein spezialisierter DNSSEC-Resolver wie unbound nutzt dann den public key des ZSK für die Überprüfung der Authentizität und Integrität der Antwort. Sofern diese Prüfung erfolgreich abgeschlossen wurde, kann der Resolver und somit auch der Nutzer sicher sein, daß die Antwort echt ist und nicht manipuliert wurde. Die Installation und Konfiguration von unbound werden wir uns noch in einem eigenen Artikel hier noch im Detail ansehen.

Schlüsselverzeichnis anlegen

Für die Ablage und Bevorratung des automatisch generierten KSK und ZSK Schlüsselmaterials legen wir uns nun noch ein entsprechendes (Unter-)Verzeichnis an.

 # mkdir /var/named/keys

Hier passen wir noch die Berechtigung des gerade angelegten Verzeichnisses an.

 # chmod 770 /var/named/keys

Zu guter Letzt korrigieren wir noch die User- und Gruppenberechtigungen unseres neuen Unterverzeichnisses für die Zonen-Dateien.

 # chown named: /var/named/keys

DNSSEC in der /etc/named.conf konfigurieren

Im Abschnitt named.conf bei der Basis-Konfiguration hatten wir bereits einen Abschnitt für die Schlüssel vorbereitet.

  // Das Verzeichnis, in dem sich die öffentlichen und privaten
  // DNSSEC-Schlüsseldateien befinden sollen.
  key-directory "/var/named";

Diesen passen wir nun an und hinterlegen hier das neu angelegte Unterverzeichnis /var/named/keys für die Schlüssel.

 # vim /etc/named.conf

  // Das Verzeichnis, in dem sich die öffentlichen und privaten
  // DNSSEC-Schlüsseldateien befinden sollen.
  key-directory "/var/named/keys";

Mit BIND 9.16 wurde eine neue Methode zur Aufrechterhaltung von DNSSEC bei den Zonen eingeführt. Zusätzlich zu den Konfigurationsoptionen inline-signing und auto-dnssec gibt es jetzt dnssec-policy.

Wichtig:
auto-dnssec wurde seit der Entwicklungsversion 9.19.16 und seit der Version 9.20.0 entfernt!
auto-dnssec wurde somit durch dnssec-policy ersetzt!

Mit Hilfe der dnssec-policy können wir nun eine Schlüssel- und Signaturrichtlinie (KASP) angeben und so auf einfache Art und Weise alle KASP-bezogenen Konfigurationen zusammenfassen. Die Aktivierung von DNSSEC für unsere Zonen ist somit intuitiver als bei früheren BIND-Versionen! Dank der dnssec-policy brauchen wir nicht mehr manuell wie in früheren Versionen für jede Zone zwei Schlüsselpaare generieren und zwar den ZSK (Zone Signing Key) und den KSK (Key Signing Key). Alternativ zu den beiden Schlüssel (ZSK und KSK) kann auch ein sogenannter Combined Signing Key (CSK) zur Anwendung kommen, der dann zur Weitergabe als DS-Record und zum Signieren der DNS-Antworten herangezogen wird. Bind bringt seit Version 9.16 eine eingebaute policy default mit und verwendet einen einzelnen ECDSAP256SHA-Schlüssel (kombinierter Signaturschlüssel (CSK), der sowohl die Aufgaben eines KSK als auch eines ZSK erfüllt, auch bekannt als Single Type Signing Scheme.

Sofern der CSK der jeweils übergeordneten Domain zur Verfügung gestellt wird, können damit nunmehr alle Schlüssel der eigenen Zone signiert und genutzt werden. Alle weiteren Daten aus der Zone werden ebenso mit diesem CSK signiert. Sofern unser named vollständig für alle Zonen DNSsec enabled wird, wird dieser auch nur noch entsprechend signierte Antworten liefern.

Die policy default ist hier eine integrierte Richtlinie (policy). Dadurch wird wie beschrieben jeweils ein einzelner ECDSAP256SHA-Schlüssel und zugehörige Signaturen für die betreffende Zonen eingeführt; dabei wird zur NSEC zur Denial-of-Existence-Funktion verwendet. NSEC ist in RFC 5155 definiert worden. Mit den Domain Name System Security (DNSSEC)-Erweiterungen wurde der NSEC-Ressourceneintrag (RR) für die authentifizierte Denial-of-Existence-Funktion eingeführt. Wollen wir NSEC3, welches ebenso wie NSEC im RFC 5155 definiert wurde, zur Denial-of-Existence-Funktion zur Konfiguration von nicht existierenden DNS-Einträgen verwendend, legen wir uns eine eigene policy an. Weitere Informationen rund um Proof of Non-Existence mit Hilfe von NSEC und NSEC3 finden sich in der entsprechenden Original-Dokumentation.

Wir erweitern also wie in der ISC Dokumentation beschrieben unsere Konfigurationsdatei /etc/named.conf und legen uns dort eine eigne separate policy an.

 # vim /etc/named.conf

Bis jetzt sah die Definition der Domain intra.nausch.org in unserem Konfigurationsbeispiel wie folgt aus.

  // View: intern - Zone: intra.nausch.org (forward)
  zone "intra.nausch.org" IN {
    type master;
    file "zones/intra.nausch.org.db";
  };

Diese Definitionen bei den einzelnen Zone-Definitions erweitern wir nun noch durch die Option dnssec-policy "ownway", deren Policy wir zuvor angelegt hatten.

Beispiel:

# vim /etc/named.conf

  // View: intern - Zone: intra.nausch.org (forward)
  zone "intra.nausch.org" IN {
    type master;
    file "zones/intra.nausch.org.db";
    dnssec-policy "ownway"
  };

Mit Hilfe unserer eigenen policy ownway wird nun nur ein einzelner ECDSAP256SHA-Schlüssel und zugehörige Signaturen für die betreffende Zone intra.nausch.org eingeführt; dabei wird zur NSEC3 zur Denial-of-Existence-Funktion verwendet. NSEC3 ist in RFC 5155 definiert worden. Mit den Domain Name System Security (DNSSEC)-Erweiterungen wurde der NSEC3-Ressourceneintrag (RR) für die authentifizierte Denial-of-Existence-Funktion eingeführt.

Die nachfolgenden Zeilen fügen wir zwischen der Definition der statistic-channels und der view-Definitionen ein:

 # vim /etc/named.conf

  // ************** Definition einer eigenen policy für DNSSEC **************
dnssec-policy "ownway" {          
  keys {
  // Combined Signing Key CSK lifetime und Key Algorithmus                
  // Definition des standardmäßigen Speicherorts der automatisch generierten
  // Schlüsseldateien. Ferner kann  die lifetime angegeben sowie der zu ver-
  // wendendeten Algorithus angegeben werden.
    csk key-directory lifetime unlimited algorithm ecdsa256;              
  };

  // Gibt an, ob BIND 9 eine separate signierte Version einer Zone verwaltet.                          
  // Die Verwendung von Inline-Signing wird durch die dnssec-policy für die 
  // Zone bestimmt. Wenn Inline-Signing in Zone explizit auf yes oder no 
  // gesetzt wird, überschreibt dies jeden Wert von dnssec-policy.
  inline-signing yes;

  // Proof of Non-Existence mit Hilfe von NSEC3
  // Alles nach nsec3param ist optional. Werden diese nicht explizit defi-
  // niert, verwendet BIND 9 Standardwerte. Will man jedoch sicherstellen
  // dass die Parameter mit entsprechend vorgegebenen bzw. vorhandenen 
  // NSEC3-Parametern übereinstimmen, sind diese explizit festzulegen. 
  // Zu beachten ist, dass man kein bestimmtes Salt defionieren kann. sofern
  // ein vorhandene Salt jedoch dieselbe Länge wie salt-length hat, ent-
  // spricht es der Richtlinie und es erfolgt kein erneutes Salting.
  nsec3param iterations 0 optout no salt-length 0;

   // Schlüssel-Timing-Informationen
  // Zu beachten ist, dass dnssec-policy zwar Schlüssel-Timing-Informationen
  // festlegt, aber eine eigene state-machine verwendet, um zu bestimmen, 
  // welche Aktionen ausgeführt werden sollen.
  dnskey-ttl PT1H;  
  publish-safety PT1H;
  retire-safety PT1H;
  purge-keys P90D;

  // Signature-Timing-Informationen
  signatures-refresh P5D;
  signatures-validity P14D;
  signatures-validity-dnskey P14D;
                    
  // Zonen Parameter
  max-zone-ttl P1D; 
  zone-propagation-delay PT5M;    
  parent-ds-ttl P1D;
  parent-propagation-delay PT1H;  
}; 

Bevor wir unseren gerade konfigurierten Änderungen durch einen Neustart des named aktivieren führen wir mit Hilfe des Programms named-checkconf noch einen Check auf Syntaxfehler durch und lassen uns mit der Option -l werden alle konfigurierten Zonen aufgelisten. Jede Ausgabezeile enthält den Zonennamen, die Klasse (z. B. IN), die Ansicht und den Typ (z. B. primär oder sekundär). Mit der Option -z erfolgt eine Lade-Test aller Zonen vom Typ „primary“, die in Konfigurationsdatei /etc/named.conf gefunden wurden.

 # named-checkconf -lz 

Ausgabe des Befehlsaufrufes named-checkconf -lz

Aktivierung des Änderungen

Nun aktivieren wir unsere Konfigurationsänderungen rund um DNSSEC und den Combined Signing Keys CSK durch einen Neustart des named.

 # systemctl restart named.service

Im Journal wird der erfolgreiche Neustart entsprechend protokolliert.

 # journalctl -fu named

Ausgabe des Befehlsaufrufes journalctl -fu named

Die, beim ersten Neustart nach Änderung der Konfiguration für die DNSSEC-Unterstützung, auflaufenden error … could not get zone keys for secure dynamic update-Meldungen können erst einmal ignoriert werden, da dies lediglich ein Hinweis ist, dass noch keine Schlüssel existieren und sich der Nameserver um die Schlüsselerstellung selbst noch vornehmen muss.

Errormeldungen in Journal zu fehlendem Schlüsselmaterial

Achtung:
Bei einem Neustart des Daemon werden alle gecachten DNS-Informationen verworfen!

Besser ist es die geänderte Konfiguration - in dem gezeigtem Beispiel zur Aktivierung der DNSSEC-Konfigurationsoptionen - mit Hilfe eines rndc reconfig die gänderte Konfigurations neu einlesen und somit die Zonen-Dateien signieren zu lassen:

 # rndc reconfig

In unserem Schlüsselverzeichnis /var/named/keys/ wurden nun automatisiert die beiden Schlüsseldateien und eine State-Dateioabgelegt.

 # ls -l /var/named/keys/

Ausgabe des Befehlsaufruf ls -l /var/named/keys/

Wollen wir wissen welche Datei in dem Key-Verzeichnis für welche Zone das Schlüsselmaterial bereitstellt, können wir dies wie folgt abrufen:

 # grep key-signing /var/named/keys/*

/var/named/keys/Kintra.nausch.org.+013+38203.key:; This is a key-signing key, keyid 38203, for intra.nausch.org.

Immer wenn wir named neu konfigurieren, um eine dnssec-Richtlinie einzuführen, die den bereits vorhandenen Schlüsseln entspricht, werden deren Schlüsseldateien beibehalten, sodass diese weiterhin zur Verwaltung der DNSSEC-Signaturen der betreffenden Zone verwendet werden kann. Darüber hinaus erstellt named die zugehörigen dnssec-policy Statusdateien, die für jeden Schlüssel benötigt werden - in unserem Beispiel hier intra.nausch.org.+013+38203.key.state. Diese Datei enthält alle Informationen, die zur Bestimmung der nächsten Aktion in Bezug auf die Schlüsselwartung erforderlich sind. Die ersten fünf Zeilen bestimmen die Rolle des Schlüssels: Dieser Schlüssel ist ein 256-Bit-ECDSA256-KSK für die Zone intra.nausch.org, für die keine Gültigkeitsdauer festgelegt ist. Als Nächstes gibt es eine Reihe von Zeitangaben darüber, wann dieser Schlüssel voraussichtlich veröffentlicht wird, wann er mit dem Signieren beginnen sollte und wann der CDS (und CDNSKEY) veröffentlicht werden sollte. Wir verfolgen auch, wann sich der Status der Zustandsmaschine für verschiedene Ressourceneinträge geändert hat und in welchem Status sie sich befinden ("hidden", "rumoured", "omnipresent" oder "unretentive").

 # bat /var/named/keys/Kintra.nausch.org.+013+38203.state

Ausgabe des Befehlsaufrufes bat /var/named/keys/Kintra.nausch.org.+013+38203.state

DNSSEC-Abfragen

Nun können wir auch die ersten DNS-Abfragen an unseren BIND9 richten und prüfen ob wir eine Signierte Antwort erhalten.

 # dig @::1 nitro-pc.intra.nausch.org +dnssec +multi
; <<>> DiG 9.20.17 <<>> @::1 nitro-pc.intra.nausch.org +dnssec +multi
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59154
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
; COOKIE: 28fc548affd50c99010000006952b5229c21c8fc43d8bdb2 (good)
;; QUESTION SECTION:
;nitro-pc.intra.nausch.org. IN A

;; ANSWER SECTION:
nitro-pc.intra.nausch.org. 7200	IN CNAME pml010070.intra.nausch.org.
nitro-pc.intra.nausch.org. 7200	IN RRSIG CNAME 13 4 7200 (
				20260112134922 20251229155642 38203 intra.nausch.org.
				vzNR/h72McVXVnigFsNopnfngdM6gqKEIBSPXGvPjc8V
				NaYem3jukD87Ku0/FLlCvhiOmkzK44gPYZzSxwPClA== )
pml010070.intra.nausch.org. 7200 IN A 10.0.10.70
pml010070.intra.nausch.org. 7200 IN RRSIG A 13 4 7200 (
				20260112051215 20251229155642 38203 intra.nausch.org.
				EPNJqwuxGoBVxS8LVklrjCLr1eTVJ7gf7AV+wl4WvyqN
				3u6SApk9E15DXhHPQjS4Yeg9cf3autuepAQxQ62lMQ== )

;; AUTHORITY SECTION:
intra.nausch.org.	7200 IN	NS ns1.intra.nausch.org.
intra.nausch.org.	7200 IN	RRSIG NS 13 3 7200 (
				20260112134922 20251229155642 38203 intra.nausch.org.
				cjjYs8JpvBjYMLlwcV76AzNWiNO8jFbl4Jk8BUXcXY3g
				9BZ5KZmgg4vctijChCNhauwl0qsguFGogBAzd4Gfxg== )

;; ADDITIONAL SECTION:
ns1.intra.nausch.org.	7200 IN	A 10.0.10.110
ns1.intra.nausch.org.	7200 IN	RRSIG A 13 4 7200 (
				20260112051215 20251229155642 38203 intra.nausch.org.
				ijRNSuzdjBLDPE6T0dVGlc3C1Uuh3QEXH4yaQQHbCoIB
				/1fA4sfFcmRZN3ZrYItEBE32KMJOMmn7UB4edQYEtg== )

;; Query time: 0 msec
;; SERVER: ::1#53(::1) (UDP)
;; WHEN: Mon Dec 29 18:06:42 CET 2025
;; MSG SIZE  rcvd: 604

Wichtig:
Das Ad-Flag ist bei unserem authoritativen DNS-Servern nicht gesetzt! Dieses Flag wird nur bei rekursiven Resolvern wie z.B. bei Verwendung des Unbound gesetzt, da nur durch diesen die Trust-Of-Chain abgefragt und aufgelöst werden kann! Der Einrichten eines lokalen DNS-Resolvers mit Unbound unter Arch Linux werden wir uns in einem gesonderten Kapitel widmen.

Wir erhalten hier eine ausführliche Ausgabe inklusive der Signaturinformationen bei der AUTHORITY SECTION und ADDITIONAL SECTION, da wir in unserer Konfigurationsdatei die Option minimal-responses auf no gesetzt haben.

  // Das Verzeichnis, in dem sich die öffentlichen und privaten
  // Wird folgender Parameter auf "yes" gesetzt, dann fügt der Server
  // bei der Generierung von Antworten nur dann Datensätze zur authority
  // und additional data sections hinzu, wenn sie benötigt werden.
  minimal-responses no;

Setzen wir hingegen die Option minimal-responses auf yes wird uns „nur noch“ folgende Antwort übermittelt:

 # dig @::1 nitro-pc.intra.nausch.org +dnssec +multi
; <<>> DiG 9.20.17 <<>> @::1 nitro-pc.intra.nausch.org +dnssec +multi
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 14618
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
; COOKIE: cd2d89195349eb00010000006952b5f0ff61a253f4356d39 (good)
;; QUESTION SECTION:
;nitro-pc.intra.nausch.org. IN A

;; ANSWER SECTION:
nitro-pc.intra.nausch.org. 7200	IN CNAME pml010070.intra.nausch.org.
nitro-pc.intra.nausch.org. 7200	IN RRSIG CNAME 13 4 7200 (
				20260112134922 20251229155642 38203 intra.nausch.org.
				vzNR/h72McVXVnigFsNopnfngdM6gqKEIBSPXGvPjc8V
				NaYem3jukD87Ku0/FLlCvhiOmkzK44gPYZzSxwPClA== )
pml010070.intra.nausch.org. 7200 IN A 10.0.10.70
pml010070.intra.nausch.org. 7200 IN RRSIG A 13 4 7200 (
				20260112051215 20251229155642 38203 intra.nausch.org.
				EPNJqwuxGoBVxS8LVklrjCLr1eTVJ7gf7AV+wl4WvyqN
				3u6SApk9E15DXhHPQjS4Yeg9cf3autuepAQxQ62lMQ== )

;; Query time: 0 msec
;; SERVER: ::1#53(::1) (UDP)
;; WHEN: Mon Dec 29 18:10:08 CET 2025
;; MSG SIZE  rcvd: 346

Das gleich würden wir auch bei gesetzter Option minimal-responses auf no bekommen, wenn wir bei der Abfrage mittels dig die Option +noauth verwenden würden.

 # dig @::1 nitro-pc.intra.nausch.org +dnssec +multi +noauth
; <<>> DiG 9.20.17 <<>> @::1 nitro-pc.intra.nausch.org +dnssec +multi +noauth
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31493
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
; COOKIE: 2098a3974a3686a7010000006952b66ed8ac37e1be73d242 (good)
;; QUESTION SECTION:
;nitro-pc.intra.nausch.org. IN A

;; ANSWER SECTION:
nitro-pc.intra.nausch.org. 7200	IN CNAME pml010070.intra.nausch.org.
nitro-pc.intra.nausch.org. 7200	IN RRSIG CNAME 13 4 7200 (
				20260112134922 20251229155642 38203 intra.nausch.org.
				vzNR/h72McVXVnigFsNopnfngdM6gqKEIBSPXGvPjc8V
				NaYem3jukD87Ku0/FLlCvhiOmkzK44gPYZzSxwPClA== )
pml010070.intra.nausch.org. 7200 IN A 10.0.10.70
pml010070.intra.nausch.org. 7200 IN RRSIG A 13 4 7200 (
				20260112051215 20251229155642 38203 intra.nausch.org.
				EPNJqwuxGoBVxS8LVklrjCLr1eTVJ7gf7AV+wl4WvyqN
				3u6SApk9E15DXhHPQjS4Yeg9cf3autuepAQxQ62lMQ== )

;; ADDITIONAL SECTION:
ns1.intra.nausch.org.	7200 IN	A 10.0.10.110
ns1.intra.nausch.org.	7200 IN	RRSIG A 13 4 7200 (
				20260112051215 20251229155642 38203 intra.nausch.org.
				ijRNSuzdjBLDPE6T0dVGlc3C1Uuh3QEXH4yaQQHbCoIB
				/1fA4sfFcmRZN3ZrYItEBE32KMJOMmn7UB4edQYEtg== )

;; Query time: 0 msec
;; SERVER: ::1#53(::1) (UDP)
;; WHEN: Mon Dec 29 18:12:14 CET 2025
;; MSG SIZE  rcvd: 604

Wollen wir den zugehörigen DNSKEY des Combined Signing Key CSK einer DNS ZONE (Sub-)Domain abfragen, verwenden wir folgende Abfrage:

# dig @::1 intra.nausch.org dnskey +dnssec +multi +cd
; <<>> DiG 9.20.17 <<>> @::1 intra.nausch.org dnskey +dnssec +multi +cd
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24578
;; flags: qr aa rd ra cd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags: do; udp: 4096
; COOKIE: 522a78e9e80fd45e010000006952b68c3d5b665f76cb2a3f (good)
;; QUESTION SECTION:
;intra.nausch.org.	IN DNSKEY

;; ANSWER SECTION:
intra.nausch.org.	3600 IN	DNSKEY 257 3 13 (
				j2IsY0Q8VPBSai3wC1x0ds2hv7u/6U5bHj0yKLTZsWBl
				bhFLDm4tdoNjyaRERr1xkN4lMxIozLDTJEaB1Q5kzg==
				) ; KSK; alg = ECDSAP256SHA256 ; key id = 38203
intra.nausch.org.	3600 IN	RRSIG DNSKEY 13 3 3600 (
				20260112165642 20251229155642 38203 intra.nausch.org.
				+WVGoQQlyTs8FsVzPxnMTmAo2KZgretH1IuFmvYzFNZ9
				iDEh/xuxjAT0XFwvkf7483QnDjdbSMeA/IZcNQx/iA== )

;; Query time: 0 msec
;; SERVER: ::1#53(::1) (UDP)
;; WHEN: Mon Dec 29 18:12:44 CET 2025
;; MSG SIZE  rcvd: 265

Pflege der DNSSEC signierten Zonen-Datei(en)

Wie schon bei unserem ersten Konfigurationsbeispiel und der Pflege einer Zone (ohne DNSSEC) können wir auch bei einer DNSSEC signierten Zonen-Datei manuell diese Dateien bearbeiten und verändern.

WICHTIG:
Da die einzelnen Zonendateien mit Hilfe von DNSSEC signiert wurden, können diese nicht mehr so ohne weiteres im laufenden Betrieb bearbeitet werden! Der laufende dynamische named quittiert dies mit folgender Fehlermeldung:

Sollen die Zonendaten/Zonendateien eines dynamischen DNS-Servers im laufenden Betrieb editiert werden, führt dies beim nächsten Start des named zu der Fehlermeldung:

Nov 09 16:17:18 vml000110 named[1971]: 09-Nov-2024 16:17:18.148 journal rollforward failed: journal out of sync with zone

Die manuellen Änderungen an den Zonendaten/Zonendateien können so nicht übernommen werden!

Mithilfe des Befehls rndc freeze können wir den aktuellen Stand einfrieren und damit eine Aktualisierungen einer dynamischen Zone aussetzen. Wird keine Zone angegeben, werden alle Zonen eingefroren/ausgesetzt. Dadurch können bei Bedarf manuelle Änderungen an einer Zone vorgenommen werden, die normalerweise durch eine dynamische Aktualisierung aktualisiert wird und es werden Änderungen in der Journal-Datei mit der Master-Datei synchronisiert. Alle dynamischen Aktualisierungsversuche werden, während die Zone eingefroren ist, abgelehnt!

 # rndc freeze intra.nausch.org

Im Journal wird dies entsprechend dokumentiert.

Dec 29 18:15:39 vml000110 named[4659]: 29-Dec-2025 18:15:39.896 general: info: received control channel command 'freeze intra.nausch.org'

Nun können wir wie gewohnt das betreffende Zone-File editieren.

 # vim /var/named/zones/i.intra.nausch.org.db

Zum Auftauen thaw einer zuvor eingefrorenen Zone oder view verwenden wir den Befehl rndc thaw. Wenn keine Zone angegeben wird, werden alle eingefrorenen Zonen aktiviert. Dadurch wird der Server veranlaßt, die Zone von der Festplatte neu zu laden, und dynamische Aktualisierungen werden nach Abschluß des Ladevorgangs wieder aktiviert. Nach dem Auftauen einer Zone werden dynamische Aktualisierungen nicht mehr abgelehnt.

 # rndc thaw intra.nausch.org

Der Auftauvorgang thaw wurde natürlich auch wieder im Journal festgehalten:

Dec 29 18:20:56 vml000110 named[4659]: 29-Dec-2025 18:20:56.341 general: info: received control channel command 'thaw intra.nausch.org'
Dec 29 18:20:56 vml000110 named[4659]: 29-Dec-2025 18:20:56.345 general: info: thawing zone 'intra.nausch.org/IN' intern: success

Pflege von DNSSEC signierten dynamischen Zonen mit Hilfe von nsupdate

Hintergründe

BIND9 stellt für die dynamischen DNS-Aktualisierung von dynamischen Zonen das Hilfsprogramm nsupdate zur Verfügung. In der Manpage von nsupdate finden sich viele hilfreiche Tips zum Umgang mit dem Hilfsprogramm.

nsupdate wird verwendet, um Dynamic DNS Update-Anfragen, wie in RFC 2136 definiert, an einen Namenserver zu senden. Dadurch können Ressourceneinträge zu einer Zone hinzugefügt oder daraus entfernt werden, ohne die Zonendatei manuell zu bearbeiten. Eine Singleupdate-Anfrage kann Anfragen zum Hinzufügen oder Entfernen von mehr als einem Ressourceneintrag enthalten.

Zonen, die über nsupdate oder einen DHCP-Server dynamisch gesteuert werden, sollten nicht mehr manuell bearbeitet werden. Manuelle Änderungen könnten mit dynamischen Aktualisierungen in Konflikt geraten und zu Datenverlust führen!

Die Ressourceneinträge, die mit nsupdate dynamisch hinzugefügt oder entfernt werden, müssen sich in derselben Zone befinden. Anfragen werden an den primären Server der Zone gesendet, der durch das MNAME-Feld des SOA-Eintrags der Zone identifiziert wird. Transaktionssignaturen können zur Authentifizierung der dynamischen DNS-Aktualisierungen verwendet werden. Diese verwenden den TSIG-Ressourceneintragstyp, der in RFC 2845 beschrieben wird, den SIG(0)-Eintrag, der in RFC 2535 und RFC 2931 beschrieben wird, oder GSS-TSIG, wie in RFC 3645 beschrieben.

TSIG basiert auf einem gemeinsamen Geheimnis, das nur nsupdate und dem Namensserver bekannt sein sollte. Beispielsweise werden geeignete Schlüssel- und Serveranweisungen zu /etc/named.conf hinzugefügt, damit der Namensserver den entsprechenden geheimen Schlüssel und Algorithmus mit der IP-Adresse der Client-Anwendung verknüpfen kann, die die TSIG-Authentifizierung verwendet. ddns-confgen kann geeignete Konfigurationsfragmente generieren. nsupdate verwendet die Optionen -y oder -k, um den gemeinsamen TSIG-Schlüssel bereitzustellen; diese Optionen schliessen sich gegenseitig aus. SIG(0) verwendet die Kryptografie mit öffentlichem Schlüssel. Um einen SIG(0)-Schlüssel zu verwenden, muss der öffentliche Schlüssel in einem KEY-Datensatz in einer Zone gespeichert werden, die vom Namensserver bedient wird. GSS-TSIG verwendet Kerberos-Anmeldeinformationen. Der Standard-GSS-TSIG-Modus wird mit der Option -g aktiviert.

Konfiguration

Für den Update der Zonen benötigen wir pro Zone ein Schlüsselpaar, mit Hilfe derer eine Sicherheitsstufe eingezogen und genutzt werden kann, so daß nicht unberechtigter Wiese Änderungen an den Zonenfiles vorgenommen werden können. Dieses Schlüsselmaterials legen wir in unserem bereits bestehenden Verzeichnis /var/named/keysab.

Zum Erstellen der Schlüssel verwenden wir das Hilfs-/Dienstprogramm ddns-confgen, mit dem Schlüssel für die Verwendung in der TSIG-Signatur generiert werden. Die resultierenden Schlüssel können beispielsweise verwendet werden, um dynamische DNS-Updates für eine Zone zu sichern, oder für den rndc-Befehlskanal. Die Manpage des Programms liefert eine entsprechende Hilfe und zeigt auch die entsprechenden Optionen auf, die bei der Generierung des DDNS-Schlüsselmaterials verwendet werden können.

In folgendem Beispiel, welches wir lediglich zum Anzeigen der später benötigten Konfigurationsoptionen benutzen, nutzen wir folgende Optionen beim Aufruf des Hilfsprogramms ddns-confgen

  • -a algorithm (Diese Option gibt den Algorithmus an, der für den TSIG-Schlüssel verwendet werden soll.) = hmac-sha512 oder kurz sha256
  • -z zone (Diese Option definiert die Zone für die das DDNS-Key-Paar gelten soll.) = intra.nausch.org.key
  • -k keyname (Diese Option gibt den Schlüsselnamen des rndc-Authentifizierungsschlüssels an.) = ddns-key.intra.nausch.org.key
 # ddns-confgen -a sha512 -z intra.nausch.org -k ddns-key.intra.nausch.org.key
# To activate this key, place the following in named.conf, and
# in a separate keyfile on the system or systems from which nsupdate
# will be run:
key "ddns-key.intra.nausch.org.key" {
	algorithm hmac-sha512;
	secret "Jvz0G6qaeW7MG5NaofsIISjNeMD7Xse2Q1ca8JMp8ZkX9tBl1foS1+kMvx5kN8ZU7iKTJvl2o+6/2Ge2cvVt/w==";
};

# Then, in the "zone" definition statement for "intra.nausch.org",
# place an "update-policy" statement like this one, adjusted as 
# needed for your preferred permissions:
update-policy {
	  grant ddns-key.intra.nausch.org.key zonesub ANY;
};

# After the keyfile has been placed, the following command will
# execute nsupdate using this key:
nsupdate -k <keyfile>

Wir erstellen uns also nun pro verwendeter Zone ein entsprechendes DDNS-Key-Paar. Hier das Beispiel für die Zone intra.nausch.org.

 # ddns-confgen -a sha512 -z intra.nausch.org -k ddns-key.intra.nausch.org.key -q > /var/named/keys/ddns-key.intra.nausch.org.key

Die so erzeugte DDNS-Schlüsseldatei enthält.

 # cat /var/named/keys/ddns-key.intra.nausch.org.key
key "ddns-key.intra.nausch.org.key" {
	algorithm hmac-sha512;
	secret "BZq7uiOS57GB19cH13FI1y1zQ1Gw0J4n90FjBFi+REaOihY314b2l2c/Bsn0RqEdMjXIiu5lpZuzLOlDLG9f0w1Q==";
};

Wie ergänzen nun die Konfigurationsdatei unseres BIND9 damit dieser dieses Schlüsselmaterial kennt und wir mit Hilfe von nsupdate später in der Lage sind, Änderungen an unseren ausgewählten Zonen vornehmen zu können.

Zunächst includieren wir den bzw. die erstellten Schlüssel am Anfang der Konfigurationsdatei /etc/named.conf die ddns Schlüsseldefinition.

 # vim /etc/named.conf 

// *********************** ddns Schlüsseldefinition ***********************
include "/var/named/keys/ddns-key.intra.nausch.org.key";

Bei der Definition unserer Zone ergänzen wir dann noch die Zeile allow-update { key „ddns-key.intra.nausch.org.key“; };, so daß der Block nun folgenden Inhalt hat:

  // View: intern - Zone: intra.nausch.org (forward)
  zone "intra.nausch.org" IN {
    type master;
    file "zones/intra.nausch.org.db";
    dnssec-policy "ownway"
    allow-update { key "ddns-key.intra.nausch.org.key"; };
  };

Zum Aktivieren unserer Änderungen führen wir einen reconfig unseres named aus.

 # rndc reconfig
Änderungen via nsupdate

Nun sind wir in der Lage während der Laufzeit Änderungen an der Konfiguration unseres named vorzunehmen. Im ersten Beispiel fügen wir einen A-Record für den Host mit dem Hostnamen testhost in der Zone intra.nausch.org durch. Dieser Host ist über die Adresse 10.0.10.123 erreichbar.

 # nsupdate -k /var/named/keys/ddns-key.intra.nausch.org.key
> server 10.0.0.110
> zone intra.nausch.org
> update add testhost.intra.nausch.org 2400 A 10.0.10.123
> send
> quit

Im Journal wird dieser neue Eintrag wie folgt quittiert:

Nov 09 22:53:31 vml000110 named[4113]: 09-Nov-2024 22:53:31.163 general: info: zone intra.nausch.org/IN/intern (signed): serial 2024110913 (unsigned 2024110905)

Fragen wir nun unseren DNS nach der Adresse für unseren neuen Host mit Namen testhost erhalten wir auch sofort entsprechende Antwort:

 # dig @::1 testhost.intra.nausch.org
; <<>> DiG 9.20.3 <<>> @::1 testhost.intra.nausch.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53306
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: cf46e16ac570dfe801000000672fda1407cdb4ab988b465c (good)
;; QUESTION SECTION:
;testhost.intra.nausch.org.	IN	A

;; ANSWER SECTION:
testhost.intra.nausch.org. 2400	IN	A	10.0.10.123

;; AUTHORITY SECTION:
intra.nausch.org.	7200	IN	NS	ns1.intra.nausch.org.

;; ADDITIONAL SECTION:
ns1.intra.nausch.org.	7200	IN	A	10.0.10.110

;; Query time: 0 msec
;; SERVER: ::1#53(::1) (UDP)
;; WHEN: Sat Nov 09 22:54:28 CET 2024
;; MSG SIZE  rcvd: 132

Achtung:
Im Moment sind diese Änderungen lediglich im Speicher zur Laufzeit unseres DNS verfügbar. Bei einem Neustart des Systems wäre diese Änderung nicht mehr existent, da diese noch nicht im Zone-File der Zone intra.nausch.org manifestiert wurde!

Dies zeigt sich auch, wenn wir einen Blick auf die Zonen-Dateien richten:

 # ls -l /var/named/zones/i.intra.nausch.org.db*
-rw-r--r-- 1 named named  1503 Nov  9 16:43 ../zones/i.intra.nausch.org.db
-rw-r--r-- 1 named named   512 Nov  9 22:48 ../zones/i.intra.nausch.org.db.jbk
-rw-r--r-- 1 named named   767 Nov  9 22:53 ../zones/i.intra.nausch.org.db.jnl
-rw-r--r-- 1 named named  7133 Nov  9 16:05 ../zones/i.intra.nausch.org.db.signed
-rw-r--r-- 1 named named 17705 Nov  9 22:53 ../zones/i.intra.nausch.org.db.signed.jnl

Erst durch einen manuellen Synchronisationsaufruf werden die Informationen aus dem Speicher in das zugehörige Zonen-File übertragen!

 # rndc sync

Diese sync wird natürlich im Journal wieder entsprechend dokumentiert:

Nov 09 22:57:52 vml000110 named[4113]: 09-Nov-2024 22:57:52.807 general: info: received control channel command 'sync'
Nov 09 22:57:52 vml000110 named[4113]: 09-Nov-2024 22:57:52.810 general: info: dumping all zones: success

Ein erneuter Blick in das Verzeichnis zeigt auch die betreffenden neuen mtime-Zeitstempel.

 # ls -l /var/named/zones/i.intra.nausch.org.db*
-rw-r--r-- 1 named named   981 Nov  9 22:57 /var/named/zones/i.intra.nausch.org.db
-rw-r--r-- 1 named named   512 Nov  9 22:48 /var/named/zones/i.intra.nausch.org.db.jbk
-rw-r--r-- 1 named named   767 Nov  9 22:53 /var/named/zones/i.intra.nausch.org.db.jnl
-rw-r--r-- 1 named named  7892 Nov  9 22:57 /var/named/zones/i.intra.nausch.org.db.signed
-rw-r--r-- 1 named named 17705 Nov  9 22:53 /var/named/zones/i.intra.nausch.org.db.signed.jnl

In der Zonendatei - die natürlich jetzt nicht mehr so toll formatiert ist, wie wir diese ursprünglich angelegt hatten, - taucht der Eintrag für unseren neuen Host entsprechend auf:

 # cat /var/named/zones/i.intra.nausch.org.db
$TTL 7200	; 2 hours
intra.nausch.org.	IN SOA	ns1.intra.nausch.org. hostmaster.nausch.org. (
				2024110905 ; serial
				3600       ; refresh (1 hour)
				900        ; retry (15 minutes)
				1209600    ; expire (2 weeks)
				600        ; minimum (10 minutes)
				)
			NS	ns1.intra.nausch.org.
			MX	10 mx1.intra.nausch.org.
apc-usv.intra.nausch.org. CNAME	pnc010023.intra.nausch.org.
fwc.intra.nausch.org.	CNAME	vml010110.intra.nausch.org.
mx1.intra.nausch.org.	A	10.0.10.110
nitro-pc.intra.nausch.org. CNAME pml010070.intra.nausch.org.
ns1.intra.nausch.org.	A	10.0.10.110
pml010070.intra.nausch.org. A	10.0.10.70
			AAAA	fd00::7:10:0:10:70
pnc010023.intra.nausch.org. A	10.0.10.23
			AAAA	fd00::7:10:0:10:23
$TTL 2400	; 40 minutes
testhost.intra.nausch.org. A	10.0.10.123
$TTL 7200	; 2 hours
thinclient.intra.nausch.org. CNAME pml010070.intra.nausch.org.
usv.intra.nausch.org.	CNAME	pnc010023.intra.nausch.org.
vml010110.intra.nausch.org. A	10.0.10.110
			AAAA	fd00::7:10:0:10:110

Genau so wie wir den Eintrag für unseren Testhost hinzugefügt haben, werden wir diesen nun im nächsten Schritt wieder entfernen.

# nsupdate -k /var/named/keys/ddns-key.intra.nausch.org.key
> server 10.0.0.110
> zone intra.nausch.org
> update delete testhost.intra.nausch.org
> send
> quit

Auch diese Aktion finden wir wieder im Journal:

Nov 09 23:55:33 vml000110 named[4113]: 09-Nov-2024 23:55:33.761 general: info: zone intra.nausch.org/IN/intern (signed): serial 2024110914 (unsigned 2024110906)

Fragen wir nun erneut nach dem A-Record unseres Testhost mit dem Namen testhost.intra.nausch.org erhalten wir nunmehr keine Antwort mehr:

 # dig @::1 testhost.intra.nausch.org
; <<>> DiG 9.20.3 <<>> @::1 testhost.intra.nausch.org
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 18176
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 30b511e3daddaf5c01000000672fe8fb3ead1fccafd0d496 (good)
;; QUESTION SECTION:
;testhost.intra.nausch.org.	IN	A

;; AUTHORITY SECTION:
intra.nausch.org.	600	IN	SOA	ns1.intra.nausch.org. hostmaster.nausch.org. 2024110914 3600 900 1209600 600

;; Query time: 0 msec
;; SERVER: ::1#53(::1) (UDP)
;; WHEN: Sat Nov 09 23:58:03 CET 2024
;; MSG SIZE  rcvd: 133

Auch diese Änderung wollen wir natürlich im Zone-File manifestiert sehen. Wir rufen also dazu den Befehl rndc sync auf.

 # rndc sync

… was wieder im Journale ntsprechend dokumentiert wird:

Nov 09 23:59:45 vml000110 named[4113]: 09-Nov-2024 23:59:45.585 general: info: received control channel command 'sync'
Nov 09 23:59:45 vml000110 named[4113]: 09-Nov-2024 23:59:45.585 general: info: dumping all zones: success

Wie wir sehen, ist der Eintrag für den Testhost wieder entfernt worden!

 # cat /var/named/zones/i.intra.nausch.org.db
$TTL 7200	; 2 hours
intra.nausch.org.	IN SOA	ns1.intra.nausch.org. hostmaster.nausch.org. (
				2024110906 ; serial
				3600       ; refresh (1 hour)
				900        ; retry (15 minutes)
				1209600    ; expire (2 weeks)
				600        ; minimum (10 minutes)
				)
			NS	ns1.intra.nausch.org.
			MX	10 mx1.intra.nausch.org.
apc-usv.intra.nausch.org. CNAME	pnc010023.intra.nausch.org.
fwc.intra.nausch.org.	CNAME	vml010110.intra.nausch.org.
mx1.intra.nausch.org.	A	10.0.10.110
nitro-pc.intra.nausch.org. CNAME pml010070.intra.nausch.org.
ns1.intra.nausch.org.	A	10.0.10.110
pml010070.intra.nausch.org. A	10.0.10.70
			AAAA	fd00::7:10:0:10:70
pnc010023.intra.nausch.org. A	10.0.10.23
			AAAA	fd00::7:10:0:10:23
thinclient.intra.nausch.org. CNAME pml010070.intra.nausch.org.
usv.intra.nausch.org.	CNAME	pnc010023.intra.nausch.org.
vml010110.intra.nausch.org. A	10.0.10.110
			AAAA	fd00::7:10:0:10:110

In unserer, mit Hilfe und Unterstützung von Ansible orchestrierten, Produktionsumgebung werden wir die Zonen-Dateien aber weder manuell verwalten und beschreiben, noch mit Hilfe von nsupdate bearbeiten. Vielmehr werden wir mit den Daten aus dem Inventory automatisiert die Zonendateien verwalten und signieren lassen - dazu gleich mehr!

Webstatus mit Hilfe des eingebauten WEB-Servers und "ISC Bind 9 Configuration and Statistics"

Unser BIND9 bringt uns einen rudimentären Webserver. In der Konfigurationsdatei /etc/named.conf hatten wir bei der Basiskonfioguration diese Option bereits berücksichtigt.

// Die BIND 9-Statistiken können auch über das HTTP-Protokoll von
// einem laufenden BIND 9-Server abgerufen werden. BIND 9 verfügt
// über einen winzigen integrierten Webserver, der die Statistik-
// daten im XML- oder JSON-Format bereitstellt.
statistics-channels {  
  inet 127.0.0.1 port 8080 allow {                                                                                   
    127.0.0.1;         
  };                   
}; 

Bild: ISC Bind 9 Configuration and Statistics

Orchestrierung - Installation und Konfiguration des BIND9 inkl. der Zonen-Datei-Pflege mit Hilfe von Ansible

Aufgabenstellung

Natürlich wird man im Jahr 2026 nicht mehr ernsthaft, manuell Server aufsetzen und betreiben wollen. Vielmehr wird man auf ein Orchestrierungswerkzeug wie z.B. Ansible zurückgreifen. Setzen wir einen neue virtuellen Server unter Arch Linux neu auf, oder wollen wir bei einem bestehenden Host die Konfiguration aktualisieren, verwenden wir wie zuvor schon angeschnitten Ansible als Orchestrierungswerkzeug. So ist sichergestellt dass zum einen all unsere Hosts entsprechend gleich aufgebaut, konfiguriert und betrieben werden, es also keine Bastel-/Frickellösung geben wird.

Betrachten wir kurz die grundlegende Infrastruktur, in der wir eine Lösung für den Netzdienst DNS mit Hilfe von Ansible bauen und verwalten wollen. In dem Beispiel werden wir in diesem Beispiel erst einmal einen ISC Bind aufsetzen der Anfragen lediglich auf den beiden localhost-Adressen 127.0.0.1 und ::1 beantworten soll. In einem [linux:unbound#orchestrierung_-_installation_und_konfiguration_des_unbound-resolvers_mit_hilfe_von_ansible|zweiten Schritt]] werden wir dann für die workload der Clients aus den einzelnen Zonen einen unbound-Resolver aufsetzen.

Bild: Übersicht der Infrastruktur bei nausch.org, mit den einzelnen Schutzzonen und der Lösung für das Thema DNS

Da wir selbst keine eigenen DNS-Server, die für alle im Internet erreich- und abfragbar sind, wollen wir auch noch dafür sorgen, dass unser Ansible-Playbook nicht nur die internen Zonefiles aus dem Inventory generiert, sondern auch ein „spezielles“ Zonefile mit den offiziellen Adressen schreibt, welches wir dann in einem manuellen Schritt bei Bedarf beim ISP - in unserem Falle core-networks - hochladen und importieren können.

Wir werden uns nun nachfolgend die DNS-Server-Installation und -konfiguration genauer betrachten.

Lösung

Der ungeduldigen Leser kann auch direkt zur Tat schreiten und das manuelle Anlegen der Inventory-Hülle, des Playbooks und der zugehörigen Rolle überspringen und diese Aufgaben mit folgendem Befehl sozusagen auf einem Rutsch erledigen:

 $ mkdir -p ~/devel/ansible ; wget https://gitlab.nausch.org/django/example_bind/-/archive/main/example_bind-main.tar.gz \
         -O - | tar -xz --strip-components=1 -C ~/devel/ansible

Nach Anpassung der Daten im Inventory]** kann man anschliessend direkt **[[#ausfuehrung_-_playbooklauf|zur Ausführung schreiten.

Vorbereitung - (Server-)Daten im Inventory

Bei unserem Konfigurationsbeispiel hier gehen wir von folgenden Host-Parametern aus:

  • zone: edmz
    • Netzwerkswitch/-device : pnc027010
  • zone: idmz
    • KVM HOST : vml000110
  • zone: intra
    • Netzwerkswitch/-device : pnc010010
    • Workstation : pml010068
  • hostname: vml010110 auf dem der ISC BIND laufen soll.

Die Konfigurationsdatei unseres inventory in unsere, Ansible-Verzeichnis beinhaltet demnach unter anderem:

 $ vim inventories/production/hosts

inventories/production/hosts

Der Beispiel-Hosts aus der Gruppe|Zone edmz in diesem Inventory beschreibt den Switch der EDMZ. Der Host vml000110 ist in diesem Beispiel unser Server, der die Verbindung zwischen der Zone intra und der Zone idmz herstellt. Auf diesem Konten läuft bereits ein Chrony Timeserver| wie auch eine Firewall auf Basis von firewalld der eine Zonendefinition intra besitzt, die die Regeln für diese Zone beinhalten. Sowohl Timeserver wie auch Firewall werden in diesem Beispiel hier nur erwähnt, da in dem Playbook bzw.genauer gesagt im Inventory darauf referenziert wird. In der Zone idmz finden wir ferner noch die Beschreibung des Intranet-Switch und eine der Workstations.

Wir legen uns also nun die Hostdefinitionsdatei für unseren Switch in der Zonme edmz an.

 $ vim inventories/production/host_vars/pnc027010

inventories/production/host_vars/pnc027010

Als nächstes legen wir die Datei für den KVM-Host, auf dem unser Kea-Daemon laufen soll an und definieren darin die zugehörigen Eigenschaften.

$ vim inventories/production/host_vars/vml000110/kvm_vhost

inventories/production/host_vars/vml000110/kvm_vhost

Die für deb ISC Bind-Daemon relevanten Konfigurationsparameter legen wir in der Inventrory-Datei inventories/production/host_vars/vml000110/bind ab.

 $ vim inventories/production/host_vars/vml000110/bind 

inventories/production/host_vars/vml000110/bind

Die für die Domain nausch.org relevanten Daten legen wir in der Inventrory-Datei inventories/production/host_vars/vml000110/bind_nausch_org ab. In dieser Datei ist ein Array definiert, welches die externen Hostnamen/vHosts beschreibt, für die jeweils ein eigener A und AAAA Record angelegt werden soll. Diese Parameter werden wir später auch bei der Definition der einzelnen virtuellen Maschinen heranziehen, also 1x Daten vorhalten für Apache-Webserver und auch für das Thema DNS. So brauchen wir nicht n-mal die gleichen Daten definieren!

 $ vim inventories/production/host_vars/vml000110/bind_nausch_org 

inventories/production/host_vars/vml000110/bind_nausch_org

Nun brauchen wir noch eine Konfigurationsdatei für den Intranet-Switch und für eine der Intranet-Hosts, die wir nun auch noch anlegen werden.

 $ vim inventories/production/host_vars/pnc010010

inventories/production/host_vars/pnc010010

und

inventories/production/host_vars/pnc010068

Unser Beispiels-Inventory hat also nunmehr folgenden Aufbau:

inventories/production/
├── hosts
└── host_vars
    ├── pml010068
    ├── pnc010010
    ├── pnc027010
    └── vml010110
        ├── bind
        ├── bind_domain
        └── kvm_vhost

3 directories, 7 files

Playbook

Unser Playbook zum Installieren und Konfigurieren des ISC Bind-Daemon ist wie immer schlank, unscheinbar und unspektakulär, beinhaltet aber Hinweise zur Aufgabe und wie es aufzurufen ist.

 $ vim playbooks/bind.yml

playbooks/bind.yml

Rolle

Für die Konfiguration der ISC BIND-Daemon verwenden wir eine eigene Rolle bind, die wir bei unserem zuvor angelegten Playbooks später einfach mit aufrufen werden. Hierzu kopieren wir uns zunächst die Mustervorlage common, welche wir bei der initialen Ansible-Einrichtung angelegt hatten.

 $ cp -avr roles/common/ roles/bind

Ausgabe von cp -avr roles/common/ roles/bind

Bei Bedarf können wir uns die Struktur die somit angelegt wurde mit nachfolgendem Befehl anzeigen lassen.

 $ tree roles/bind/

Ausgabe von tree roles/bind/

Wie wir sehen ist die Rolle durchaus überschaubar, im Task main.yaml verweisen wir lediglich auf die eigentlichen Tasks install, grundkonfig, zonefiles, fetchzonefiles, konfig und firewalld

 $ vim roles/bind/tasks/main.yml

roles/bind/tasks/main.yml

Die Installation des ISC Bind-Servers wird in der ersten Task-Gruppe mit dem tag install vorgenommen.

 $ vim roles/bins/tasks/install.yml

roles/bind/tasks/install.yml

Für die Grundkonfiguration des ISC BIND-Daemon (rndc-Schlüsselanlage, Definition für die 13 Root-Server und Anlegen der Verzeichnisse) werden die nötigen Schritte in der Task-Gruppe mit dem tag grundkonfig definiert.

 $ vim roles/bind/tasks/grundkonfig.yml

roles/bind/tasks/grundkonfig.yml

Das Anlegen der Zonefiles erfolgt dann mit Hilfe des Task-Gruppe mit dem tag zonefiles mit den Daten aus dem Inventory konfiguriert.

Damit wir uns nicht die Finger brechen bzw. wund tippen speziell bei den Reverse-IPv6-Adressen delegieren wir solch stupide und fehleranfällige Arbeiten an Ansible. Zur Konvertierung der IPv6-Adressen ist hierzu das Paket netaddr notwendig, das wir bei Bedarf mit Hilfe des Paketmanagers auf unserem Linux-Ansible-Kontrollnode/-Workstation noch installieren:

 $ sudo pacman -S netaddr

.

Anschließens generieren wir noch das spezielle Zone-File, welches wir dann später bei unserem ISP einkippen werden.

 $ vim roles/bind/tasks/zonefiles.yml

roles/bind/tasks/zonefiles.yml

Das zuvor generierte spezielle Zone-File holen wir uns nun auf unseren Linux-Ansible-Kontrollnode/-Workstation, damit wir dieses dann später bei unserem ISP einkippen. Hierzu erstellen wir noch ein entsprechendes Verzeichnis auf unserer lokalen Workstation.

 $ mkdir ~/devel/isp/

Der Task zum Holen des Zonefiles für den ISP beschränkt sich lediglich auf einen Schritt zum Downloaden der betreffenden Datei.

 $ vim roles/bind/tasks/fetchzonefiles.yml

roles/bind/tasks/fetchzonefiles.yml

Nun müssen wir unseren ISC Bind noch individuell konfigurieren. Dies erschlagen wir mit der Task-Gruppe konfig.

 $ vim roles/bind/tasks/konfig.yml

roles/bind/tasks/konfig.yml

Zum Schluss konfigurieren wir abschließend noch die Paketfilter-Regeln für unseren Firewall-Daemon firewalld.

 $ vim roles/kea_dhcp/tasks/firewalld.yml

roles/kea_dhcp/tasks/firewalld.yml

Sollte bei der Abarbeitung des Playbook die Konfigurationsdatei named.conf bzw. bei den Zonefiles unter /var/named/zones verändert werden, ist natürlich hierbei ein Restart der betreffenden ISC Bind-Daemon notwendig. Hierzu verwenden wir die Ansible Playbook Handlers. Dieser Handler wird bei den betreffenden Tasks zur Erstellung der Kea-Konfigurationsdateie bze. der Zonesfiles mit Hilfe eines handler-Calls aufgerufen, sofern sich die Dateien verändert hat.

Wir brauchen wir noch eine Konfiguration der Aufgaben die bei einem notify abgearbeitet werden sollen.

 $ vim roles/bind/handlers/main.yml

roles/bind/handlers/main.yml

Für die Erstellung der Konfigurationsdatei /etc/named.conf brauchen wir nun noch ein Jinja2 Templates.

 $ vim roles/bind/templates/named.j2

roles/bind/templates/named.j2

Für die Erstellung der Zone-Files im Verzeichnis /var/named/zones benötigen wir nun noch jeweils ein Jinja2 Templates.

 $ vim roles/bind/templates/0.0.10.in-addr.arpa.zone.db.j2

roles/bind/templates/0.0.10.in-addr.arpa.zone.db.j2

 $ vim roles/bind/templates/10.0.10.in-addr.arpa.zone.db.j2

roles/bind/templates/10.0.10.in-addr.arpa.zone.db.j2

 $ vim roles/bind/templates/12.92.217.in-addr.arpa.zone.db.j2

roles/bind/templates/12.92.217.in-addr.arpa.zone.db.j2

 $ vim roles/bind/templates/intra.nausch.org.j2

roles/bind/templates/intra.nausch.org.j2

 $ vim roles/bind/templates/intra.nausch.org.ip6.j2

roles/bind/templates/intra.nausch.org.ip6.j2

 $ vim roles/bind/templates/idmz.nausch.org.j2

roles/bind/templates/idmz.nausch.org.j2

 $ vim roles/bind/templates/idmz.nausch.org.in-addr.j2

roles/bind/templates/idmz.nausch.org.in-addr.j2

 $ vim roles/bind/templates/idmz.nausch.org.ip6.j2

roles/bind/templates/idmz.nausch.org.ip6.j2

 $ vim roles/bind/templates/edmz.nausch.org.j2

roles/bind/templates/edmz.nausch.org.j2

 $ vim roles/bind/templates/edmz.nausch.org.in-addr.j2

roles/bind/templates/edmz.nausch.org.in-addr.j2

 $ vim roles/bind/templates/edmz.nausch.org.ip6.j2

roles/bind/templates/edmz.nausch.org.ip6.j2

 $ vim roles/bind/templates/nausch.org.j2

roles/bind/templates/nausch.org.j2

 $ vim roles/bind/templates/nausch.org.ip6.j2

roles/bind/templates/nausch.org.ip6.j2

Ausführung - Playbooklauf

Die orchestrierte Variante der Installation und Konfiguration unserer kea-Daemon gestaltet sich ab sofort sehr einfach, brauchen wir doch lediglich die Konfigurationswerte im Inventory zu hinterlegen und zu pflegen und letztendlich das Playbook entsprechend aufzurufen, wenn z.B. ein Client im Intranet hinzugefügt, entfernt oder ausgetauscht wird:

 $ ansible-playbook playbooks/kea_dhcp.yml

[15:16:47] Gathering Facts
↳  vml010110 | SUCCESS | 2.06s
[15:16:49] bind : Installation des BIND-Servers.
↳  vml010110 | SUCCESS | 33ms
[15:16:49]     ↳ install: Installation der benötigten bind Paketes.
↳  vml010110 | CHANGED | 4.05s
[15:16:53] bind : Grundkonfiguration des BIND-Servers.
↳  vml010110 | SUCCESS | 18ms
[15:16:53]     ↳ grundkonfiguration: Checken ob es bereits eine Datei /etc/rndc.key gibt.
↳  vml010110 | SUCCESS | 737ms
[15:16:54]     ↳ grundkonfiguration: Individuellen Schlüssel für rndc erzeugen und ablegen.
↳  vml010110 | SUCCESS | 767ms
[15:16:54]     ↳ grundkonfiguration: Berechtigungen der Schlüssel-Datei /etc/rndc.key sicherstellen.
↳  vml010110 | CHANGED | 760ms
[15:16:55]     ↳ grundkonfiguration: Checken ob es bereits eine Datei /var/named/named.root gibt.
↳  vml010110 | SUCCESS | 660ms
[15:16:56]     ↳ grundkonfiguration: Liste der 13 Root-Nameserver holen und ablegen..
↳  vml010110 | SUCCESS | 746ms
[15:16:57]     ↳ grundkonfiguration: Sicherstellen dass die Datei named.root existiert.
↳  vml010110 | CHANGED | 683ms
[15:16:57]     ↳ grundkonfiguration: Liste der zuvor erstellten 13 Root-Name-Server in /var/named/named.root ablegen.
↳  vml010110 | CHANGED | 1.40s
[15:16:59]     ↳ grundkonfiguration: Sicherstellen dass das Verzeichnis für die Zonendateien existiert.
↳  vml010110 | CHANGED | 649ms
[15:16:59]     ↳ grundkonfiguration: Sicherstellen dass das Verzeichnis für die externen Zonendateien existiert.
↳  vml010110 | CHANGED | 692ms
[15:17:00] bind : Konfiguration der BIND-Zonen für die Domain nausch.org.
↳  vml010110 | SUCCESS | 20ms
[15:17:00]     ↳ zonefiles_nausch: Zonen Datei für IPv4|6 Forward Auflösung der Zone intra.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.50s
[15:17:02]     ↳ zonefiles_nausch: Zonen Datei für IPv4 Reverse Auflösung der Zone intra.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.45s
[15:17:03]     ↳ zonefiles_nausch: Zonen Datei für IPv6 Reverse Auflösung der Zone intra.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.56
[15:17:05]     ↳ zonefiles_nausch: Zonen Datei für IPv4|6 Forward Auflösung der Zone idmz.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.37s
[15:17:06]     ↳ zonefiles_nausch: Zonen Datei für IPv4 Reverse Auflösung der Zone idmz.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.31s
[15:17:07]     ↳ zonefiles_nausch: Zonen Datei für IPv6 Reverse Auflösung der Zone idmz.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.46s
[15:17:09]     ↳ zonefiles_nausch: Zonen Datei für IPv4|6 Forward Auflösung der Zone edmz.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.29s
[15:17:10]     ↳ zonefiles_nausch: Zonen Datei für IPv4 Reverse Auflösung der Zone edmz.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.29s
[15:17:12]     ↳ zonefiles_nausch: Zonen Datei für IPv6 Reverse Auflösung der Zone edmz.nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.40s
[15:17:13]     ↳ zonefiles_nausch: Zonen Datei für IPv4|6 Forward Auflösung der Zone nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.46s
[15:17:14]     ↳ zonefiles_nausch: Zonen Datei für IPv4 Reverse Auflösung der Zone nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.29s
[15:17:16]     ↳ zonefiles_nausch: Zonen Datei für IPv6 Reverse Auflösung der Zone nausch.org erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.41s
[15:17:17]     ↳ zonefiles_nausch: Zonen Datei für IPv4|6 Forward Auflösung der Zone nausch.org für core-networks.de erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.45s
[15:17:19] bind : Konfiguration der BIND-Zone für die Domain omni128.de.
↳  vml010110 | SUCCESS | 15ms
[15:17:19]     ↳ zonefiles_omni128.de: Zonen Datei für IPv4|6 Forward Auflösung Domain omni128.de erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.41s
[15:17:20]     ↳ zonefiles_omni128.de: Zonen Datei für IPv4 Reverse Auflösung der Zone omni128.de für core-networks.de erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.45s
[15:17:21] bind : Konfiguration der BIND-Zone für die Domain ebersberger-liedersammlung.de.
↳  vml010110 | SUCCESS | 26ms
[15:17:21]     ↳ zonefiles_liedersammlung: Zonen Datei für IPv4|6 Forward Auflösung Domain ebersberger-liedersammlung.de erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.23s
[15:17:23]     ↳ zonefiles_liedersammlung: Zonen Datei für IPv4|6 Forward Auflösung der Zone ELS für core-networks.de erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.33s
[15:17:24] Konfiguration der BIND-Zone für die Domain wetterstation-pliening.info.
↳  vml010110 | SUCCESS | 16ms
[15:17:24]     ↳ zonefiles_wetterstation: Zonen Datei für IPv4|6 Forward Auflösung Domain wetterstation-pliening.info für die interne view erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.36s
[15:17:25]     ↳ zonefiles_wetterstation: Zonen Datei für IPv4|6 Forward Auflösung der Domain wetterstation-pliening.info für core-networks.de erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.22s
[15:17:27] bind : Sichern der Zonefiles für externen DNS.
↳  vml010110 | SUCCESS | 15ms
[15:17:27]     ↳ fetchzonefiles: Erstelltes Zonefile für die Domain nausch.org holen.
↳  vml010110 | SUCCESS | 710ms
[15:17:27]     ↳ fetchzonefiles: Erstelltes Zonefile für die Domain ebersberger-liedersammlung.de holen.
↳  vml010110 | SUCCESS | 681ms
[15:17:28]     ↳ fetchzonefiles: Erstelltes Zonefile für die Domain omni128.de holen.
↳  vml010110 | SUCCESS | 701ms
[15:17:29]     ↳ fetchzonefiles: Erstelltes Zonefile für die Domain wetterstation-pliening.info holen.
↳  vml010110 | SUCCESS | 658ms
[15:17:29] bind : Konfiguration des BIND-Servers.
↳  vml010110 | SUCCESS | 36ms
[15:17:29]     ↳ konfiguration: Checken ob es bereits eine Backupdatei named.conf gibt.
↳  vml010110 | SUCCESS | 632ms
[15:17:30]     ↳ konfiguration: Backupdatei der Konfigurationsdatei named.conf erstellen.
↳  vml010110 | CHANGED | 681ms
[15:17:31]     ↳ konfiguration: Individuelle Konfigurationsdatei named.conf erzeugen und kopieren.
↳  vml010110 | CHANGED | 1.34s
[15:17:32]     ↳ konfiguration: Verzeichnis für die private und public DNSSEC-Schlüssel erstellen.
↳  vml010110 | CHANGED | 703ms
[15:17:33]     ↳ konfiguration: Caching-Verzeichnis für die verwalteten DNSSEC-Schlüssel erstellen.
↳  vml010110 | CHANGED | 673ms
[15:17:34]     ↳ konfiguration: Data-Dump-Verzeichnis erstellen.
↳  vml010110 | SUCCESS | 706ms
[15:17:34]     ↳ konfiguration: Sicherstellen, dass der BIND Daemon reboot(-fest) startet.
↳  vml010110 | CHANGED | 673ms
[15:17:35]     ↳ konfiguration: Logging-Verzeichnis erstellen.
↳  vml010110 | SUCCESS | 706ms
[15:17:36]     ↳ konfiguration: Data-Dump-Verzeichnis erstellen.
↳  vml010110 | SUCCESS | 679ms
[15:17:36] bind : Konfiguration der firewalld-Regeln für den BIND.
↳  vml010110 | SUCCESS | 1.18ms
[15:17:36]     ↳ firewalld: Konfiguration der firewalld Regeln in Zone_1 für den BIND-Server.
↳  vml010110 | SUCCESS | 7.74s
[15:17:44]     ↳ firewalld: Konfiguration der firewalld Regeln in Zone_2 für den BIND-Server.
↳  vml010110 | SUCCESS | 7.82s
[15:17:52]     ↳ firewalld: Zum Schluss den aktuellen permanenten Regelsatz final neu laden.
↳  vml010110 | CHANGED | 979ms
triggering handler | bind : Restart bind
↳  vml010110 | CHANGED | 1.78s
[15:17:54] system
-- Play recap --
vml010110                  : ok=55   changed=32   unreachable=0    failed=0    skipped=2    rescued=0    ignored=0

In diesem Beispiel haben wir nach nicht einmal 70 Sekunden einen voll funktionsfähigen DNSSEC-fähigen Namserver für vier Domains mit sehr umfangreichen 20 Zonefiles mit bis zu 800 Zeilen in einem Zone-File, die nun wirklich niemand mehr manuell pflegen will. Die automatisierte Erstellung dieser Zonefiles aus den Daten des Inventories hat unscheinbare Vorteile. Man hat sauber formatierte Zonefiles mit aktuellen Daten und die Fehleranfälligkeit durch manuelles Editieren ist auf ein Mindestmaß begrenzt und es gibt auch keine unterschiedlichen Meinungen mehr im Admin-Team ob nun so ein Zonefile mit TABs oder SPACEes formatiert werden soll! ;)

Ergebniskontrolle

Ob die Konfigurationsdateien valide erstellt und auch von den Kea-Daemons erfolgreich geladen worden sind, kontrollieren wir zum Beispiel auf dem Zielhost mit einem Blick in die betreffenden Konfigurationsdateie, mit Prüfung der erstellten Zonefiles und mit Hilfe der systemctl status-Abfrage des betreffenden named-Daemons.

  • named-checkconf
     # named-checkconf /etc/named.conf
  • named-checkzone
     # root@vml000110:~# named-checkzone edmz.nausch.org /var/named/zones/edmz.nausch.org.db
    zone edmz.nausch.org/IN: loaded serial 2026011201
    OK
  • systemd
     # systemctl status named.service
  • dig
     # dig @::1 AAAA zerberus.nausch.org
    
    ; <<>> DiG 9.20.18 <<>> @::1 AAAA zerberus.nausch.org
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46659
    ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 3
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ; COOKIE: 82f5ba9ac8a044cb010000006978ca1cbafbbb0f05e54c11 (good)
    ;; QUESTION SECTION:
    ;zerberus.nausch.org.		IN	AAAA
    
    ;; ANSWER SECTION:
    zerberus.nausch.org.	3600	IN	AAAA	fd00::3:10:0:0:9a37
    
    ;; AUTHORITY SECTION:
    nausch.org.		3600	IN	NS	ns1.nausch.org.
    
    ;; ADDITIONAL SECTION:
    ns1.nausch.org.		3600	IN	AAAA	fd00::3:10:0:0:110
    ns1.nausch.org.		3600	IN	A	10.0.0.110
    
    ;; Query time: 0 msec
    ;; SERVER: ::1#53(::1) (UDP)
    ;; WHEN: Tue Jan 27 15:22:20 CET 2026
    ;; MSG SIZE  rcvd: 166
    
    # dig @ns1.core-networks.de AAAA zerberus.nausch.org
    ;; BADCOOKIE, retrying.
    
    ; <<>> DiG 9.20.18 <<>> @ns1.core-networks.de AAAA zerberus.nausch.org
    ; (2 servers found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 59294
    ;; 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: 40e0ff3f34e893d5010000006978cbcfd0cf510e49133631 (good)
    ;; QUESTION SECTION:
    ;zerberus.nausch.org.		IN	AAAA
    
    ;; ANSWER SECTION:
    zerberus.nausch.org.	3600	IN	AAAA	2003:a:e0d:7600:5054:ff:fe3d:9a37
    
    ;; Query time: 13 msec
    ;; SERVER: 2001:1bc0:d::fffe#53(ns1.core-networks.de) (UDP)
    ;; WHEN: Tue Jan 27 15:29:35 CET 2026
    ;; MSG SIZE  rcvd: 104

Links

1)
Berkeley Internet Name Domain
2)
Time-To-Live
Diese Website verwendet Cookies. Durch die Nutzung der Website stimmen Sie dem Speichern von Cookies auf Ihrem Computer zu. Außerdem bestätigen Sie, dass Sie unsere Datenschutzbestimmungen gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website.Weitere Information
  • linux/bind.txt
  • Zuletzt geändert: 27.01.2026 15:47.
  • von django