quinta-feira, 29 de maio de 2014

Servidor DNS no Sistema Operacional Linux

Olá Pessoal.

O DNS é um dos serviços mais importantes na Internet porque é responsável pela tradução dos endereços nominais (nomes) em números (IPs) e vice-versa (resolução reversa). Os nomes são mais fáceis de serem memorizados pelas pessoas e esse serviço será ainda mais importante com a disseminação do IPv6 que possui endereços mais complexos. Esse serviço pode ser implementado no Linux através do BIND. Para exemplificar seu processo de configuração em distribuições baseadas no Debian irei utilizar o cenário abaixo que pode ser facilmente reproduzido no VirtualBox. 


A primeira etapa consiste na instalação do pacote "bind9" para que o Linux possa ser posteriormente configurado como servidor primário DNS na rede. Essa tarefa é simples e rápida através do APT.

root@ns1:/# apt-get install bind9

Os arquivos de configuração ficam armazenados em "/etc/bind". No arquivo de configuração "/etc/bind/named.conf.local" são realizadas as primeiras configurações da zona direta de domínio (forward) e da zona reversa. 

#--- em /etc/bind/named.conf.local
zone    "nome.com.br"   
{
        type master;
        file    "/etc/bind/nome.com.br.forward";
        allow-transfer { 192.168.221.202; };
};

zone    "221.168.192.in-addr.arpa"        
{
        type master;
        file    "/etc/bind/nome.com.br.reverse";
        allow-transfer { 192.168.221.202; };
};

A primeira seção do arquivo de configuração faz referência à zona direta, enquanto que a segunda seção faz referência à zona reversa. O parâmetro type informa que esse servidor será mestre e o parâmetro allow-transfer permite a troca de informações com outro servidor que configuraremos mais adiante. O parâmetro file informa o caminho onde podem ser encontrados os arquivos de configuração das zonas direta e reversa. Respeitando os caminhos informados na configuração anterior, devem ser criados os arquivos das zonas direta e reversa. 

É recomendado gerar esses arquivos a partir de outros já existentes para evitar erros de sintaxe. O arquivo "/etc/bind.db.local" pode servir como modelo de zona direta, enquanto que o arquivo "/etc/bind/db.127" pode servir como modelo de zona reversa. 

root@ns1:/# cp /etc/bind/db.local /etc/bind/nome.com.br.forward
root@ns1:/# cp /etc/bind/db.127   /etc/bind/nome.com.br.reverse 

Para o exemplo da topologia apresentada na imagem, a configuração do arquivo da zona direta deve ficar da seguinte maneira:

;--- /etc/bind/nome.com.br.forward
; BIND - Zona Direta (nome.com.br)
;---
$TTL    604800
@       IN      SOA     ns1.nome.com.br. root.nome.com.br. (
                        2014051801       ; Serial
                            604800       ; Refresh
                             86400       ; Retry
                           2419200       ; Expire
                            604800 )     ; Negative Cache TTL
;
@       IN     NS       ns1.nome.com.br.
@       IN NS ns2.nome.com.br.
gateway IN A 192.168.221.1
client IN A 192.168.221.37
ns1 IN A 192.168.221.201
ns2 IN A 192.168.221.202
router IN CNAME gateway
winxp IN CNAME client

O registro NS faz referência aos próprios servidores DNS responsáveis pelo domínio (autoritativo), que são ns1 e ns2 neste exemplo. Os registros A são mapeamentos diretos entre nomes e endereços IPv4, sendo que para endereços IPv6 os registros são AAAA (quad-A). Os registros CNAME são apelidos que podem ficar associados com nomes que já existem, por exemplo: gateway <> router.

A configuração do arquivo da zona reversa fica da seguinte maneira:

;--- /etc/bind/nome.com.br.reverse
; BIND - Zona Reversa (nome.com.br)
;---
$TTL    604800
@       IN      SOA     ns1.nome.com.br. root.nome.com.br. (
                        2014051801       ; Serial
                            604800       ; Refresh
                             86400       ; Retry
                           2419200       ; Expire
                            604800 )     ; Negative Cache TTL
;
@ IN  NS ns1.nome.com.br.
@ IN NS ns2.nome.com.br.
1 IN PTR gateway.nome.com.br.
37 IN PTR client.nome.com.br.
201 IN PTR ns1.nome.com.br.
202 IN PTR ns2.nome.com.br.

Os registros PTR fazem referência ao mapeamento reverso, por isso as referidas linhas começam com um número referente a porção do endereço IP que remete ao host informado na sequência. Por exemplo, o host 37 dentro da rede 192.168.221.0/24 (192.168.221.37) responde pelo nome client.nome.com.br.

Antes de tentar inicializar o serviço é importante fazer uma verificação de erros de sintaxe nos arquivos de configuração através das ferramentas named-checkconf e named-checkzone. Se algum erro for indicado, verifique novamente os arquivos. 

root@ns1:/# named-checkconf /etc/bind/named.conf.local
root@ns1:/# named-checkzone nome.com.br /etc/bind/nome.com.br.forward
root@ns1:/# named-checkzone 221.168.192.in-addr.arpa /etc/bind/nome.com.br.reverse

Por fim, depois de configurado o servidor, basta iniciar o serviço para validar todas as configurações realizadas anteriormente. A partir de agora, todos os clientes da rede já podem utilizar o servidor de nomes interno. 

root@ns1:/# service bind9 start
[ ok ] Starting domain name service...: bind9.

Obs.: Quando um novo serviço é instalado no Debian, ele passa a ser automaticamente inicializado em caso de boot do servidor. A ferramenta update-rc.d pode ser utilizada para remover/adicionar serviços no processo de inicialização automática, por ex.: "update-rc.d -f bind9 remove" ou "update-rc.d bind9 defaults".

O arquivo local "/etc/resolv.conf" deve ser atualizado com o endereço localhost como próprio servidor de nomes. Estamos nos adiantando ao informar o servidor secundário (192.168.221.201) que será configurado na sequência. 

#--- em /etc/resolv.conf
search nome.com.br
nameserver 127.0.0.1
nameserver 192.168.221.202

Há várias ferramentas de diagnóstico que podem ser utilizadas para verificar se o servidor DNS está operando corretamente. Através do comando dig é possível buscar os registros A e PTR (reverso). É recomendado que o leitor consulte as ferramentas apresentadas abaixo:

root@Host:/# dig gateway.nome.com.br
root@Host:/# dig –x 192.168.221.1
root@Host:/# nslookup <hostname|IP>
root@Host:/# host     <hostname|IP>

Uma vez configurado e funcionando o servidor mestre ns1, configurar o servidor escravo ns2 é bastante simples porque os arquivos de configuração das zonas direta e reversa serão replicados. Primeiramente vamos instalar o bind no servidor seguindo o mesmo procedimento visto anteriormente:

root@ns2:/# apt-get install bind9

No arquivo de configuração "/etc/bind/named.conf.local" devem ser informada as zonas direta e reversa, fazendo referência ao master. Observem que os arquivos das zonas não podem ficar no diretório /etc/bind, como fizemos anteriormente com o servidor master onde o arquivo foi criado e editado manualmente. Ao informar apenas os nomes dos arquivos das zonas (destaque em amarelo), sem nenhum caminho, o sistema se encarrega de armazená-los no diretório /var/cache/bind, onde devem ficar os arquivos dinâmicos (escritos pelo sistema) porque existe permissão de escrita. Pronto, as demais configurações serão sincronizada a partir do master. :-)

zone    "nome.com.br"   
{
        type slave;
        file    "nome.com.br.forward";
        masters { 192.168.221.201; };
};

zone   "221.168.192.in-addr.arpa"        
{
       type slave;
       file    "nome.com.br.reverse";
       masters { 192.168.221.201; };
};

O arquivo local "etc/resolv.conf" deve ser atualizado com o endereço localhost como próprio servidor de nomes. Reparem que estamos informando o servidor master como secundário, já que ns2 também é um servidor de nomes. 

#--- em /etc/resolv.conf
search nome.com.br
nameserver 127.0.0.1
nameserver 192.168.221.201

Feito isso já existem dois servidores DNS instalados no ambiente e que respondem pelo domínio nome.com.br (servidores autoritativos). Os dois servidores irão sincronizar todos os registros de nomes com os servidores raízes espalhados pela Internet e todas as máquinas da rede local farão suas consultas DNS no contexto local, evitando consultas externas que têm maior latência. 

Abraço.

Samuel.

Um comentário: