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