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