Skip to main content

Konfiguration eines Secondary DNS mit Plesk

Einleitung

Aufgabe war es, einen kleinen Debian basierten DNS Server von außen zugänglich, aber trotzdem maximal sicher aufzubauen. Der Server sollte als Secondary DNS hinter einem anderen DNS Server funktionieren, der über Plesk verwaltet wird.

Es gibt die Möglichkeit, einfach einen zweiten Server mit Plesk aufzusetzen und diesem die gleiche Konfiguration im DNS anzulegen und ihn als Secondary zu konfigurieren. Das automatische Anlegen vollständig neuer Domains auf dem zweiten Plesk ist damit nicht gelöst und das Setup ist für den Anwendungsfall zu "groß".

Für die Synchronization wurde daher das Plesk Plugin "Slave DNS Manager" verwendet. 
(https://docs.plesk.com/en-US/obsidian/administrator-guide/dns/secondary-dns-server.79004/)

Die Absicherung der Installation findet sich dann hier: Absicherung eines DNS Servers mit nftables

Installation

Betriebssystem

Es wurde ein durch den Hoster bereitgestelltes Debian minimal Image verwendet. Auf dem System ist also DEBIAN 13 mit minimaler Konfiguration installiert.

BIND auf dem Secondary installieren

sudo apt update
sudo apt install bind9 bind9-utils dnsutils

Dienst prüfen:

systemctl status bind9
systemctl status named
(Je nach Distribution und Version)

RNDC-Schlüssel erzeugen

Der Plesk-Server muss auf dem Secondary dynamisch neue Zonen anlegen können. 

Dafür wird rndc über TCP-Port 953 verwendet.

Auf dem Secondary:

openssl rand -base64 32

Beispielausgabe:

XrF7kLWbINlRpO6D7BmqbAOu8kX8+F8fAHY7Qn1xVOM=

Diesen Wert sicher speichern. Er wird anschließend auf beiden Seiten verwendet.

BIND für dynamisch angelegte Secondary-Zonen konfigurieren

allow-new-zones aktivieren

Auf Debian befindet sich der vorhandene options-Block normalerweise in:

/etc/bind/named.conf.options

Innerhalb des bereits vorhandenen Blocks ergänzen:

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

    allow-new-zones yes;

    recursion no;
    allow-query { any; };

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

Wichtig: Keinen zweiten separaten options-Block anlegen, sondern den vorhandenen erweitern.

Plesk benötigt allow-new-zones yes, weil die Erweiterung neue Zonen über rndc addzone auf dem Secondary erzeugt.

RNDC-Key und Controls konfigurieren

Datei anlegen:

sudo nano /etc/bind/plesk-secondary.conf

Inhalt:

key "plesk-primary" {
    algorithm hmac-sha256;
    secret "XrF7kLWbINlRpO6D7BmqbAOu8kX8+F8fAHY7Qn1xVOM="; # Hier das korrekte Secret einsetzen!
};

controls {
    inet 198.51.100.20 port 953
        allow {
            203.0.113.10;
            127.0.0.1;
        }
        keys {
            "plesk-primary";
        };
};

Dabei ersetzen:

198.51.100.20 = IP des Secondary
203.0.113.10  = öffentliche IP des Plesk-Primary

Die Konfiguration in /etc/bind/named.conf einbinden:

include "/etc/bind/plesk-secondary.conf";

Beispielsweise am Ende der Datei:

sudo nano /etc/bind/named.conf

Rechte einschränken:

sudo chown root:bind /etc/bind/plesk-secondary.conf
sudo chmod 640 /etc/bind/plesk-secondary.conf

Konfiguration prüfen:

sudo named-checkconf

Wenn keine Ausgabe erscheint, ist die Syntax korrekt.

BIND neu starten:

sudo systemctl restart bind9

Port prüfen:

sudo ss -lntp | grep ':953'

Erwartet wird ein Listener auf der Secondary-IP:

198.51.100.20:953

Slave DNS Manager in Plesk installieren

In Plesk:

Erweiterungen → 
               Erweiterungskatalog → 
                                    Slave DNS Manager → 
                                                       Installieren

Danach:

Erweiterungen → 
               Meine Erweiterungen → 
                                    Slave DNS Manager → 
                                                       Add Slave

Eintragen:

IP address: 198.51.100.20
Port:       953
Secret:     XrF7kLWbINlRpO6D7BmqbAOu8kX8+F8fAHY7Qn1xVOM=
(Beispiel)

Je nach Version fragt die Erweiterung möglicherweise zusätzlich den Key-Namen ab:

plesk-primary

Plesk fügt die Secondary-IP automatisch zur Transfer-ACL der verwalteten Zonen hinzu. Bei Änderungen verwendet die Erweiterung intern unter anderem:

rndc addzonerndc refreshrndc delzone

Dadurch werden sowohl neue Zonen als auch Änderungen und Löschungen auf den Secondary übertragen.

Bestehende Zonen synchronisieren

Im Slave DNS Manager anschließend die Funktion verwenden:

Resync

Dadurch werden bereits vorhandene aktive DNS-Zonen auf dem Secondary angelegt.

Auf dem Secondary währenddessen das Log beobachten:

sudo journalctl -u named -f

Auf dem Plesk-Server schreibt der DNS-Dienst relevante Fehler unter anderem nach:

/var/log/plesk/messages

Beide Nameserver in der Plesk-DNS-Vorlage hinterlegen

Unter:

Tools & Einstellungen → 
                       DNS-Vorlage

sollten mindestens folgende NS-Einträge enthalten sein:

<domain>.    NS    ns1.example.net.
<domain>.    NS    ns2.example.net.

Außerdem müssen die Hostnamen selbst auflösbar sein:

ns1.example.net.    A    203.0.113.10
ns2.example.net.    A    198.51.100.20

Bei bestehenden Domains kann die DNS-Vorlage über die jeweilige DNS-Konfiguration angewendet werden. 

Wichtig: Plesk unterscheidet zwischen automatisch aus der Vorlage übernommenen und manuell veränderten Einträgen.

Registrar und Glue Records konfigurieren

Die NS-Einträge innerhalb der eigenen Zone reichen nicht aus. Beim Registrar der jeweiligen Domain müssen ebenfalls beide Nameserver eingetragen werden:

ns1.example.net
ns2.example.net

Falls sich die Nameserver innerhalb der von ihnen verwalteten Domain befinden, beispielsweise:

example.net wird von ns1.example.net und ns2.example.net verwaltet

müssen beim Registrar sogenannte Glue Records beziehungsweise Host Records registriert werden:

ns1.example.net → 203.0.113.10
ns2.example.net → 198.51.100.20

Ohne diese Glue Records entsteht bei der Auflösung eine zyklische Abhängigkeit.

Synchronisation testen

SOA-Serial vergleichen

Primary:

dig @203.0.113.10 example.org SOA +short

Secondary:

dig @198.51.100.20 example.org SOA +short

Die SOA-Serial muss auf beiden Servern identisch sein.

Beispiel:

ns1.example.net. hostmaster.example.org. 2026062503 10800 3600 604800 10800

Testeintrag in Plesk anlegen

In Plesk:

Domains → 
         example.org → 
                      DNS → 
                           Eintrag hinzufügen

Beispielsweise:

Typ: TXT
Name: secondary-test
Wert: sync-ok

Danach direkt beide Server abfragen:

dig @203.0.113.10 secondary-test.example.org TXT +short
dig @198.51.100.20 secondary-test.example.org TXT +short

Beide müssen liefern:

"sync-ok"

Autoritative Nameserver kontrollieren

dig example.org NS +short

Erwartet:

ns1.example.net.
ns2.example.net.

Direkte Autoritätsprüfung:

dig @203.0.113.10 example.org SOA +norecurse
dig @198.51.100.20 example.org SOA +norecurse

In beiden Antworten sollte das aa-Flag gesetzt sein.

Häufige Fehler

Secondary erscheint als erreichbar, Zonen fehlen aber

Prüfen:

named-checkconf
journalctl -u named --since "10 minutes ago"

Typische Ursachen:

  • allow-new-zones yes; fehlt
  • RNDC-Key stimmt nicht überein
  • TCP 953 ist blockiert
  • Secondary kann den Primary nicht über TCP 53 erreichen
  • BIND darf nicht in sein Zonenverzeichnis schreiben
  • Plesk-DNS-Zone ist deaktiviert

permission denied beim Anlegen der Zone

Debian:

sudo chown bind:bind /var/cache/bind
sudo chmod 750 /var/cache/bind

Auf RHEL-/AlmaLinux-Systemen kann zusätzlich SELinux relevant sein:

sudo setsebool -P named_write_master_zones 1

Nur UDP 53 geöffnet

Autoritative DNS-Server benötigen auch TCP 53. Zonentransfers laufen grundsätzlich über TCP, und größere DNS-/DNSSEC-Antworten können ebenfalls TCP erfordern.

Manuelle Änderung auf dem Secondary

Nicht durchführen. Der Secondary übernimmt die Zone erneut vom Primary und überschreibt lokale Änderungen. 

Alle DNS-Daten düfen ausschließlich in Plesk gepflegt werden.