<HEAD><TITLE>Sendo um servidor de DNS escravo</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso8859-1">

</HEAD><BODY>

<!-- Copyright 2005 Sam Trenholme

    TERMS

    Redistribution and use, with or without modification, are permitted
    provided that the following condition is met:

    1. Redistributions must retain the above copyright notice, this
       list of conditions and the following disclaimer.

    This documentation is provided 'as is' with no guarantees of
    correctness or fitness for purpose.

 -->

<H1>Usando o MaraDNS como um servidor de DNS escravo</H1>

MaraDNS não tem suporte direto para ser um servidor de DNS escravo.
Porém, MaraDNS pode transferir arquivos de zona de outros servidores
usando o programa <tt>fetchzone</tt>.    

<p>

<tt>fetchzone</tt> é um programa que pode transferir uma zona de outro
servidor DNS;  a zona transferida está no formato csv2 que poderá ser 
então carregado pelo MaraDNS.

<p>
Aqui é um exemplo de uso do <tt>fetchzone</tt> para transferir
a zona example.com do servidor com IP 10.5.6.7, colocando a saída 
no arquivo "db.example.com":  

<pre>
fetchzone example.com 10.5.6.7 > db.example.com
</pre>

<h2>Automatizando isto com um shell script</h2>

Se a pessoa deseja usar um fetchzone para obter várias zonas, 
isto pode ser automatizado com um shell script:  

<pre>
#!/bin/bash

cd /etc/maradns
fetchzone example.com 10.5.6.7 > db.example.com
fetchzone example.org 192.168.5.67 > db.example.org
fetchzone example.net 172.19.2.83 > db.example.net
</pre>

Porém, este shell script tem um problema.  Há um problema em 
obter um arquivo de zona de um sistema remoto, o arquivo de zona
em questão será  destruído.  Isto pode ser evitado conferindo o estado
de saída do <tt>fetchzone</tt> no shell script, tendo certeza que
a zona normalmente foi obtido antes de escrever sobre 
o arquivo de zona:  

<pre>
#!/bin/bash

# For security reasons, put this file in a directory that only root
# may write to.  
TEMP=/root/tmp/foo

cd /etc/maradns
fetchzone example.com 10.5.6.7 > $TEMP
if [ $? -eq 0 ] ; then
	mv $TEMP db.example.com
fi
fetchzone example.org 192.168.5.67 > $TEMP
if [ $? -eq 0 ] ; then
	mv $TEMP db.example.org
fi
fetchzone example.net 172.19.2.83 > $TEMP
if [ $? -eq 0 ] ; then
	mv $TEMP db.example.net
fi
</pre>

Note que este shell script precisa de um diretório que só o root possa escrever,
chamado <tt>/root/tmp</tt> (Linux tem uma longa tradição fazendo o diretório
home do root /root; ponha este arquivo em outro lugar em um sistema  
com um diretório de root diferente).  

<p>
Enquanto este script é funcional para um número pequeno de zonas, este script
vai rapidamente ficar de difícil controle para um número grande de zonas.  Se a
pessoa quer obter um grande número de zonas, faz mais sentido ter a lista
de zonas em um arquivo separado.  Nós temos o shell script então para ler este 
arquivo (lista de zonas e IPs), e fazer os arquivos de zona vivos se as zonas  
foram buscadas com sucesso.

<p>

Aqui é como o shell script se parece:

<pre>
#!/bin/bash

ZONELIST=/etc/maradns.zonelist
# For security reasons, put this file in a directory that only root
# may write to.  
TEMP=/root/tmp/foo

cd /etc/maradns

cat $ZONELIST | awk '{print "fetchzone "$1" "$2" > '$TEMP'"
                      print "if [ $? -eq 0 ] ; then"
		      print "    mv '$TEMP' db."$1
		      print "fi";}' | sh
</pre>

A lista de zonas, que estão no arquivo <tt>/etc/maradns.zonelist</tt> do 
exemplo anterior, se parecerá com:

<pre>
example.com 10.5.6.7 
example.org 192.168.5.67 
example.net 172.19.2.83 
</pre>

Nota que a presença de um determinado arquivo db.<i>name</i> no diretório
/etc/maradns não é suficiente para MaraDNS carregar um determinado arquivo de zona; o  
arquivo de zona em questão deve ser apontado para dentro o do arquivo <tt>mararc</tt>.  
Também note que <tt>maradns</tt> deve ser reiniciado para recarregar o arquivos 
de zona atualizado.  

<p>

Um script mais complicado, como conferir o número de série antes de 
carregar uma determinada zona, é deixado como um exercício para o leitor.

<h2>Bailiwick</h2>

Por razões de segurança, o cliente <tt>fetchzone</tt> somente permitirá registros
que terminam no nome da zona para uma dada zona. Em outras palavras, vamos supor
que nós temo a zona example.com que se parece assim:

<pre>
example.com.      10.1.2.3
www.example.com.  10.99.88.76
www.google.com.   10.99.88.76
</pre>

quando estiver obtendo essa zona, <tt>fetchzone</tt>, irá desabilitar 
o registro "www.google.com" porque ele não termina com "example.com". 
A desabilitação será parecida como essa:

<pre>
example.com. 10.1.2.3
www.example.com. 10.99.88.76
# Disabled out-of-bailiwick record follows
#www.google.com. 10.99.88.76
</pre>

</BODY></HTML>
