Sincronice automáticamente todas las zonas entre BIND 9

9

¿Hay alguna forma de sincronizar automáticamente todas las zonas entre los servidores BIND (9) para que no tenga que agregar zonas al esclavo cuando las agrego al maestro?

pupeno
fuente
1
aparte de agregarlos manualmente a named.conf, no veo otra manera; si eso es lo que usted pidió
Quaie

Respuestas:

12

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

Knobee
fuente
Cuando promocione el software con el que está asociado, incluya alguna referencia a ese hecho (incluso si el software es gratuito). Gracias y bienvenidos a Server Fault.
Chris S
Sí, trabajo para ISC, los tipos que mantienen BIND e ISC DHCP. :)
Knobee
4

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.

Daniel Lawson
fuente
1
+1: yo mismo uso una técnica similar (pero probablemente menos eficiente) y parece funcionar de manera confiable. Para obtener una rápida propagación a los esclavos de los nuevos cambios, necesitan sondear el documento maestro con frecuencia (he descubierto que cada diez minutos es más que suficiente).
David Spillett
Antes de obtener las religiones duales de Automation y Tinydns, tenía un script que analizaba la lista de configuración de zona del maestro para obtener la lista de zonas, que expuse a través de inetd, y luego un script en los esclavos que sondeó cualquier número de IP maestra direcciones (y usó esa dirección como la dirección IP maestra en sus configuraciones esclavas). Trabajó un sueño.
womble
4

¿Quizás está buscando un sistema de gestión de configuración como Puppet o CFEngine? Hay infraestructura adicional involucrada, pero pueden manejar la distribución de muchas cosas de configuración, y también podrían incluir esto fácilmente.

Tim Howland
fuente
2

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.

John Gardeniers
fuente
Ahora BIND aparentemente puede, vea la respuesta de @ Knobee.
Volker Stolz
@mad_vs - Gracias, de lo contrario no habría visto esa respuesta.
John Gardeniers
1

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 = /

caballete
fuente
0

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.

Greeblesnort
fuente
0

Para la cantidad de zonas que tengo, la sincronización manual terminó siendo más fácil que hacer que funcione cualquier otra solución. Si tuviera muchas más zonas, buscaría las soluciones propuestas.

pupeno
fuente
0
  1. Cree una secuencia de comandos para extraer todos los nombres de archivo de zona del maestro (ls -1 hará la mayor parte de esto).
  2. Cree un script en el esclavo que tome la lista de archivos de zona como entrada, y cree un named.conf.local a partir de esa lista (el formato es bastante simple), y reemplace el named.conf.local existente (puede usar otro nombre e inclúyalo desde named.conf.local si desea jugar de forma segura)
  3. cree un acceso de sudo sin contraseña de comando único para "recargar rndc" en el esclavo.
  4. Cree una clave ssh de un solo uso que le permita enviar la lista de zonas desde el maestro, y canalícela al script esclavo y luego ejecute "sudo rndc reload". Ahora puede empujar las zonas del maestro al esclavo.
  5. (opcional) cree un trabajo cron para impulsar las zonas diariamente, o lo que sea.

Buena experiencia, resolviendo esto. Puedo publicar mis guiones, si alguien los quiere.


fuente
@ naught101, ¿puedes publicar los guiones por favor?
0

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
BobMorley
fuente