FreeBSD

DNS

ISC BIND9


Introdução ao DNS

O DNS - Domain Name System - é um banco de dados hierárquico e distribuído. Ele guarda os dados que possibilitam descobrir endereços IP de máquinas a partir do hostname das mesmas, e vice-versa, e também informações sobre roteamento de e-mail e outras. Os clientes consultam os servidores DNS através de uma biblioteca 'resolver'. O DNS é definido originalmente pelas RFCs 1034, 1035 e outras.


Domínios

Os dados armazenados no DNS são identificados por nomes de domínios, que são organizados em formato de árvore invertida. Cada ramificação representa um domínio, e o endereço completo de um ponto específico é determinado através da ligação de todas as ramificações daquele ponto até a raiz, veja o exemplo abaixo.


Cada nó da árvore é um domínio, mesmo que o nó seja terminal, ou seja, que não possua subdomínios. Podemos concluir também que cada subdomínio é um domínio, e cada domínio é um subdomínio, exceto o Root Domain, ou seja, a raiz da árvore.


Zonas

Uma zona (zone) é um espaço de nomes - um pedaço contínuo da árvore DNS - que foi delegado a um determinado servidor de nomes. Este servidor irá possuir todas as informações referentes à esta zona, e irá possuir autoridade para responder qualquer requisição referente a ela. Pertencem a esta zona todas as ramificações da árvore a partir do ponto onde foi delegada a autoridade, exceto as ramificações que pertencem a outras zonas. Uma zona pode englobar um domínio inteiro ou apenas parte de um domínio.
Cada zona possui ao menos um servidor de nomes autoritário - Authoritative Name Server.


Servidor Mestre Primário (Primary Master)

Também chamado de servidor primário, é o servidor autoritário onde é mantida a cópia mestre dos dados sobre a zona. Os dados são carregados a partir de arquivos chamados "arquivos de zonas".


Servidor Escravo (Slave Server)

Conhecido como servidor secundário, é também um servidor autoritário sobre a zona. Busca os dados sobre a zona a partir do servidor primário usando um processo de replicação chamado "zone transfer".


Resource Records (RRs)

Os Resource Records são registros que apontam diferentes serviços em um arquivo de zona. São padronizados pela RFC1034 e outras subseqüentes. Os principais tipos são:

SOA -> Início de uma zona autoritária
NS -> Servidor de nomes autoritário
A -> Endereço de host
CNAME -> Apelido
MX -> Mail eXchanger
PTR -> Ponteiro (utilizado para DNS reverso)

O formato destas entradas no arquivo de zona é:
nome_registro IN tipo valor


Instalação e Configuração do BIND

O BIND - Berkeley Internet Name Domain - é um software mantido pelo Internet Software Consortium que implementa uma biblioteca 'resolver' e um servidor de nomes, o named. É utilizado pela maior parte dos servidores DNS na Internet, incluindo os Root Name Servers. Possui atualmente as distribuições 8, que ainda está sendo utilizada, e 9, que implementa mais funcionalidades e é a que iremos utilizar. Uma das principais mudanças em relação à versão 8 é que a 9 implementa o suporte a Views, que permite que um servidor seja visualizado de formas diferentes dependendo do cliente, por exemplo, é possível definir uma vista interna para alguns clientes, e uma vista externa para os outros. O site do BIND é www.isc.org/products/BIND.

Primeiramente desative o BIND que vem na instalação padrão do FreeBSD. Execute os seguintes comandos:

# mv /usr/sbin/named /usr/sbin/named.OFF
# mv /etc/namedb /etc/namedb.OFF
# rm /usr/share/man/man8/named*

A versão atual do BIND9 é a 9.2.3, efetue o seu download a partir de algum mirror disponível no site ou de ftp://ftp.isc.org/isc/bind9/9.2.3/bind-9.2.3.tar.gz. Descompacte o arquivo no /tmp e acesse o diretório que será criado. Execute os comandos abaixo:

# ./configure --sysconfdir=/usr/namedb --disable-threads
# make
# make install

Crie agora o usuário e o grupo named, da seguinte forma:

# pw group add named -g 170
# pw user add named -c "Bind" -d "/nonexistent" -s "/sbin/nologin" -u 170 -g 170

Crie os diretórios /etc/namedb, com dono named e permissão 700. Todos os arquivos dentro deste diretório deverão ter o dono named e permissão 600. Crie também o diretório /var/log/named, onde o named irá guardar seus arquivos de log. O dono deverá ser named também, e a permissão 700.


Configuração Simples

Para efetuar este esquema de configurações simples, tomaremos como base os seguintes dados hipotéticos:

Domínio: exemplo.org
Servidor DNS: ns1.exemplo.org - IP 192.168.0.5
Servidor de E-Mail: mail.exemplo.org - IP 192.168.0.8
Servidor de Web e FTP: {www, ftp}.exemplo.org - IP 192.168.0.10


Vá até o diretório /etc/namedb e efetue o download do arquivo named.root, que indica os Root Name Servers:

# fetch ftp.internic.net/domain/named.root

Crie o arquivo named.conf. Este será o arquivo de configuração principal do named, que ele irá ler na inicialização.

-------------------- Arquivo named.conf --------------------
# named.conf

options {

      # Diretorio onde ficam os arquivos de configuracao.
      directory "/etc/namedb";

      # Arquivo que armazena o PID.
      pid-file "/var/log/named/named.pid";

      # Para nao anunciar a versao, caso solicitado.
      version "";

};

# Direcionar o log para o arquivo /var/log/named/named.log
logging {
      channel "named_log" {
            file "/var/log/named/named.log" versions 3 size 5m;
            print-time yes;
            print-category yes;
            print-severity yes;
      };

      category "default" {
            "named_log";
      };
};

# Desabilita os canais de controle via rndc.
controls {};


# Root Domain.
# Especifica o arquivo que ira indicar os Root Name Servers,
# que sao os responsaveis pela raiz do DNS.
zone "." {
      type hint;
      file "named.root";
};


# Reverso da zona localhost
zone "0.0.127.in-addr.arpa." {

      # Este eh o servidor primary master desta zona.
      type master;

      # Arquivo de zona.
      file "localhost.REV";

      # Nao notificar sobre alteracoes desta zona.
      notify no;
};


# Zona exemplo.org
zone "exemplo.org" {
      type master;
      file "exemplo.org.DB";
};


# Reverso da zona exemplo.org
zone "0.168.192.in-addr.arpa." {
      type master;
      file "exemplo.org.REV";
};

-------------------- Fim do arquivo named.conf --------------------


Agora devem ser criados todos os arquivos de zonas. Veja os exemplos abaixo:

---------- Arquivo exemplo.org.DB --------------------
; exemplo.org.DB

$TTL 3600

; Zona
exemplo.org.  IN SOA  ns1.exemplo.org. admin.exemplo.org. (
        1       ; serial
        10800   ; refresh
        3600    ; retry
        604800  ; expire
        86400 ) ; minimum


; Servidores DNS
@               IN NS   ns1.exemplo.org.


; Nomes de hosts
localhost       IN A    127.0.0.1
ns1             IN A    192.168.0.5
mail            IN A    192.168.0.8
www             IN A    192.168.0.10
@               IN A    192.168.0.10


; Apelidos
ftp             IN CNAME        www

; Servidores de e-mail
@               IN MX   10      mail.exemplo.org.
-------------------- Fim do arquivo exemplo.org.DB --------------------

No arquivo acima, temos as seguintes configurações:

$TTL: é o tempo de vida das configurações deste arquivo, se algum outro servidor fizer cache destas informações ele guardará apenas pelo tempo determinado.

Zona: é a entrada "IN SOA" (Start Of Authority). Especifica a zona sobre a qual temos autoridade, e qual servidor primário responde por ela. Também é especificado o endereço de e-mail do administrador, substituindo a arroba por ponto, por exemplo, admin@exemplo.org deve ser inserido como admin.exemplo.org. Os parâmetros entre parênteses são, na ordem:
   serial: número serial da configuração, que deve ser incrementado toda vez que é feita alguma mudança.
   refresh: tempo em segundos em que os servidores slave desta zona deverão atualizar os seus dados, a partir do master.
   retry: caso algum slave não consiga atualizar os seus dados, deverá tentar novamente neste intervalo de tempo, em segundos.
   expire: se após este tempo (em segundos), algum slave não conseguiu atualizar seus dados, deverá descartá-los.
   minimum: TTL para o cache de respostas negativas.

Servidores DNS: são as entradas "IN NS" (Name Server), e indicam os servidores de nomes que possuem informações sobre a zona em questão. Todos os servidores autoritários desta zona deverão ser incluídos. A arroba indica a origem, o seja, exemplo.org. Ao invés da arroba poderíamos colocar (neste arquivo) exemplo.org, o efeito seria o mesmo.

Nomes de Hosts: associam nomes de hosts a seus respectivos endereços IP. São entradas "IN A". Novamente, a arroba indica a origem, então exemplo.org indicará o endereço 192.168.0.10. Como em todo o arquivo de zona, caso um hostname seja especificado com ponto no final é um endereço absoluto. Se for especificado sem um ponto no final, é um endereço relativo à origem, ou seja www se torna www.exemplo.org.

Apelidos: são as entradas CNAME, ou Canonical Name. Associam outros nomes à hosts que já estão cadastrados com entradas "IN A", formando aliases. Podem também ser usadas para fazer balanceamento de carga, especificando-se o mesmo apelido para várias máquinas diferentes, então cada requisição irá para a próxima máquina. Por exemplo:

www.exemplo.org IN CNAME www1.exemplo.org
www.exemplo.org IN CNAME www2.exemplo.org
www.exemplo.org IN CNAME www3.exemplo.org

Neste exemplo, as requisições para o endereço www.exemplo.org conterão na resposta a indicação das três máquinas, variando em ordem round-robin, e o cliente normalmente optará pela primeira indicação. Desta forma, a carga é distribuída (de uma forma primitiva) entre 3 servidores.

Servidores de e-mail: são as entradas "IN MX" (Mail eXchanger). Especificam para qual servidor deve ir os e-mails para o domínio exemplo.org (@). É possível especificar mais de um, será seguida a ordem da prioridade especificada (10, no exemplo). Quanto mais baixa a prioridade antes será verificado. Se o de prioridade mais baixa não reconhecer o destinatário, o e-mail é enviado ao servidor com a segunda prioridade mais baixa, e assim por diante.


O próximo arquivo de zona é o reverso da zona exemplo.org, segue o exemplo abaixo:

-------------------- Arquivo exemplo.org.REV --------------------
; exemplo.org.REV

$TTL 3600

; Zona reversa
0.168.192.in-addr.arpa.  IN SOA  ns1.exemplo.org. admin.exemplo.org. (
      1       ; serial
      10800   ; refresh
      3600    ; retry
      604800  ; expire
      86400 ) ; minimum

; Servidores DNS
@               IN NS   ns1.exemplo.org.

; IPs de Hosts
5               IN PTR  ns1
8               IN PTR  mail
10              IN PTR  www

-------------------- Fim do arquivo exemplo.org.REV --------------------

O objetivo deste arquivo é fazer a relação entre endereços IPs e hostnames, ou seja, dado um determinado endereço IP descobre-se o hostname. O arquivo segue mais ou menos o mesmo formato do anterior, apenas algumas diferenças:

Zona reversa: é especificada no formato da faixa de IPs invertida mais a string ind-addr.arpa. Neste arquivo os IPs são todos lidos da direita para a esquerda, desta forma uma máquina com o IP 192.168.0.5 terá uma entrada 5.0.168.192.in-addr.arpa. Ao invés de especificar a zona "0.168.192.in-addr.arpa." poderíamos apenas especificar "@", já que a @ será substituída pela origem, que está no arquivo named.conf como "0.168.192.in-addr.arpa.", para este arquivo.

IPs de Hosts: são especificados por meio de entradas "IN PTR", relacionando endereços IP a hostnames.


O outro arquivo de configuração que foi especificado no named.conf é o localhost.REV, que é a zona reversa da máquina local. Segue o exemplo:

-------------------- Arquivo localhost.REV --------------------
; localhost.REV

$TTL 3600

; Zona
0.0.127.in-addr.arpa.  IN SOA  ns1.exemplo.org. admin.exemplo.org. (
        1       ; serial
        3600    ; refresh
        900     ; retry
        3600000 ; expire
        3600 )  ; minimum

; Servidores DNS
@               IN NS   ns1

; IPs de hosts
1               IN PTR  localhost

-------------------- Fim do arquivo localhost.REV --------------------

Com estes arquivos no lugar, é possível inicializar e testar o named. Execute o comando a seguir:

# /usr/local/sbin/named -u named -c /etc/namedb/named.conf

Verifique o arquivo de log, em /var/log/named/named.log e também /var/log/messages e veja se não há nenhuma mensagem de erro. Adicione o seu servidor DNS no arquivo /etc/resolv.conf, coloque a primeira entrada "nameserver" apontando para o IP do servidor. Faça alguns testes, com os comandos dig e host, exemplos:

# dig www.exemplo.org

# host exemplo.org

Para maiores detalhes veja as man pages dos comandos dig, host e nslookup.

Por fim, faça um script de inicialização para o BIND, com os seguintes comandos para inicialização e shutdown, respectivamente:

/usr/local/sbin/named -u named

e

kill `cat /var/log/named/named.pid`

 

Configuração com Views

Após ter feito a configuração acima e estar tudo funcionando corretamente, pode-se partir para esta. Nesta configuração fazemos uso da funcionalidade "Views", que permite que criemos um servidor que irá retornar respostas diferentes dependendo do cliente. Podemos assim criar um servidor DNS que trabalha com um mesmo domínio mas fornecendo endereços de duas redes, uma interna e a outra externa. Esta configuração também é chamada de Split DNS.

Para esta configuração, iremos tomar como base os seguintes dados hipotéticos:

Domínio: exemplo.org

Rede Externa:
Servidor DNS: ns1.exemplo.org - IP 192.168.0.5
Servidor de E-Mail: mail.exemplo.org - IP 192.168.0.8
Servidor de Web e FTP: {www, ftp}.exemplo.org - IP 192.168.0.10

Rede Interna:
Servidor DNS: ns1.exemplo.org - IP 10.10.0.5
Servidor de E-Mail: mail.exemplo.org - IP 10.10.0.8
Servidor de Web e FTP: {www, ftp}.exemplo.org - IP 10.10.0.10

Os arquivos named.root, localhost.REV, exemplo.org.DB e exemplo.org.REV continuam os mesmos. É preciso modificar o arquivo named.conf e criar os arquivos exemplo.org.INTERNA.DB e exemplo.org.INTERNA.REV. Os exemplos estão abaixo:

-------------------- Arquivo named.conf --------------------
# named.conf

options {
        directory "/etc/namedb";
        pid-file "/var/log/named/named.pid";
        version "";
};

logging {
        channel "named_log" {
                file "/var/log/named/named.log" versions 3 size 5m;
                print-time yes;
                print-category yes;
                print-severity yes;
        };

        category "default" {
                "named_log";
        };
};

controls {};


# Vista Interna
view interna {

        # Clientes que irao visualizar esta view.
        match-clients {
                10.10.0.0/16;
        };

        # Efetua a busca recursiva apenas para clientes internos.
        recursion yes;

        # Root Domain.
        # Igual nas duas views.
        zone "." {
                type hint;
                file "named.root";
        };

        # Reverso da zona localhost
        # Igual nas duas views.
        zone "0.0.127.in-addr.arpa." {
                type master;
                file "localhost.REV";
                notify no;
        };

        # Zona exemplo.org interna
        zone "exemplo.org" {
                type master;
                file "exemplo.org.INTERNA.DB";
        };

        # Reverso da zona exemplo.org interna
        zone "0.10.10.in-addr.arpa." {
                type master;
                file "exemplo.org.INTERNA.REV";
        };

};


# Vista Externa
view externa {

        # Serve a qualquer cliente.
        match-clients {
                any;
        };

        # Não faz buscas recursivas para clientes externos.
        recursion no;

        # Root Domain.
        zone "." {
                type hint;
                file "named.root";
        };

        # Reverso da zona localhost
        zone "0.0.127.in-addr.arpa." {
                type master;
                file "localhost.REV";
                notify no;
        };

        # Zona exemplo.org
        zone "exemplo.org" {
                type master;
                file "exemplo.org.DB";
        };

        # Reverso da zona exemplo.org
        zone "0.168.192.in-addr.arpa." {
                type master;
                file "exemplo.org.REV";
        };

};
-------------------- Fim do arquivo named.conf --------------------

No arquivo acima, a cláusula "match-clients" da View Externa poderia ter sido omitida, pois caso não seja especificada nenhuma "match-clients" dentro de uma View, o padrão é servir a qualquer cliente.


-------------------- Arquivo exemplo.org.INTERNA.DB --------------------
; exemplo.org.INTERNA.DB

$TTL 3600

; Zona
exemplo.org.  IN SOA  ns1.exemplo.org. admin.exemplo.org. (
        1       ; serial
        10800   ; refresh
        3600    ; retry
        604800  ; expire
        86400 ) ; minimum


; Servidores DNS
@               IN NS   ns1.exemplo.org.


; Nomes de hosts
localhost       IN A    127.0.0.1
ns1             IN A    10.10.0.5
mail            IN A    10.10.0.8
www             IN A    10.10.0.10
@               IN A    10.10.0.10

; Apelidos
ftp             IN CNAME        www

; Servidores de e-mail
@               IN MX   10      mail.exemplo.org.

-------------------- Fim do arquivo exemplo.org.INTERNA.DB --------------------

-------------------- Arquivo exemplo.org.INTERNA.REV --------------------
; exemplo.org.INTERNA.REV

$TTL 3600

; Zona reversa
0.10.10.in-addr.arpa.  IN SOA  ns1.exemplo.org. admin.exemplo.org. (
        1       ; serial
        10800   ; refresh
        3600    ; retry
        604800  ; expire
        86400 ) ; minimum

; Servidores DNS
@               IN NS   ns1.exemplo.org.

; IPs de Hosts
5               IN PTR  ns1
8               IN PTR  mail
10              IN PTR  www

-------------------- Fim do arquivo exemplo.org.INTERNA.REV --------------------

 

Configuração de DNS Primário e Secundário

Normalmente para cada zona são definidos no mínimo dois servidores DNS, um primário e outro secundário. Conforme descrito anteriormente, o servidor secundário busca todas as informações de zonas a partir do servidor primário, num processo conhecido como "zone transfer".
Tomaremos como base a Configuração Simples feita anteriormente, que é de um servidor primário, para adicionar suporte a um servidor secundário. Também iremos ver os arquivos de configuração do servidor secundário.

Domínio: exemplo.org
Servidor DNS Primário: ns1.exemplo.org - IP 192.168.0.5
Servidor DNS Secundário: ns2.exemplo.org - IP 192.168.0.6
Servidor de E-Mail: mail.exemplo.org - IP 192.168.0.8
Servidor de Web e FTP: {www, ftp}.exemplo.org - IP 192.168.0.10

Os arquivos de zona exemplo.org.DB e exemplo.org.REV, armazenados no servidor primário, deverão se modificados para incluir o novo servidor de nomes, conforme os exemplos abaixo:

---------- Arquivo exemplo.org.DB --------------------
; exemplo.org.DB

$TTL 3600

; Zona
exemplo.org.  IN SOA  ns1.exemplo.org. admin.exemplo.org. (
        2       ; serial
        10800   ; refresh
        3600    ; retry
        604800  ; expire
        86400 ) ; minimum


; Servidores DNS
@               IN NS   ns1.exemplo.org.
@               IN NS   ns2.exemplo.org.


; Nomes de hosts
localhost       IN A    127.0.0.1
ns1             IN A    192.168.0.5
ns2             IN A    192.168.0.6
mail            IN A    192.168.0.8
www             IN A    192.168.0.10
@               IN A    192.168.0.10

; Apelidos
ftp             IN CNAME        www

; Servidores de e-mail
@               IN MX   10      mail.exemplo.org.

-------------------- Fim do arquivo exemplo.org.DB --------------------

-------------------- Arquivo exemplo.org.REV --------------------
; exemplo.org.REV

$TTL 3600

; Zona reversa
0.168.192.in-addr.arpa.  IN SOA  ns1.exemplo.org. admin.exemplo.org. (
        2       ; serial
        10800   ; refresh
        3600    ; retry
        604800  ; expire
        86400 ) ; minimum

; Servidores DNS
@               IN NS   ns1.exemplo.org.
@               IN NS   ns1.exemplo.org.

; IPs de Hosts
5               IN PTR  ns1
6               IN PTR  ns2
8               IN PTR  mail
10              IN PTR  www
-------------------- Fim do arquivo exemplo.org.REV --------------------

Note que os arquivos de zonas acima sofreram um incremento no número serial. Cada vez que um arquivo de zona é modificado é necessário fazer tal incremento, para que os outros servidores DNS, que buscam dados de zonas neste, saibam que o arquivo foi modificado e que devem atualizar os seus dados locais. Após isso, dê um "killall -HUP named", para que os arquivos sejam re-lidos pelo BIND.

Partimos agora para a configuração do servidor secundário. Siga os mesmos passos da instalação etc. do primeiro servidor, o que irá mudar são apenas os arquivos de configuração. Crie o arquivo named.conf conforme o exemplo abaixo:

-------------------- Arquivo named.conf --------------------
# named.conf

options {
        directory "/etc/namedb";
        pid-file "/var/log/named/named.pid";
        version "";
};

logging {
        channel "named_log" {
                file "/var/log/named/named.log" versions 3 size 5m;
                print-time yes;
                print-category yes;
                print-severity yes;
        };

        category "default" {
                "named_log";
        };
};

controls {};


# Root Domain.
zone "." {
        type hint;
        file "named.root";
};


# Reverso da zona localhost
zone "0.0.127.in-addr.arpa." {
        type master;
        file "localhost.REV";
        notify no;
};


# Zona exemplo.org
zone "exemplo.org" {
        type slave;
        file "exemplo.org.DB";
        masters {
                192.168.0.5;
        };
};


# Reverso da zona exemplo.org
zone "0.168.192.in-addr.arpa." {
        type slave;
        file "exemplo.org.REV";
        masters {
                192.168.0.5;
        };
};

-------------------- Fim do arquivo named.conf --------------------

Note que no arquivo acima as zonas forward e reverse exemplo.org passaram a ser do tipo slave, especificando que este servidor é o escravo, ou secundário, para estas zonas. O parâmetro "file" servirá apenas para fazer uma cópia dos dados das zonas nos arquivos especificados, ou seja, não adianta mudar algo nestes arquivos porque o servidor master irá mandar atualizações dos mesmos e eles serão sobrescritos. O parâmetro "masters" indica qual é o servidor primário responsável por esta zona.

Também copie para este servidor o arquivo named.root. Crie ainda o arquivo localhost.REV, com a seguinte configuração:

-------------------- Arquivo localhost.REV --------------------
; localhost.REV

$TTL 3600

; Zona
0.0.127.in-addr.arpa.  IN SOA  ns2.exemplo.org. admin.exemplo.org. (
        1       ; serial
        3600    ; refresh
        900     ; retry
        3600000 ; expire
        3600 )  ; minimum

; Servidores DNS
@               IN NS   ns2

; IPs de hosts
1               IN PTR  localhost

-------------------- Fim do arquivo localhost.REV --------------------


Atualizado em 03/02/04.

Heini Thomas Geib.
http://www2.unijui.edu.br/~heini

Voltar