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?
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?
Antworten:
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
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.
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.
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 = /
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.
Gute Erfahrung, das herauszufinden. Ich kann meine Skripte posten, wenn jemand sie will.
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