Risposte:
Guarda BIND 9.7.2-P2 in cui hai le istruzioni "rndc addzone" e "rndc delzone" che ti consentono di aggiungere e rimuovere "in remoto" le zone da un server in esecuzione.
Ho un documento che fornisce alcuni esempi che ho dato a NANOG il mese scorso.
ftp://ftp.isc.org/isc/pubs/pres/NANOG/50/DNSSEC-NANOG50.pdf
Anche se questo non tornerà indietro e ripulirà qualsiasi pasticcio che hai attualmente, rende davvero facile sincronizzare le macchine che puoi gestire usando "rndc" in futuro.
[sì, rispondendo a un post piuttosto vecchio, ma BIND 9.7.2-P2 è abbastanza interessante da giustificarlo]
Aggiungendo un altro aggiornamento (anni dopo il fatto, ma sperando che aiuti le persone che si imbattono in questo nei risultati di ricerca), vorrei raccomandare l'uso delle zone del catalogo.
Le zone del catalogo, introdotte in BIND 9.11 (2018), consentono il provisioning automatico delle zone (aggiunta ed eliminazione) attraverso una zona speciale condivisa tra i server primario e secondario.
Per informazioni complete, consultare: https://kb.isc.org/docs/aa-01401
Non so come fare in modo nativo per legare9 se stai usando backend flatfile. Esistono vari sistemi supportati da DB che possono aiutare ad automatizzarlo. Oppure puoi copiarlo:
Popolo un file di testo con un elenco di zone e l'IP NS primario per la zona e lo inserisco in un sito Web a cui consento l'accesso ai miei schiavi. Gli slave recuperano periodicamente questo file e, se è cambiato, lo analizzano generano un named.conf e dicono a bind di ricaricare le configurazioni. È "automatico", nel senso che non devo inviare ssh manualmente ai miei secondari e aggiornare le configurazioni, ma è ancora esterno a bind9.
È inoltre possibile utilizzare un sistema di gestione della configurazione di livello superiore come un pupazzo , per gestire l'intera infrastruttura DNS. È un po 'più complicato però.
Il legame stesso non può farlo. Più precisamente, sarebbe indesiderabile farlo. Esistono molte situazioni in cui solo determinati domini devono essere replicati con un dato slave.
L'uso di rsync sull'intero albero / var / named funziona abbastanza bene se scrivi correttamente le tue zone e assicurati che named.conf risieda in / var / named. Tuttavia, non funzionerà con gli aggiornamenti dinamici, ed è in qualche modo contrario a "come dovrebbero essere fatte le cose".
Ho anche sperimentato il riempimento di tutti i domini per propagarli in una zona speciale e ho usato un semplice script sugli slave per ricostruire il nome.conf in base a ciò che vedono nella zona principale. Fondamentalmente lo stesso affare del file di testo sopra, ma alimentandolo dal DNS per mantenere tutto in banda. Probabilmente dovrei pubblicare lo script prima di finire per perderlo = /
Ai giorni in cui tutti e la loro mamma avevano i loro domini, mi sorprende che non ci sia una buona soluzione per questo integrata con Bind ormai = /
I secondo (o terzo) i suggerimenti di cui sopra per controllare Puppet o CFEngine. Inoltre, potresti esaminare il controllo dei tuoi file dentro e fuori CVS / SVN. Se sei interessato a una soluzione di scripting, ecco cosa uso:
#!/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
i tasti ssh sono piuttosto essenziali per questa configurazione. Non rivendico straordinari poteri di scripting, quindi sentiti libero di criticare, ma sii gentile.
Buona esperienza, risolvendolo. Posso pubblicare i miei script, se qualcuno li desidera.
Questo è un codice php che il server master può eseguire per creare un elenco. Le opzioni quindi potrebbero essere quelle di caricarlo su un DB o gli altri server DNS possono trasferirlo su http / s.
Il server principale può eseguire questo:
$dir = "/var/lib/bind";
$files = scandir($dir);
foreach($files as $file) {
$zoneparts = explode(".hosts", $file);
if(count($zoneparts) > 1){
echo $zoneparts[0] . "\r\n";
}
}
Il server slave può eseguire questo:
$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);
}}
}
La directory "zone" dovrà essere scrivibile
Quindi crea uno script bash come questo:
#!/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
Quindi crea un chronjob come root (crontab -e):
*/10 * * * * /home/bob/dns_sync.sh