Sincronizar automaticamente todas as zonas entre o BIND 9


9

Existe uma maneira de sincronizar automaticamente todas as zonas entre os servidores BIND (9) para que eu não precise adicionar zonas ao escravo ao adicioná-las ao mestre?


11
além de adicioná-los manualmente ao named.conf, não vejo outra maneira; se é isso que você perguntou
quaie

Respostas:


12

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


Ao promover o software ao qual você está associado, inclua alguma referência a esse fato (mesmo que o software seja gratuito). Obrigado e bem-vindo à falha do servidor.
Chris S

Sim, eu trabalho para o ISC, os caras que mantêm o BIND e o ISC DHCP. :)
Knobee

4

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.


11
+1 - Eu mesmo uso uma técnica semelhante (mas provavelmente menos eficiente) e parece funcionar de maneira confiável. Para obter uma propagação rápida para os escravos de novas mudanças, eles precisam pesquisar o documento mestre com frequência (descobri a cada dez minutos que é mais do que frequente o suficiente).
David Spillett

Antes de eu ter as religiões duplas de Automação e Minúsculas, eu tinha um script que analisava a lista de configurações de zona do mestre para obter a lista de zonas que expus via inetd e, em seguida, um script nos escravos que pesquisavam qualquer número de IP mestre endereços (e usaram esse endereço como o endereço IP principal em suas configurações escravas). Trabalhou um sonho.
Womble

4

Talvez você esteja procurando um sistema de gerenciamento de configurações como o Puppet ou o CFEngine? Há infraestrutura extra envolvida, mas eles podem lidar com a distribuição de muitas coisas de configuração e também podem incluir isso facilmente.


2

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.


Agora, aparentemente, o BIND pode ver a resposta de @ Knobee.
Volker Stolz

@mad_vs - Obrigado, eu não teria visto essa resposta de outra forma.
John Gardeniers

1

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


0

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.


0

Para a quantidade de zonas que tenho, a sincronização manual acabou sendo mais fácil do que qualquer outra solução para funcionar. Se eu tivesse muitas outras zonas, procuraria as soluções propostas.


0
  1. Crie um script para extrair todos os nomes de arquivos da zona do mestre (ls -1 fará a maior parte disso).
  2. Crie um script no escravo que pegue a lista de arquivos de zona como entrada e crie um named.conf.local a partir dessa lista (a formatação é bastante simples) e substitua o named.conf.local existente (você pode usar outro e inclua-o em named.conf.local se você quiser jogar com segurança)
  3. crie um acesso sudo sem senha de comando único para "rndc reload" no escravo.
  4. Crie uma chave ssh de uso único que permita enviar a lista de zonas do mestre e encaminhe-a para o script slave e execute "sudo rndc reload". Agora você pode enviar as zonas do mestre para o escravo.
  5. (opcional) crie uma tarefa cron para enviar as zonas diariamente, ou o que for.

Boa experiência, trabalhando isso. Posso postar meus scripts, se alguém quiser.


@ naught101, você pode postar os scripts, por favor?

0

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.