Synchronisieren Sie automatisch alle Zonen zwischen BIND 9


8

Gibt es eine Möglichkeit, alle Zonen zwischen BIND (9) -Servern automatisch zu synchronisieren, damit ich dem Slave keine Zonen hinzufügen muss, wenn ich sie dem Master hinzufüge?


1
außer sie manuell zu named.conf hinzuzufügen, sehe ich keinen anderen Weg; wenn es das ist, was du gefragt hast
quaie

Antworten:


12

Schauen Sie sich BIND 9.7.2-P2 an, in dem Sie die Anweisungen "rndc addzone" und "rndc delzone" haben, mit denen Sie Zonen "remote" zu einem laufenden Server hinzufügen und daraus entfernen können.

Ich habe ein Papier, das einige Beispiele enthält, die ich letzten Monat bei NANOG gegeben habe.

ftp://ftp.isc.org/isc/pubs/pres/NANOG/50/DNSSEC-NANOG50.pdf

Dies wird zwar nicht zurückgehen und das derzeitige Chaos beseitigen, macht es jedoch wirklich einfach, Maschinen zu synchronisieren, die Sie in Zukunft mit "rndc" verwalten können.

[Ja, auf einen ziemlich alten Beitrag antworten, aber BIND 9.7.2-P2 ist cool genug, um dies zu rechtfertigen]

Wenn ich noch ein weiteres Update hinzufüge (Jahre später, aber in der Hoffnung, dass es Leuten hilft, die in den Suchergebnissen darauf stoßen), möchte ich die Verwendung von Katalogzonen empfehlen.

In BIND 9.11 (2018) eingeführte Katalogzonen ermöglichen die automatische Bereitstellung von Zonen (Hinzufügen und Löschen) über eine spezielle Zone, die vom primären und sekundären Server gemeinsam genutzt wird.

Ausführliche Informationen finden Sie unter: https://kb.isc.org/docs/aa-01401


Wenn Sie für Software werben, mit der Sie verbunden sind, geben Sie bitte einen Hinweis auf diese Tatsache an (auch wenn die Software kostenlos ist). Vielen Dank und willkommen bei Server Fault.
Chris S

Ja, ich arbeite für ISC, die Leute, die BIND und ISC DHCP pflegen. :)
Knobee

4

Ich kenne keine Möglichkeit, dies nativ für bind9 zu tun, wenn Sie das Flatfile-Backend verwenden. Es gibt verschiedene DB-gestützte Systeme, die zur Automatisierung beitragen können. Oder Sie können es schreiben:

Ich fülle eine Textdatei mit einer Liste von Zonen und der primären NS-IP für die Zone und klebe sie auf eine Website, auf die meine Slaves zugreifen können. Die Slaves rufen diese Datei regelmäßig ab. Wenn sie geändert wurde, analysieren sie sie und generieren eine named.conf. Sie weisen bind an, die Konfigurationen neu zu laden. Es ist "automatisch" in dem Sinne, dass ich nicht manuell auf meine Secondaries ssh und Konfigurationen aktualisieren muss, aber es ist immer noch extern zu bind9.

Sie können auch ein übergeordnetes Konfigurationsverwaltungssystem wie Puppet verwenden , um Ihre gesamte DNS-Infrastruktur zu verwalten. Das ist allerdings etwas komplizierter.


1
+1 - Ich verwende selbst eine ähnliche (aber wahrscheinlich weniger effiziente) Technik und sie scheint zuverlässig zu funktionieren. Um eine schnelle Weitergabe neuer Änderungen an die Slaves zu erreichen, müssen sie das Masterdokument häufig abfragen (ich habe festgestellt, dass alle zehn Minuten mehr als häufig genug sind).
David Spillett

Bevor ich die dualen Religionen Automation und Tinydns bekam, hatte ich ein Skript, das die Zonenkonfigurationsliste des Masters analysierte, um die Liste der Zonen zu erhalten, die ich über inetd verfügbar machte, und dann ein Skript auf den Slaves, die eine beliebige Anzahl von Master-IPs abfragten Adressen (und diese Adresse als Master-IP-Adresse in ihren Slave-Konfigurationen verwendet). Hat einen Traum erfüllt.
womble

4

Vielleicht suchen Sie ein Konfigurationsmanagementsystem wie Puppet oder CFEngine? Es ist eine zusätzliche Infrastruktur erforderlich, aber sie können eine Menge Konfigurationsmaterial verteilen und dies auch problemlos einschließen.


2

Bind selbst kann es nicht. Genauer gesagt wäre es unerwünscht, dies zu tun. Es gibt viele Situationen, in denen nur bestimmte Domänen mit einem bestimmten Slave repliziert werden sollten.


Jetzt kann BIND anscheinend, siehe @ Knobees Antwort.
mad_vs

@mad_vs - Danke, ich hätte diese Antwort sonst nicht gesehen.
John Gardeniers

1

Die Verwendung von rsync für Ihren gesamten / var / named-Baum funktioniert ziemlich gut, wenn Sie Ihre Zonen korrekt schreiben und sicherstellen, dass named.conf in / var / named lebt. Es funktioniert jedoch nicht mit dynamischen Updates und ist ein bisschen gegen den Strich, "wie Dinge gemacht werden sollten".

Ich habe auch experimentiert, alle Domänen zu stopfen, um sie in eine spezielle Zone zu übertragen, und ein einfaches Skript für die Slaves verwendet, um die named.conf basierend auf dem, was sie in der Masterzone sehen, neu zu erstellen. Im Grunde das gleiche Angebot wie in der obigen Textdatei, jedoch über DNS, um alles im Band zu halten. Ich sollte das Skript wahrscheinlich veröffentlichen, bevor ich es verliere = /

In den Tagen, in denen alle und ihre Mutter ihre eigenen Domains haben, überrascht es mich, dass es derzeit keine gute Lösung für diese in Bind integrierte gibt = /


0

Ich stimme den obigen Vorschlägen zu (oder drittens), um Puppet oder CFEngine auszuprobieren. Sie können auch Ihre Dateien in CVS / SVN ein- und auschecken. Wenn Sie an einer Skriptlösung interessiert sind, verwende ich Folgendes:

#!/bin/bash

DATE=`date +%Y-%m-%d`
archive='/root/dns'
cd $archive
[ $1 ] && DEBUG=$1
if [ "$DEBUG" == "-debug" ]; then 
        echo "Debugging activated..."
else
        unset DEBUG
fi

for server in dnsm02 dnsm03 dnsm51 dnsm52; do

        for file in named.conf named.cfx.conf named.external.conf named.internal.conf named.logging.conf named.options.conf; do
                PATCHDIR="$archive/$server/$DATE/patch" && [ $DEBUG ] && echo "PATCHDIR = $PATCHDIR"
                SRVDIR="$archive/$server/$DATE" && [ $DEBUG ] && echo "SRVDIR = $SRVDIR"

                ## Fetch bind config files from $server, put them in date stamped $archive/$server
                [ ! -d $PATCHDIR ] && mkdir -p $PATCHDIR  && [ $DEBUG ] && echo "Created archive directory"
                scp -q user@$server:/etc/bind/$file $archive/$server/$DATE/$file && [ $DEBUG ] && echo "Copied remote $file from $server..."

                ## diff fetched file against template file and create a patch
                [ $DEBUG ] && echo "Creating patch file..."
                diff -u $SRVDIR/$file $archive/$server/$file > $PATCHDIR/patch.$file
                [ ! -s $PATCHDIR/patch.$file ]  && rm -f $PATCHDIR/patch.$file && [ $DEBUG ] &&  echo "no differences , no patch created for $server $file"
                [ -s $PATCHDIR/patch.$file ] && patch $SRVDIR/$file $PATCHDIR/patch.$file && ssh user@$server "sudo scp user@dnsm01:$SRVDIR/$file /etc/bind/$file" && [ $DEBUG ] && echo "$file patched and uploaded"
        done
        [ $DEBUG ] && echo "Checking whether patch directory is empty..."
        [ $(ls -1A $PATCHDIR | wc -l) -eq 0 ] && rmdir $PATCHDIR && [ $DEBUG ] && echo "$PATCHDIR empty, removing..."

        ssh user@$server "sudo rndc reload"
done

SSH-Schlüssel sind für dieses Setup ziemlich wichtig. Ich beanspruche keine außergewöhnlichen Scripting-Fu-Fähigkeiten, also zögern Sie nicht zu kritisieren, aber seien Sie sanft.


0

Bei der Anzahl der Zonen war die manuelle Synchronisierung einfacher als jede andere Lösung. Wenn ich viel mehr Zonen hätte, würde ich mir die vorgeschlagenen Lösungen ansehen.


0
  1. Erstellen Sie ein Skript, um alle Zonendateinamen vom Master zu rippen (ls -1 erledigt das meiste davon).
  2. Erstellen Sie auf dem Slave ein Skript, das die Liste der Zonendateien als Eingabe verwendet, und erstellen Sie aus dieser Liste eine named.conf.local (die Formatierung ist ziemlich einfach), und ersetzen Sie die vorhandene named.conf.local (Sie können eine andere verwenden Name und fügen Sie es aus named.conf.local ein, wenn Sie auf Nummer sicher gehen möchten.
  3. Erstellen Sie einen passwortlosen Sudo-Zugriff mit einem einzigen Befehl für "rndc reload" auf dem Slave.
  4. Erstellen Sie einen SSH-Schlüssel für den einmaligen Gebrauch, mit dem Sie die Liste der Zonen vom Master senden, in das Slave-Skript weiterleiten und dann "sudo rndc reload" ausführen können. Sie können jetzt die Zonen vom Master zum Slave verschieben.
  5. (optional) Erstellen Sie einen Cron-Job, um die Zonen täglich oder was auch immer zu verschieben.

Gute Erfahrung, das herauszufinden. Ich kann meine Skripte posten, wenn jemand sie will.


@ naught101, kannst du die Skripte bitte posten?

0

Dies ist ein PHP-Code, den der Master-Server ausführen kann, um eine Liste zu erstellen. Sie können es dann in eine Datenbank hochladen oder die anderen DNS-Server können es über http / s abrufen.

Der Master-Server kann Folgendes ausführen:

$dir = "/var/lib/bind";
$files = scandir($dir);
foreach($files as $file) {
    $zoneparts = explode(".hosts", $file);
   if(count($zoneparts) > 1){
       echo $zoneparts[0] . "\r\n";
   }
}

Slave-Server kann dies ausführen:

$zones = file(URL TO MASTER SERVER);
if($zones != ""){

$header = "// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
";




file_put_contents("/var/www/html/zone/zones.txt", $header);

foreach($zones as $zone){
if($zone != "") {
$zone = preg_replace('~[[:cntrl:]]~', '', $zone);
$config = 'zone "' . $zone.'" {
        type slave;
        masters {lemming; };
        allow-transfer {none; };
        file "/var/lib/bind/db.'.$zone.'";
};

';


file_put_contents('/var/www/html/zone/zones.txt', $config, FILE_APPEND);
}}

}

Das Verzeichnis "zone" muss beschreibbar sein

Erstellen Sie dann ein Bash-Skript wie folgt:

#!/bin/bash

    php /var/www/html/index.php
    cp /var/www/html/zone/zones.txt /etc/bind/named.conf
    service bind9 restart
    logger DNS Zones pulled from master and bind restarted /home/bob/dns_sync.sh

Dann erstelle einen Chronjob als root (crontab -e):

*/10 * * * * /home/bob/dns_sync.sh
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.