Lokalen autoritativen DNS-Server unter Linux einrichten

CompTIABeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie einen lokalen autoritativen DNS-Server auf einem Linux-System mit bind9 einrichten und konfigurieren. Sie werden praktische Erfahrungen mit einem der am weitesten verbreiteten DNS-Softwarepakete sammeln und eine Standard-Linux-Maschine in einen Server verwandeln, der benutzerdefinierte Domänennamen für ein lokales Netzwerk auflösen kann.

Der Prozess beginnt mit der Installation der notwendigen Pakete und der Konfiguration globaler Serveroptionen, wie z. B. der Einrichtung von Forwardern. Anschließend definieren Sie sowohl eine Forward-Lookup-Zone zur Auflösung eines Domänennamens in eine IP-Adresse als auch eine Reverse-Lookup-Zone für den entsprechenden IP-Bereich. Zum Abschluss des Labs validieren Sie die bind9-Konfigurationsdateien auf korrekte Syntax und verwenden das dig-Dienstprogramm, um Ihren neuen DNS-Server zu testen und sicherzustellen, dass er Abfragen für Ihre lokale Domäne korrekt auflöst.

bind9 installieren und globale Optionen konfigurieren

In diesem Schritt beginnen Sie mit der Einrichtung der Kernkomponenten für Ihren DNS-Server. Dies beinhaltet die Installation von bind9, einem der am weitesten verbreiteten DNS-Server-Softwarepakete unter Linux. Sie konfigurieren auch seine globalen Optionen, die das allgemeine Verhalten des Servers steuern, z. B. wie er Anfragen für Domänen behandelt, für die er nicht autoritativ ist.

Zuerst ist es üblich, die Paketliste Ihres Systems zu aktualisieren, um sicherzustellen, dass Sie die neuesten verfügbaren Softwareversionen erhalten.

Führen Sie den folgenden Befehl in Ihrem Terminal aus:

sudo apt-get update

Installieren Sie als Nächstes das Paket bind9, das den DNS-Server-Daemon enthält, und bind9-utils, das nützliche Befehlszeilentools wie dig und named-checkconf bereitstellt, die Sie später zum Testen und Validieren verwenden werden.

sudo apt-get install bind9 bind9-utils

Sie werden aufgefordert, die Installation zu bestätigen. Geben Sie Y ein und drücken Sie Enter. Die Ausgabe wird ähnlich wie folgt aussehen:

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  bind9-libs bind9-doc dns-root-data
...
After this operation, XX.X MB of additional disk space will be used.
Do you want to continue? [Y/n] Y
...
Setting up bind9 (1:9.18.X-XubuntuX.X) ...

Nach der Installation von bind9 besteht die nächste Aufgabe darin, sein globales Verhalten zu konfigurieren. Die Hauptkonfiguration ist in mehrere Dateien aufgeteilt, die sich alle im Verzeichnis /etc/bind/ befinden. Für globale Optionen bearbeiten Sie die Datei named.conf.options.

Öffnen Sie die Datei mit dem nano-Editor:

sudo nano /etc/bind/named.conf.options
options {
        directory "/var/cache/bind";

        // If there is a firewall between you and nameservers you want
        // to talk to, you may need to fix the firewall to allow multiple
        // ports to talk.  See http://www.kb.cert.org/vuls/id/800113

        // If your ISP provided one or more IP addresses for stable
        // nameservers, you probably want to use them as forwarders.
        // Uncomment the following block, and insert the addresses replacing
        // the all-0's placeholder.

        // forwarders {
        //      0.0.0.0;
        // };

        //========================================================================
        // If BIND logs error messages about the root key being expired,
        // you will need to update your keys.  See https://www.isc.org/bind-keys
        //========================================================================
        dnssec-validation auto;

        listen-on-v6 { any; };
};

In dieser Datei sehen Sie einen options { ... };-Block. Sie müssen sicherstellen, dass dieser Block Direktiven für Weiterleitung (Forwarding), Abfrageberechtigungen (Query Permissions) und lauschende Schnittstellen (Listening Interfaces) enthält. Weiterleitung ermöglicht es Ihrem DNS-Server, externe Domänen (wie google.com) aufzulösen, indem er andere öffentliche DNS-Server abfragt.

Ändern Sie den options-Block so, dass er mit dem Folgenden übereinstimmt. Sie können fehlende Zeilen hinzufügen oder vorhandene auskommentieren und ändern.

Tipps: Sie können den Dateiinhalt löschen, indem Sie Ctrl+K drücken, und dann den folgenden Inhalt einfügen.

options {
        directory "/var/cache/bind";

        // If there is not a line with forwarders, add the following section.
        // If there is one, ensure it's not commented out and has valid IPs.
        forwarders {
                8.8.8.8;
                8.8.4.4;
        };

        // Add or uncomment this line to allow queries from any host
        allow-query { any; };
        recursion yes;

        listen-on { any; }; // Listen on all interfaces
        listen-on-v6 { any; }; // Listen on all IPv6 interfaces

        dnssec-validation auto;
        auth-nxdomain no;    ## conform to RFC1035
};

Sobald Sie mit der Bearbeitung fertig sind, speichern Sie die Datei, indem Sie Ctrl+O drücken, und dann Enter, um den Dateinamen zu bestätigen. Beenden Sie den nano-Editor, indem Sie Ctrl+X drücken. Sie haben nun bind9 erfolgreich installiert und seine anfängliche Konfiguration vorgenommen.

Forward-Lookup-Zone für mylocaldomain.net definieren und erstellen

In diesem Schritt konfigurieren Sie Ihren bind9-Server so, dass er autoritativ für eine benutzerdefinierte Domäne ist. Dies geschieht durch die Erstellung einer Forward-Lookup-Zone, einer Datenbank, die menschenlesbare Hostnamen (wie webserver.mylocaldomain.net) ihren entsprechenden IP-Adressen zuordnet. Sie definieren zuerst die Zone in der bind9-Konfiguration und erstellen dann die eigentliche Zonendatei, die die DNS-Einträge enthält.

Zuerst müssen Sie bind9 über Ihre neue Zone informieren. Lokale Zoneneinstellungen werden in /etc/bind/named.conf.local gespeichert, um sie von der Standardkonfiguration des Pakets zu trennen. Diese Datei wird im nächsten Schritt vollständig konfiguriert.

Nachdem die Zone definiert ist, müssen Sie die entsprechende Zonendatei erstellen. Diese Datei enthält die tatsächlichen DNS-Einträge.

Kopieren Sie zunächst eine Vorlagendatei, um sicherzustellen, dass die neue Datei die richtigen Berechtigungen und Besitzverhältnisse hat:

sudo cp /etc/bind/db.local /etc/bind/db.mylocaldomain.net

Anstatt die Datei manuell zu bearbeiten, können Sie nun einen einzigen Befehlsblock ausführen, der Folgendes tut:

  1. Ruft die IP-Adresse Ihrer VM ab.
  2. Generiert eine dynamische Seriennummer unter Verwendung des aktuellen Datums.
  3. Schreibt den vollständigen und korrekten Inhalt der Zonendatei in /etc/bind/db.mylocaldomain.net.

Erfassen Sie zuerst die IP-Adresse Ihrer VM in einer Variablen, die in der Zonendatei verwendet wird:

VM_IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

Dieser Befehl extrahiert die IPv4-Adresse von Ihrer primären Netzwerkschnittstelle (eth0) mithilfe eines regulären Ausdrucks. Die IP-Adresse wird automatisch in Ihre DNS-Einträge eingefügt.

Erstellen Sie nun die Zonendatei mit den entsprechenden DNS-Einträgen. Dieser einzelne Befehl generiert die vollständige Zonendatei:

sudo bash -c "cat > /etc/bind/db.mylocaldomain.net" << EOF
\$TTL    604800
@       IN      SOA     ns1.mylocaldomain.net. admin.mylocaldomain.net. (
                     $(date +%Y%m%d)01 ; Serial (YYYYMMDDNN)
                             604800     ; Refresh
                              86400     ; Retry
                            2419200     ; Expire
                             604800 )   ; Negative Cache TTL
;
@       IN      NS      ns1.mylocaldomain.net.
ns1     IN      A       ${VM_IP}
webserver IN    A       ${VM_IP}
fileserver IN   A       ${VM_IP}
www     IN      CNAME   webserver
EOF

Dieser Befehl füllt die Zonendatei automatisch mit den korrekten Einträgen und verwendet die spezifische IP-Adresse Ihrer VM. Sie können den Inhalt mit cat /etc/bind/db.mylocaldomain.net überprüfen. Sie haben nun erfolgreich Ihre erste Forward-Lookup-Zone definiert und erstellt.

Alle lokalen Zonen definieren und erstellen

In diesem Schritt erstellen Sie alle notwendigen lokalen Zonenkonfigurationen. Anstatt Dateien manuell zu bearbeiten, verwenden Sie ein Skript, um die folgenden Aktionen durchzuführen und eine genaue Einrichtung zu gewährleisten:

  1. Erstellen von /etc/bind/named.conf.local: Diese Datei wird von Grund auf neu generiert, um die Definitionen für Ihre Forward- (mylocaldomain.net) und Reverse-Lookup-Zonen zu enthalten.
  2. Erstellen der Reverse-Zonendatei: Das Skript erstellt auch die Datei db.REVERSE_IP mit den notwendigen PTR-Einträgen.

Sammeln Sie zuerst die IP-Adressinformationen, die für beide Zonenkonfigurationen benötigt werden:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
LAST_OCTET=$(echo $IP | awk -F. '{print $4}')

Dies extrahiert die IP-Adresse Ihrer VM und verarbeitet sie, um das Reverse-IP-Format zu erstellen, das für die Reverse-Lookup-Zone benötigt wird. Wenn Ihre IP beispielsweise 172.16.50.100 lautet, wird REV_IP zu 50.16.172 und LAST_OCTET zu 100.

Erstellen Sie als Nächstes die Hauptkonfigurationsdatei für die Zone, die bind9 über beide Zonen informiert:

sudo bash -c "cat > /etc/bind/named.conf.local" << EOF
//
// Do any local configuration here
//

// Forward lookup zone
zone "mylocaldomain.net" {
    type master;
    file "/etc/bind/db.mylocaldomain.net";
};

// Reverse lookup zone
zone "${REV_IP}.in-addr.arpa" {
    type master;
    file "/etc/bind/db.${REV_IP}";
};
EOF

Diese Datei definiert sowohl die Forward-Lookup-Zone (zum Auflösen von Namen zu IPs) als auch die Reverse-Lookup-Zone (zum Auflösen von IPs zurück zu Namen). type master gibt an, dass dieser Server für diese Zonen autoritativ ist.

Erstellen Sie schließlich die Reverse-Zonendatei mit den PTR-Einträgen:

sudo bash -c "cat > /etc/bind/db.${REV_IP}" << EOF
\$TTL    604800
@       IN      SOA     ns1.mylocaldomain.net. admin.mylocaldomain.net. (
                     $(date +%Y%m%d)01 ; Serial
                             604800     ; Refresh
                              86400     ; Retry
                            2419200     ; Expire
                             604800 )   ; Negative Cache TTL
;
@       IN      NS      ns1.mylocaldomain.net.
;
${LAST_OCTET}     IN      PTR     ns1.mylocaldomain.net.
${LAST_OCTET}     IN      PTR     webserver.mylocaldomain.net.
${LAST_OCTET}     IN      PTR     fileserver.mylocaldomain.net.
EOF

Dieser automatisierte Ansatz stellt sicher, dass beide Zonen korrekt in named.conf.local definiert sind und die Reverse-Zonendatei ordnungsgemäß erstellt wird, wodurch häufige Konfigurationsfehler vermieden werden.

bind9-Konfiguration validieren und DNS-Auflösung mit dig testen

In diesem Schritt validieren Sie alle vorgenommenen Konfigurationsänderungen und testen dann Ihren Live-DNS-Server. Es ist eine kritische Praxis, Konfigurationsdateien vor der Anwendung auf Syntaxfehler zu überprüfen, da ein Fehler dazu führen könnte, dass der bind9-Dienst nicht korrekt startet. Nach der Validierung verwenden Sie das dig-Dienstprogramm, um DNS-Abfragen durchzuführen und zu bestätigen, dass Ihr Server wie erwartet funktioniert.

Überprüfen Sie zuerst die Hauptkonfigurationsdateien von bind9 auf Syntaxfehler mit named-checkconf. Wenn dieser Befehl keine Ausgabe erzeugt, bedeutet dies, dass Ihre Konfigurationsdateien (named.conf.local, named.conf.options usw.) gültig sind.

sudo named-checkconf

Validieren Sie als Nächstes die Syntax Ihrer Forward-Lookup-Zonendatei. Der Befehl named-checkzone prüft eine Zonendatei auf Korrektheit.

sudo named-checkzone mylocaldomain.net /etc/bind/db.mylocaldomain.net

Eine erfolgreiche Überprüfung gibt den Status "OK" zurück und zeigt die Seriennummer aus Ihrer Zonendatei an:

zone mylocaldomain.net/IN: loaded serial 2024052001
OK

Validieren Sie nun die Reverse-Lookup-Zone. Da der Zonenname und der Dateiname von der IP-Adresse Ihrer VM abhängen, sammeln Sie zuerst die notwendigen Informationen:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')
ZONE_NAME="${REV_IP}.in-addr.arpa"
ZONE_FILE="/etc/bind/db.${REV_IP}"

Dies erstellt den korrekten Zonenamen und Dateipfad basierend auf der tatsächlichen IP-Adresse Ihrer VM.

Führen Sie nun den Befehl zur Zonenvalidierung aus:

echo "Checking reverse zone: ${ZONE_NAME}"
sudo named-checkzone ${ZONE_NAME} ${ZONE_FILE}

Eine erfolgreiche Überprüfung zeigt erneut den Status "OK" an:

zone 50.16.172.in-addr.arpa/IN: loaded serial 2024052001
OK

Stellen Sie vor dem Neustart sicher, dass der bind9-Dienst die Zonendateien lesen kann, indem Sie den richtigen Besitz festlegen. Rufen Sie zuerst erneut die IP-Informationen ab, um den korrekten Dateipfad zu erstellen:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')
REV_IP=$(echo $IP | awk -F. '{print $3"."$2"."$1}')

Legen Sie nun den richtigen Besitz für beide Zonendateien fest:

sudo chown root:bind /etc/bind/db.mylocaldomain.net "/etc/bind/db.${REV_IP}"

Nachdem alle Konfigurationen validiert wurden, ist es an der Zeit, den bind9-Dienst neu zu starten, um die Änderungen anzuwenden:

sudo systemctl restart bind9

Um sicherzugehen, dass der Dienst korrekt gestartet wurde und Ihre neuen Zonen geladen hat, überprüfen Sie die Systemprotokolle.

sudo grep named /var/log/syslog | grep "loaded serial"

Sie sollten eine Ausgabe sehen, die bestätigt, dass beide Ihrer Zonen erfolgreich geladen wurden. Die Ausgabe enthält auch Standardzonen wie localhost, was normal ist. Wichtig ist, die Zeilen für mylocaldomain.net und Ihre Reverse-Zone zu finden.

... named[...]: zone mylocaldomain.net/IN: loaded serial 2025071401
... named[...]: zone 50.16.172.in-addr.arpa/IN: loaded serial 2025071401
...

Wenn Sie diese Zeilen nicht sehen, überprüfen Sie die Ausgabe von sudo systemctl status bind9 auf Fehler.

Testen Sie abschließend Ihren DNS-Server mit dig. Sie werden Ihren lokalen Server direkt abfragen, indem Sie @127.0.0.1 angeben.

Testen Sie zuerst die Forward-Auflösung für webserver.mylocaldomain.net:

dig @127.0.0.1 webserver.mylocaldomain.net

Suchen Sie in der Ausgabe nach dem ANSWER SECTION. Dort sollte der A-Eintrag angezeigt werden, der auf die IP-Adresse Ihrer VM verweist, und wichtig ist, dass die flags im Header aa für eine autoritative Antwort enthalten sollten. Die Zeile SERVER am Ende sollte 127.0.0.1 anzeigen.

...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;webserver.mylocaldomain.net. IN A

;; ANSWER SECTION:
webserver.mylocaldomain.net. 604800 IN A <your_vm_ip>

;; SERVER: 127.0.0.1#53(127.0.0.1)
...

Testen Sie als Nächstes die Reverse-Auflösung mit der Option -x. Erfassen Sie zuerst die IP-Adresse Ihrer VM:

IP=$(ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}')

Führen Sie nun den Reverse-Lookup-Test durch:

dig @127.0.0.1 -x $IP

Der ANSWER SECTION sollte nun die von Ihnen erstellten PTR-Einträge anzeigen, die Ihre IP-Adresse zurück auf die Hostnamen abbilden, und die flags sollten wieder aa enthalten.

...
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: ...
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 1, ADDITIONAL: 1

;; QUESTION SECTION:
;<last_octet>.<your_reversed_network_part>.in-addr.arpa. IN PTR

;; ANSWER SECTION:
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR fileserver.mylocaldomain.net.
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR ns1.mylocaldomain.net.
<last_octet>.<your_reversed_network_part>.in-addr.arpa. 604800 IN PTR webserver.mylocaldomain.net.

;; SERVER: 127.0.0.1#53(127.0.0.1)
...

Herzlichen Glückwunsch! Sie haben erfolgreich einen grundlegenden autoritativen DNS-Server konfiguriert, validiert und getestet.

Zusammenfassung

In diesem Lab haben Sie einen lokalen autoritativen DNS-Server unter Linux mit dem Softwarepaket bind9 konfiguriert. Der Prozess begann mit der Installation von bind9 und seinen wesentlichen Dienstprogrammen, gefolgt von der Bearbeitung der globalen Datei named.conf.options, um serverweite Verhaltensweisen zu definieren, wie z. B. die Einrichtung von Forwardern zur Auflösung externer Domain-Abfragen.

Anschließend haben Sie die primären DNS-Zonen erstellt: eine Forward-Lookup-Zone für mylocaldomain.net zur Abbildung von Hostnamen auf IP-Adressen mithilfe von A-Records und eine entsprechende Reverse-Lookup-Zone zur Abbildung von IP-Adressen zurück auf Hostnamen mit PTR-Records. Das Lab endete mit der entscheidenden Validierungsphase, in der Sie named-checkconf und named-checkzone zur Überprüfung auf Konfigurationsfehler verwendet und dann die Funktionalität des Live-Servers durch erfolgreiche Forward- und Reverse-Lookups mit dem dig-Dienstprogramm getestet haben.