Respuestas:
Observe BIND 9.7.2-P2 en el que tiene las declaraciones "rndc addzone" y "rndc delzone" que le permiten agregar y eliminar "remotamente" zonas de un servidor en ejecución.
Tengo un documento que proporciona algunos ejemplos que di en NANOG el mes pasado.
ftp://ftp.isc.org/isc/pubs/pres/NANOG/50/DNSSEC-NANOG50.pdf
Si bien esto no retrocederá y limpiará cualquier desorden que tenga actualmente, hace que sea realmente fácil sincronizar máquinas que puede administrar usando "rndc" en el futuro.
[sí, respondiendo a una publicación bastante antigua, pero BIND 9.7.2-P2 es lo suficientemente genial como para justificarlo]
Añadiendo otra actualización (años después del hecho, pero con la esperanza de que ayude a las personas que se encuentran con esto en los resultados de búsqueda), me gustaría recomendar el uso de zonas de catálogo.
Las zonas de catálogo, introducidas en BIND 9.11 (2018) permiten el aprovisionamiento automático de zonas (adición y eliminación) a través de una zona especial que se comparte entre los servidores primario y secundario.
Para obtener información completa, consulte: https://kb.isc.org/docs/aa-01401
No conozco ninguna forma de hacer esto de forma nativa para unir9 si está utilizando un backend de archivos planos. Existen varios sistemas respaldados por DB que pueden ayudar a automatizarlo. O puedes escribirlo:
Rellene un archivo de texto con una lista de zonas y la IP de NS principal para la zona, y lo pego en un sitio web al que les permita el acceso a mis esclavos. Los esclavos obtienen este archivo periódicamente y, si ha cambiado, lo analizan, generan un named.conf y le dicen a bind que vuelva a cargar las configuraciones. Es "automático" en el sentido de que no tengo que ssh manualmente a mis secundarios y actualizar configuraciones, pero aún es externo a bind9.
También puede usar un sistema de administración de configuración de nivel superior, como puppet , para administrar toda su infraestructura DNS. Sin embargo, eso es un poco más complicado.
Bind en sí mismo no puede hacerlo. Más concretamente, sería indeseable que lo hiciera. Hay muchas situaciones en las que solo ciertos dominios deben replicarse con un esclavo determinado.
Usar rsync en todo su árbol / var / named funciona bastante bien si escribe sus zonas correctamente y se asegura de que named.conf viva en / var / named. Sin embargo, no funcionará con actualizaciones dinámicas, y va en contra de la cuestión de "cómo deben hacerse las cosas".
También experimenté rellenando todos los dominios para propagarlos en una zona especial, y utilicé un script simple en los esclavos para reconstruir el named.conf en función de lo que ven en la zona maestra. Básicamente el mismo trato que el archivo de texto anterior, pero alimentándolo desde DNS para mantener todo en banda. Probablemente debería publicar el script antes de terminar perdiéndolo = /
En los días en que todos y sus madres tienen sus propios dominios, me sorprende que no haya una buena solución para esto integrada con Bind por ahora = /
Segundo (o tercero) las sugerencias anteriores para ver Puppet o CFEngine. Además, puede mirar al ingresar y salir de sus archivos de CVS / SVN. Si está interesado en una solución de secuencias de comandos, esto es lo que 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
Las teclas ssh son bastante esenciales para esta configuración. No reclamo poderes extraordinarios de scripting-fu, así que siéntete libre de criticar, pero sé gentil.
Buena experiencia, resolviendo esto. Puedo publicar mis guiones, si alguien los quiere.
Este es un código php que el servidor maestro puede ejecutar para crear una lista. Las opciones podrían ser subirlo a una base de datos o los otros servidores DNS pueden moverlo sobre http / s.
El servidor maestro puede ejecutar esto:
$dir = "/var/lib/bind";
$files = scandir($dir);
foreach($files as $file) {
$zoneparts = explode(".hosts", $file);
if(count($zoneparts) > 1){
echo $zoneparts[0] . "\r\n";
}
}
El servidor esclavo puede ejecutar esto:
$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);
}}
}
El directorio de "zona" deberá poder escribirse
Luego crea un script bash como este:
#!/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
Luego cree un cronjob como root (crontab -e):
*/10 * * * * /home/bob/dns_sync.sh