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).
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:
. é a zona raiz
org. é a zona sob a zona raiz
exemplo.org é a zona sob a zona org.
foo.exemplo.org. é um subdomínio, uma zona sob a zona exemplo.org.
1.2.3.in-addr.arpa é a zona referenciando todos os endereços IP que recaem sob o espaço IP 3.2.1.*
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.
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:
alguém quer servir informação DNS para o mundo, respondendo de forma autoritativa a pesquisas.
um domínio, como exemplo.org, é registrado e endereços IP precisam ser designados a nomes de sistemas sob ele.
um bloco de endereços IP requerem entradas DNS reversas (IP para nomes de sistema).
um servidor de nome de segurança, chamado de escravo, precisa responder a pesquisas quando o primário está fora do ar ou inacessível.
Um servidor de nome para fazer cache é necessário quando:
um servidor DNS local pode fazer cache e responder mais rapidamente do que pesquisar em um servidor de nome externo.
uma redução no tráfego de rede de uma forma geral é desejada (o tráfego DNS foi contabilizado como 5% ou mais do tráfego total da Internet).
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.
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.
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
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.
// $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.
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:
início da zona de autoridade
um servidor de nome autoritativo
Um endereço de sistema (host address)
o nome canônico para um apelido (alias)
servidor de correio (mail exchanger)
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
o nome de domínio, que também é a origem para este arquivo de zona
o servidor de nome primário/autoritativo para esta zona
o endereço de correio eletrônico da pessoa responsável por esta
zona, com a @ trocada. ( <admin@exemplo.org> é
substituído por admin.exemplo.org)
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.
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.
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.
Crie todos os diretórios que o named espera encontrar:
# cd /etc/namedb # mkdir -p bin dev etc var/tmp var/run master slave # chown bind:bind slave var/*![]()
Rearrume e crie uma zona básica e arquivos de configuração:
# cp /etc/localtime etc# mv named.conf etc && ln -sf etc/named.conf # mv named.root master # sh make-localhost && mv localhost.rev localhost-v6.rev master # cat > master/named.localhost $ORIGIN localhost. $TTL 6h @ IN SOA localhost. postmaster.localhost. ( 1 ; serial 3600 ; refresh 1800 ; retry 604800 ; expiration 3600 ) ; minimum IN NS localhost. IN A 127.0.0.1 ^D

Se você estiver rodando a versão de FreeBSD anterior à 4.9-RELEASE, construa uma cópia estaticamente compilada do named-xfer e a copie na sandbox:
# cd /usr/src/lib/libisc # make cleandir && make cleandir && make depend && make all # cd /usr/src/lib/libbind # make cleandir && make cleandir && make depend && make all # cd /usr/src/libexec/named-xfer # make cleandir && make cleandir && make depend && make NOSHARED=yes all # cp named-xfer /etc/namedb/bin && chmod 555 /etc/namedb/bin/named-xfer![]()
Após a instalação do seu named-xfer compilado estaticamente, uma faxina se faz necessária, para evitar deixar cópias envelhecidas de bibliotecas ou programas na sua árvore de fontes:
# cd /usr/src/lib/libisc # make cleandir # cd /usr/src/lib/libbind # make cleandir # cd /usr/src/libexec/named-xfer # make cleandir

# cd /usr/src && make cleandir && make cleandir
and delete your /usr/obj tree:
# rm -fr /usr/obj && mkdir /usr/obj
Isto limpará quaisquer ``restos'' de sua árvore de fontes, e, tentar novamente os passos acima deverá funcionar.
Se você está rodando o FreeBSD versão 4.9-RELEASE ou posterior, então a cópia do named-xfer em /usr/libexec é compilada estaticamente por padrão, e você pode simplesmente usar cp(1) para copiá-la dentro da sua sandbox.
Crie um dev/null o qual o named possa ver e escrever:
# cd /etc/namedb/dev && mknod null c 2 2 # chmod 666 null
Crie um link simbólico /var/run/ndc para /etc/namedb/var/run/ndc:
# ln -sf /etc/namedb/var/run/ndc /var/run/ndc
Nota: Isto evita, de forma simples, ter que especificar a opção -c para o ndc(8) cada vez que você executá-lo. Uma vez que o conteúdo do /var/run são apagados na inicialização (boot), se isto for algo que você considera útil você pode adicionar este comando ao crontab do root, usando a opção @reboot. Veja crontab(5) para mais informações a este respeito.
Configure syslogd(8) para criar mais um socket de log no qual o named pode gravar. Para isto, adicione -l /etc/namedb/dev/log na variável syslogd_flags no /etc/rc.conf.
Configure para que o named seja inicializado e restrinja-se com chroot à sandbox adicionando o seguinte ao /etc/rc.conf:
named_enable="YES" named_flags="-u bind -g bind -t /etc/namedb /etc/named.conf"
Nota: Note que o arquivo de configuração /etc/named.conf é declarado por um caminho completo relativo à sandbox, p.ex.: na linha acima, o arquivo referenciado é, na verdade, /etc/namedb/etc/named.conf.
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 "/";
named-xfer "/bin/named-xfer";
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";
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";
};




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!
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.
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>.