19.11. DNS

Contribuído por Chern Lee.

19.11.1. Visão Geral

O FreeBSD usa, por padrão, uma versão do BIND (Berkeley Internet Name Domain), que é a implementação mais comum do protocolo DNS. O DNS é o protocolo pelo qual nomes são mapeados para endereços IP e vice-versa. Por exemplo, uma pergunta por www.FreeBSD.org receberá uma resposta com o endereço IP do servidor web do Projeto FreeBSD, ao passo que, uma pergunta por ftp.FreeBSD.org retornará o endereço IP da máquina FTP correspondente. Da mesma forma, o oposto pode ocorrer. Uma pergunta pelo endereço IP pode resolver seu nome de sistema. Não é necessário rodar um servidor de nomes para efetuar pesquisas DNS em um sistema.

O DNS é coordenado através da Internet através de um sistema um tanto complexo de servidores de nome raiz autoritativos, e outros servidores de nome de menor escala que abrigam e fazem cache de informações de domínios individuais.

Este documento refere-se ao BIND 8.x, como ele é a versão estável usada no FreeBSD. O BIND 9.x no FreeBSD pode ser instalado através do port net/bind9.

As RFC1034 e RFC1035 ditam o protocolo DNS.

Atualmente, o BIND é mantido pelo Internet Software Consortium (www.isc.org).

19.11.2. Terminologia

Para compreender este documento, alguns termos relativos ao DNS precisam ser entendidos.

Termo Definição
DNS Direto Mapeamento de nomes para endereços IP
Origem Refere-se ao domínio abrangido em um determinado arquivo de zona
named, BIND, servidor de nome Nomes comuns para o pacote do servidor de nomes BIND, incluso no FreeBSD
Resolver Um processo do sistema através do qual uma máquina pesquisa num servidor de nomes por informações sobre zonas
DNS reverso O oposto do DNS direto; mapeamento de endereços IP para nomes
Zona Raiz (Root Zone) O início da hierarquia de zona da Internet. Todas as zonas recaem sob a zona raiz, similar a como todos os arquivos em um sistema de arquivos localizam-se abaixo do diretório raiz.
Zona Um domínio individual, subdomínio, ou parte de um DNS administrado por uma mesma autoridade

Exemplos de zonas:

Como se pode ver, a parte mais específica de um nome de sistema aparece à sua esquerda. Por exemplo, exemplo.org é mais específico que org., como org. é mais específico que a zona raiz. O esboço de cada parte de um nome de sistema é muito parecido com um sistema de arquivos: o diretório /dev fica sob o raiz, e assim por diante.

19.11.3. Razões para Rodar um Servidor de Nome

Servidores de nome normalmente aparecem em duas formas: como servidor de nome autoritativo e, como um servidor de nome para fazer cache.

Um servidor de nome autoritativo é necessário quando:

Um servidor de nome para fazer cache é necessário quando:

Quando alguém pesquisa por www.FreeBSD.org, o resolver normalmente pesquisa o servidor de nomes do provedor de nível superior e recupera a resposta. Com um servidor DNS local fazendo cache, a pesquisa precisa ser feita uma vez para o mundo exterior. Cada pesquisa adicional não vai precisar buscar fora da rede local, uma vez que há uma cópia local da informação no cache.

19.11.4. Como Funciona

No FreeBSD, o daemon BIND é chamado named por razões óbvias.

Arquivo Descrição
named o daemon do BIND
ndc programa de controle do daemon de nome (name daemon control)
/etc/namedb diretório onde reside a informação de zona do BIND
/etc/namedb/named.conf arquivo de configuração do daemon

Arquivos de zona normalmente pertencem ao diretório /etc/namedb, e contém a informação de zona DNS fornecida pelo servidor de nomes.

19.11.5. Iniciando o BIND

Uma vez que o BIND é instalado por padrão, configurá-lo é relativamente simples.

Para assegurar que o daemon named é executado durante a inicialização, coloque as seguintes modificações no /etc/rc.conf:

named_enable="YES"

Para iniciar o daemon manualmente (após configurá-lo)

# ndc start

19.11.6. Arquivos de Configuração

19.11.6.1. Usando make-localhost

Certifique-se de fazer:

# cd /etc/namedb
# sh make-localhost

para criar adequadamente o arquivo de zona DNS reverso local no /etc/namedb/localhost.rev.

19.11.6.2. /etc/namedb/named.conf

// $FreeBSD$
//
// Consulte a página de manual do named(8) para detalhes.  Se você
// alguma vez for configurar um servidor primário, certifique-se de
// que compreendeu os detalhes cabeludos de como o DNS está
// funcionando.  Mesmo com simples enganos, você pode quebrar a
// conectividade de grupos atingidos, ou causar enormes quantidades de
// tráfego inútil na Internet.

options {
    directory "/etc/namedb";

// Adicionalmente à cláusula "forwarders", você pode forçar seu
// servidor de nomes a nunca iniciar pesquisas por conta própria, mas
// sempre consultar somente seus despachantes, ativando a linha
// abaixo:
//
//      forward only;

// Se você tem um servidor DNS por perto em seu provedor de acesso,
// entre seu endereço IP aqui, e ative a linha abaixo.  Isto fará com
// que você se beneficie de seu cache, reduzindo o tráfego DNS na
// Internet em geral.

/*
    forwarders {
        127.0.0.1;
    };
*/

Como diz o comentário, para se beneficiar de um cache de acesso, despachantes (forwarders) podem ser ativados aqui. Em circunstâncias normais, um servidor de nome irá pesquisar a Internet de forma recursiva em determinados servidores de nomes até que encontre a resposta que procura. Com este recurso ativado, ele terá que consultar o servidor de nome do provedor de acesso (ou o servidor de nome configurado) primeiro, tirando vantagem de seu cache. Se o servidor de nome em questão estiver com acessos de alta velocidade, um servidor de nomes rápido, ativar este recurso pode valer a pena.

Atenção127.0.0.1 não vai funcionar aqui. Mude este endereço IP para um servidor de nome localizado em seu provedor de acesso.

   /*
     * Se existe um firewall entre você e os servidores de nome
     * com os quais deseja falar, você pode precisar remover os
     * comentários da diretiva query-source abaixo.  Versões
     * anteriores do BIND sempre fizeram pesquisas usando a porta
     * 53, mas o BIND 8.1 usa uma porta não priviliegada por
     * padrão.
     */
    // query-source address * port 53;

    /*
     * se estiver executando em um ambiente restrito (sandbox),
     * você pode ter que especificar uma localização diferente
     * para o arquivo de despejo de memória (dumpfile).
     */
    // dump-file "s/named_dump.db";
};

// Nota: os comandos a seguir serão suportados em uma versão futura.
/*
host { any; } {
    topology {
        127.0.0.0/8;
    };
};
*/

// Configurar secundários é muito mais fácil e um esboço da
// configuração é explicado a seguir.
//
// Se você ativar um servidor de nome local, não esqueça de colocar o
// 127.0.0.1 no seu /etc/resolv.conf para que este servidor seja
// consultado primeiro.
// Também certifique-se de ativá-lo no /etc/rc.conf.

zone "." {
    type hint;
    file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
    type master;
    file "localhost.rev";
};

zone
"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT" {
    type master;
    file "localhost.rev";
};

// Nota: Não use os endereços IP abaixo, eles são apenas exemplos e
// servem somente para propósitos de demonstração e documentação!
//
// Exemplo de entradas de configuração de servidor secundário.  Pode ser
// interessante se tornar o secundário pelo menos da zona de seu
// próprio domínio.  Solicite a seu administrador de rede o
// endereço IP do servidor primário responsável.
//
// Nunca esqueça de incluir a zona de busca reversa (IN-ADDR.ARPA)!
// (Estes são os primeiros bytes do respectivo endereço IP, em ordem
// invertida, com ".IN-ADDR.ARPA" anexado.)
//
// Entretanto, antes de iniciar a configurar a zona primária, é bom ter
// compreendido completamente como o DNS e o BIND trabalham.  Algumas
// vezes, existem ciladas ocultas.  Em comparação, é mais fácil
// configurar um secundário.
//
// NB: Não ative cegamente os exemplos abaixo. :-)  Ao invés, use
// nomes e endereços reais.
//
// NOTA!!! O FreeBSD roda bind em uma sandbox (veja named_flags no
// rc.conf).  O diretório contendo as zonas secundárias devem possuir
// acesso de gravação permitido para o bind.  É sugerida a seguinte
// seqüência:
//
//      mkdir /etc/namedb/s
//      chown bind:bind /etc/namedb/s
//      chmod 750 /etc/namedb/s

Para mais informações sobre como rodar o BIND numa sandbox, veja Rodando o named em uma sandbox.

/*
zone "exemplo.com" {
    type slave;
    file "s/exemplo.com.bak";
    masters {
        192.168.1.1;
    };
};

zone "0.168.192.in-addr.arpa" {
    type slave;
    file "s/0.168.192.in-addr.arpa.bak";
    masters {
        192.168.1.1;
    };
};
*/

No named.conf existem exemplos de entradas secundárias para as zonas direta e reversa.

Para cada nova zona servida, uma nova entrada de zona precisa ser adicionada ao named.conf

Por exemplo, a entrada mais simples para a zona exemplo.org pode ficar assim:

zone "exemplo.org" {
    type master;
    file "exemplo.org";
};

A zona é primária, como indicado pela declaração type, mantendo a informação da zona no /etc/namedb/exemplo.org indicado pela declaração file.

zone "exemplo.org" {
    type slave;
    file "exemplo.org";
};

No caso do secundário, a informação da zona é transferida do servidor de nomes primário de uma zona em particular, e salvo no arquivo especificado. Se e quando o servidor primário morrer, ou estiver fora de alcance, o servidor de nomes secundário terá a informação da zona transferida e será capaz de servi-la.

19.11.6.3. Arquivos de Zona

Um exemplo de arquivo de zona primário para exemplo.org (existente no /etc/namedb/example.org) segue abaixo:

$TTL 3600

exemplo.org.  IN SOA ns1.exemplo.org.  admin.exemplo.org. (
            5    ; Serial
            10800    ; Refresh
            3600     ; Retry
            604800   ; Expire
            86400 )  ; Minimum TTL

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

; Nomes de Máquinas
localhost    IN A       127.0.0.1
ns1      IN A       3.2.1.2
ns2      IN A       3.2.1.3
mail         IN A       3.2.1.10
@        IN A       3.2.1.30

; Apelidos (aliases)
www      IN CNAME   @

; Registro MX (MX Record)
@        IN MX  10  mail.exemplo.org.

Note que cada nome de sistema que termina com um ``.'' é um nome exato, ao passo que tudo sem um ``.'' no final é referenciado à origem. Por exemplo, www é traduzido para www + origem. Em nosso arquivo de zona fictício, nossa origem é exemplo.org., então www será traduzido para www.exemplo.org..

O formato de um arquivo de zona é como segue:

nomedoregistro      IN tipodoregistro  valor

Os registros DNS mais freqüentemente usados:

SOA

início da zona de autoridade

NS

um servidor de nome autoritativo

A

Um endereço de sistema (host address)

CNAME

o nome canônico para um apelido (alias)

MX

servidor de correio (mail exchanger)

PTR

um ponteiro de nome de domínio (usado em DNS reverso)

exemplo.org.  IN SOA ns1.exemplo.org.  admin.exemplo.org. (
            5    ; Serial
            10800    ; Atualizar após 3 horas
            3600     ; Tentar novamente após 1 hora
            604800   ; Expirar após 1 semana
            86400 )  ; TTL mínimo de 1 dia
exemplo.org.

o nome de domínio, que também é a origem para este arquivo de zona

ns1.exemplo.org.

o servidor de nome primário/autoritativo para esta zona

admin.exemplo.org.

o endereço de correio eletrônico da pessoa responsável por esta zona, com a @ trocada. ( é substituído por admin.exemplo.org)

5

o número de série do arquivo. Deve ser incrementado toda vez que o arquivo de zona é alterado. Hoje em dia, muitos administradores preferem o formato aaaammddii para o número de série. 2001041002 quer dizer que a última modificação foi feita em 10/04/2001, e os dígitos 02 ao final, significam que foi a segunda vez que o arquivo de zona foi alterado nesse dia.

@       IN NS     ns1.exemplo.org.

Esta é uma entrada NS. Cada servidor de nome que responderá autoritativamente pela zona deve ter uma destas entradas. A @ como aqui mostrada poderia ter sido exemplo.org. A @ é traduzida pela origem.

localhost    IN A    127.0.0.1
ns1      IN A    3.2.1.2
ns2      IN A    3.2.1.3
mail         IN A    3.2.1.10
@        IN A    3.2.1.30

O registro A indica nomes de máquinas. Como mostrado acima, ns1.exemplo.org resolveria para 3.2.1.2. De novo, o símbolo da origem, @, é usado aqui, significando que o exemplo.org resolveria para 3.2.1.30.

www         IN CNAME   @

O registro de nome canônico é geralmente usado para dar apelidos (aliases) para uma máquina. No exemplo, www é apelidado como a máquina endereçada para a origem, ou exemplo.org (3.2.1.30). CNAMEs podem ser usados para fornecer apelidos a nomes de sistemas, ou efetuar rotatividade (round-robin) de um nome de sistema entre várias máquinas.

@         IN MX   10      mail.exemplo.org.

O registro MX indica quais servidores de correio são responsáveis por tratar correspondência de entrada para a zona. mail.exemplo.org é o nome do servidor de correio, e 10 a prioridade daquele servidor de correio.

Alguém pode ter vários servidores de correio, com prioridades de 3, 2 e 1. Um servidor de correio tentando fazer uma entrega para exemplo.org tentaria primeiro o MX de maior prioridade, depois o de segunda maior e assim por diante, até que o correio seja entregue corretamente.

Para arquivos de zona in-addr.arpa (DNS reverso), o mesmo formato é usado, exceto pelo fato de conter entradas PTR ao invés de A ou CNAME.

$TTL 3600

1.2.3.in-addr.arpa.  IN SOA ns1.exemplo.org.  admin.exemplo.org. (
            5     ; Serial
            10800     ; Refresh
            3600      ; Retry
            604800    ; Expire
            3600 )    ; Minimum

@       IN NS   ns1.exemplo.org.
@       IN NS   ns2.exemplo.org.

2       IN PTR  ns1.exemplo.org.
3       IN PTR  ns2.exemplo.org.
10      IN PTR  mail.exemplo.org.
30      IN PTR  exemplo.org.

Este arquivo fornece o endereço IP adequado aos mapeamentos de nomes de sistemas de nosso domínio fictício acima.

19.11.7. Servidor Cache de Nomes

Um servidor de nome para cache é um tipo de servidor de nome que não é autoritativo autoritativo para nenhuma zona. Ele simplesmente efetua buscas por conta própria e se recorda delas para uso futuro. Para configurar um, apenas configure o servidor de nome normalmente, omitindo quaisquer inclusões de zonas.

19.11.8. Rodando o named Restrito a Um Diretório (Sandbox)

Para segurança adicional, você pode querer rodar o named(8) com um usuário não privilegiado e configurá-lo para fazer chroot(8) dentro de um diretório restrito (sandbox). Isto torna tudo fora da sandbox inacessível para o daemon named. Caso o named seja atacado, isto ajudará a reduzir os danos que podem ser causados. Por padrão, o FreeBSD tem um usuário e um grupo chamados bind, planejado para este uso.

Nota: Diversas pessoas recomendariam que ao invés de configurar o named para fazer chroot, você deveria rodá-lo dentro de um jail(8). Esta seção não tenta abordar esta situação.

Uma vez que o named não será capaz de acessar nada fora da sandbox, (como bibliotecas compartilhadas, sockets de logs e assim por diante), há uma série de passos que devem ser seguidos para permitir o correto funcionamento do named. Na seguinte lista de verificação, é assumido que o caminho para a sandbox é /etc/namedb e que você não fez modificações prévias ao conteúdo deste diretório. Execute os seguintes passos como usuário root.

O próximo passo é editar o /etc/namedb/etc/named.conf de forma que o named saiba quais zonas carregar e onde encontrá-las no disco. A seguir, um exemplo comentado (qualquer coisa não especificamente comentada aqui não é diferente da configuração de um servidor DNS que não está rodando dentro de uma sandbox):

options {
    directory "/";(1)
    named-xfer "/bin/named-xfer";(2)
    version "";     // Não revele a versão do BIND
    query-source address * port 53;
};
// socket de controle ndc
controls {
    unix "/var/run/ndc" perm 0600 owner 0 group 0;
};
// Zones a seguir:
zone "localhost" IN {
    type master;
    file "master/named.localhost";(3)
    allow-transfer { localhost; };
    notify no;
};
zone "0.0.127.in-addr.arpa" IN {
    type master;
    file "master/localhost.rev";
    allow-transfer { localhost; };
    notify no;
};
zone "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.int" {
    type master;
    file "master/localhost-v6.rev";
    allow-transfer { localhost; };
    notify no;
};
zone "." IN {
    type hint;
    file "master/named.root";
};
zone "private.example.net" in {
    type master;
    file "master/private.example.net.db";
    allow-transfer { 192.168.10.0/24; };
};
zone "10.168.192.in-addr.arpa" in {
    type slave;
    masters { 192.168.10.2; };
    file "slave/192.168.10.db";(4)
};
(1)
A declaração directory é especificada como /, uma vez que todos os arquivos que o named precisa estão dentro deste diretório (lembre-se de que isto equivale ao /etc/namedb de um usuário ``normal'').
(2)
Especifica o caminho completo para o arquivo binário named-xfer (do sistema de referência do named). Isto é necessário, uma vez que o named é compilado para, por padrão, buscar o named-xfer no /usr/libexec.
(3)
Especifica o nome do arquivo (relativo à declaração directory acima) onde o named pode encontrar o arquivo de zona para esta zona.
(4)
Especifica o nome do arquivo (relativo à declaração directory acima, onde o named deve gravar uma cópia do arquivo de zona para esta zona após transferir a mesma com sucesso do servidor mestre. Por isto que precisamos mudar a posse do diretório slave para bind nos passos de configuração acima.

Após completar os passos acima, reinicie seu servidor ou o syslogd(8) e inicie o named(8), certificando-se de usar as novas opções especificadas em syslogd_flags e named_flags. Você agora deve estar rodando uma cópia restrita do named!

19.11.9. Segurança

Apesar do BIND ser a implementação mais comum do DNS, sempre há a questão da segurança. Furos possíveis e exploráveis de segurança são encontrados de vez em quando.

É uma boa idéia assinar CERT e freebsd-security-notifications para se manter atualizado sobre as atuais questões de segurança na Internet e do FreeBSD.

Dica: Se um problema surgir, manter os fontes atualizados e ter uma compilação recente do named não é má idéia.

19.11.10. Leitura adicional

Páginas de manual do BIND/named: ndc(8) named(8) named.conf(5)

Este, e outros documentos, podem ser obtidos em ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Para perguntas sobre FreeBSD, leia a documentação antes de contatar <questions@FreeBSD.org>.
Para perguntas sobre esta documentação, envie e-mail para <doc@FreeBSD.org>.