Respostas:
Observe o BIND 9.7.2-P2, no qual você tem as instruções "rndc addzone" e "rndc delzone" que permitem adicionar e remover remotamente "remotamente" zonas de um servidor em execução.
Eu tenho um artigo que fornece alguns exemplos que dei no NANOG no mês passado.
ftp://ftp.isc.org/isc/pubs/pres/NANOG/50/DNSSEC-NANOG50.pdf
Embora isso não volte e limpe qualquer bagunça que você tenha atualmente, torna muito fácil sincronizar máquinas que você pode gerenciar usando o "rndc" daqui para frente.
[sim, respondendo a um post bastante antigo, mas o BIND 9.7.2-P2 é legal o suficiente para justificá-lo]
Adicionando mais uma atualização (anos após o fato, mas esperando que ajude as pessoas que se deparam com isso nos resultados de pesquisa), eu gostaria de recomendar o uso das zonas do Catálogo.
As zonas de catálogo, introduzidas no BIND 9.11 (2018), permitem o provisionamento automático de zonas (adição e exclusão) por meio de uma zona especial que é compartilhada entre os servidores primário e secundário.
Para informações completas, consulte: https://kb.isc.org/docs/aa-01401
Não conheço nenhuma maneira de fazer isso de forma nativa para ligar o bind9 se você estiver usando o back-end de arquivo simples. Existem vários sistemas suportados por banco de dados que podem ajudar a automatizá-lo. Ou você pode criar um script:
Povo um arquivo de texto com uma lista de zonas e o IP principal do NS para a zona e colo em um site ao qual permito que meus escravos acessem. Os escravos buscam esse arquivo periodicamente e, se ele foi alterado, eles geram um named.conf e informam ao bind para recarregar as configurações. É "automático" no sentido de que eu não tenho que ssh manualmente para meus secundários e atualizar configurações, mas ainda é externo ao bind9.
Você também pode usar um sistema de gerenciamento de configuração de nível superior, como fantoche , para gerenciar toda a infraestrutura DNS. Isso é um pouco mais complicado.
Vincular-se não pode fazê-lo. Mais precisamente, seria indesejável fazê-lo. Existem muitas situações em que apenas determinados domínios devem ser replicados com qualquer escravo.
O uso do rsync em toda a sua árvore / var / named funcionará muito bem se você escrever suas zonas corretamente e garantir que o named.conf viva em / var / named. No entanto, ele não funciona com atualizações dinâmicas e é meio que contra "como as coisas devem ser feitas".
Também experimentei o preenchimento de todos os domínios para propagar em uma zona especial e usei um script simples nos escravos para reconstruir o named.conf com base no que eles veem na zona principal. Basicamente, o mesmo negócio que o arquivo de texto acima, mas alimentando-o pelo DNS para manter tudo dentro da banda. Provavelmente, devo publicar o script antes de acabar perdendo-o = /
Nos dias em que todos e sua mãe tinham seus próprios domínios, me surpreende que não exista uma boa solução para isso integrada ao Bind agora = /
Eu segundo (ou terceiro) as sugestões acima para verificar Puppet ou CFEngine. Além disso, você pode verificar seus arquivos dentro e fora do CVS / SVN. Se você estiver interessado em uma solução de script, eis o que eu 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
As teclas ssh são bastante essenciais para essa configuração. Não reivindico poderes extraordinários de script-fu, fique à vontade para criticar, mas seja gentil.
Boa experiência, trabalhando isso. Posso postar meus scripts, se alguém quiser.
Este é um código php que o servidor principal pode executar para criar uma lista. As opções poderiam ser carregá-lo em um banco de dados ou outros servidores DNS podem enviá-lo por http / s.
O servidor mestre pode executar isso:
$dir = "/var/lib/bind";
$files = scandir($dir);
foreach($files as $file) {
$zoneparts = explode(".hosts", $file);
if(count($zoneparts) > 1){
echo $zoneparts[0] . "\r\n";
}
}
O servidor escravo pode executar isso:
$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);
}}
}
O diretório "zone" precisará ser gravável
Em seguida, crie um 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
Em seguida, crie um chronjob como root (crontab -e):
*/10 * * * * /home/bob/dns_sync.sh