# Usando o MaraDNS como um servidor de DNS escravo

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 `fetchzone`.

`fetchzone` é 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.

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

    fetchzone example.com 10.5.6.7 > db.example.com

## Automatizando isto com um shell script

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

    #!/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

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 `fetchzone` no shell script, tendo certeza que a zona normalmente foi obtido antes de escrever sobre o arquivo de zona:

    #!/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

Note que este shell script precisa de um diretório que só o root possa escrever, chamado `/root/tmp` (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).

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.

Aqui é como o shell script se parece:

    #!/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

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

    example.com 10.5.6.7
    example.org 192.168.5.67
    example.net 172.19.2.83

Nota que a presença de um determinado arquivo db.name 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 `mararc`. Também note que `maradns` deve ser reiniciado para recarregar o arquivos de zona atualizado.

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.

## Bailiwick

Por razões de segurança, o cliente `fetchzone` 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:

    example.com.      10.1.2.3
    www.example.com.  10.99.88.76
    www.google.com.   10.99.88.76

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

    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