Para a quantidade de zonas que tenho, a sincronização manual acabou sendo mais fácil do que fazer qualquer outra solução funcionar. Se eu tivesse muitas outras zonas, procuraria as soluções propostas.
Existe uma maneira de sincronizar automaticamente todas as zonas entre os servidores BIND (9) para que eu não precise adicionar zonas ao escravo quando as adiciono ao mestre?
Veja o BIND 9.7.2-P2 no qual você tem as instruções "rndc addzone" e "rndc delzone" que permitem "remotamente" adicionar e remover zonas de um servidor em execução.
Eu tenho um artigo que fornece alguns exemplos que eu dei no NANOG no mês passado.
ftp://ftp.isc.org/isc/pubs/pres /NANOG/50/DNSSEC-NANOG50.pdf
Enquanto isso não vai voltar e limpar qualquer bagunça que você tem atualmente, torna muito fácil sincronizar máquinas que você é capaz de gerenciar usando o "rndc" daqui para frente.
[sim, respondendo a um post antigo, mas o BIND 9.7.2-P2 é legal o suficiente para justificar isso]
Eu não sei de nenhuma maneira de fazer isso nativamente para bind9 se você estiver usando o backend flatfile. Existem vários sistemas suportados por banco de dados que podem ajudar a automatizá-lo. Ou você pode fazer o script:
Eu preencho um arquivo de texto com uma lista de zonas e o principal IP do NS para a zona, e coloco em um site que eu permito que meus escravos acessem. Os escravos buscam este arquivo periodicamente, e se ele modificou, ele gera um named.conf, e diz ao bind para recarregar as configurações. É "automático" no sentido de que eu não tenho que manualmente o ssh para meus secundários e atualizar as configurações, mas ele ainda é externo para bind9.
Você também pode usar um sistema de gerenciamento de configuração de nível mais alto, como o fantoche , para gerenciar toda a sua infraestrutura de DNS. Isso é um pouco mais complicado.
Vincular-se não pode fazer isso. Mais ao ponto, seria indesejável que isso acontecesse. Existem muitas situações em que apenas determinados domínios devem ser replicados com qualquer escravo.
Usar o rsync em toda a árvore / var / named funciona muito bem se você escrever suas zonas corretamente e certificar-se de que o named.conf mora em / var / named. Não funcionará com atualizações dinâmicas, e é meio que contrário a "como as coisas devem ser feitas".
Eu também experimentei o preenchimento de todos os domínios para se propagar em uma zona especial, e usei um script simples nos escravos para reconstruir o named.conf com base no que eles vêem na zona master. Basicamente a mesma coisa que o arquivo de texto acima, mas alimentando-o do DNS para manter tudo dentro da banda. Eu provavelmente deveria publicar o roteiro antes de acabar perdendo = /
Nos dias em que todo mundo e sua mãe têm seus próprios domínios, me surpreende que não haja uma boa solução para isso. Agora, integrado com o Bind = /
I 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, veja 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 chaves ssh são essenciais para essa configuração. Eu não reivindico poderes extraordinários de scripting-fu, então sinta-se livre para criticar, mas seja gentil.
Boa experiência, trabalhando nisso. Eu posso postar meus scripts, se alguém quiser.
Este é um código php que o servidor mestre pode executar para criar uma lista. As opções então poderiam ser fazer o upload para um banco de dados ou os outros servidores DNS podem acessá-lo em 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