Sincroniza automaticamente todas as zonas entre o BIND 9

8

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?

    
por pupeno 29.08.2009 / 20:48

9 respostas

0

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.

    
por 12.09.2009 / 11:16
12

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]

    
por 26.10.2010 / 14:42
4

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.

    
por 30.08.2009 / 01:02
4

Talvez você esteja procurando um sistema de gerenciamento de configuração como Puppet ou CFEngine? Existe uma infra-estrutura extra envolvida, mas eles podem lidar com a distribuição de muitos recursos de configuração, e poderiam facilmente incluir isso também.

    
por 30.08.2009 / 04:48
2

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.

    
por 30.08.2009 / 03:41
1

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

    
por 30.08.2009 / 03:34
0

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.

    
por 30.08.2009 / 06:44
0
  1. Crie um script para extrair todos os nomes de arquivo de zona do mestre (o ls -1 fará a maior parte disso).
  2. Crie um script no escravo que tomará a lista de arquivos de zona como entrada e crie um named.conf.local a partir dessa lista (a formatação é bem simples) e substitua o named.conf.local existente (você pode usar outro nome e incluí-lo a partir do named.conf.local se você quiser jogar pelo seguro)
  3. crie um acesso sudo sem senha de comando único para "recarregar o rndc" no escravo.
  4. Crie uma chave ssh de uso único que permita enviar a lista de zonas do mestre e canalizá-la para o script escravo e, em seguida, execute "sudo rndc reload". Agora você pode empurrar as zonas do mestre para o escravo.
  5. (opcional) crie uma tarefa cron para enviar as zonas diariamente ou o que quiser.

Boa experiência, trabalhando nisso. Eu posso postar meus scripts, se alguém quiser.

    
por 02.12.2009 / 07:07
0

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
    
por 26.07.2018 / 14:30

Tags