Instalando o servidor DNS

 
Introdução:

Servidores de nome de domínio são programas destinados a traduzir números de IP para nomes amigáveis, e vice-versa.


Há dois motivos para se desejar instalar um servidor de DNS em u'a máquina doméstica: ao possuir um espelho para resolução de nomes de domínio em sua rede doméstica, a navegação acaba ficando mais rápida, notadamente em sites que utilizam muitas fontes de conteúdo externas, além disso, passa a ser possível referir-se aos componentes da rede doméstica por nomes e, não, por seus números de IP, inclusive o servidor "localhost", para desenvolvimento local de aplicações-web.


O servidor de DNS mais comum, utilizado por 70% dos sites da Internet, é o Bind9, objeto do tutorial que se inicia.

2) Antes de começar a instalação: levantando dados:

a) Descobrindo os números Gateway e Network:


Rode o comando abaixo no Terminal (Ctrl+T), para descobrir o valor do Gateway e do Network:


route -n


Procure a entrada "default" e anote os números. Tratam-se dos valores do Gateway.


Observe a última entrada, na coluna da esquerda, uma sequencia numérica. Trata-se dos valores de Network. Anote-o.


b) Descobrindo as demais configurações de rede:


Em seguida, rode o comando "ifconfig", e busque pelas entradas "inet addr" (address), "Bcast" (broadcast) e "Mask" (netmask) de sua placa de rede.


Obs.: a partir do Ubuntu 15.10, a Canonical aderiu à mudança dos nomes persistentes das interfaces de rede introduzida pela DELL e pela SLES, abandonando o padrão ethX, o que resolveu muitos problemas de previsibilidade dos nomes das interfaces de rede em computadores com mais de uma placa.


Isso quer dizer que, ao rodar o comando “ifconfig” não mais aparecerão os familiares nomes eth0, eth1 ou wlan, mas novas nomenclaturas, como enp2s0 e wlp3s0, por exemplo.


É possível descobrir o nome das interfaces de rede rodando o comando a seguir. Obviamente, só serão exibidas as placas ativadas, mesmo que desconectadas:


ifconfig


O comando “ifconfig”, como você deve ter notado, nos informa muito mais do que apenas o nome atribuídos pelo sistema às interfaces de rede. De fato, voltaremos a este comando em breve, para extrair outras informações úteis.


Dica: nas raras ocasiões em que uma placa de rede não está sendo carregada por problema de driver, é preciso descobrir seu modelo para consultar na Internet uma solução. Para tanto, rode o comando:


lspci

3) Antes de começar a instalação: configurando o IP do servidor
É necessário alterar as configurações do (futuro) servidor, de DHCP para Estático, aplicando-lhe as informações de rede levantadas anteriormente. Para aplicá-las, rode o seguinte comando no Terminal:


sudo nano /etc/network/interfaces


Para navegar pelo arquivo, utilize as teclas de setas. Localize a seguinte entrada. Se não existir, pode criá-la:


#The primary network interface

auto snp2s0

iface snp2s0 inet dhcp


Obs.: a versão para Raspberry PI do Ubuntu Server 16.04 que estamos utilizando nesta sequência de tutoriais ainda usa o padrão antigo de nomes de interface (ethX).


É necessário editá-la (ou criá-la), para que fique da seguinte forma:


  #The primary network interface 
auto eth0
iface eth0 inet static
address
(o número "inet addr", após o comando “ifconfig”)
netmask
(o número "Mask", após o comando “ifconfig”)
network
(Destino (Destination), com Roteador (Gatewy) 0.0.0.0 e MascaraGen (Genmask) correta)
gateway
(Roteador (Gateway) de Destino (Destination) = 0.0.0.0, em )
broadcast
(o número "Bcast", após o comando “ifconfig”) dns-nameservers 8.8.4.4 8.8.8.8

Ficará algo como:

  #The primary network interface 
auto snp2s0
iface snp2s0 inet static
address 192.168.1.15
netmask 255.255.255.0
gateway 192.168.1.1
network 192.168.1.0
broadcast 192.168.1.255
dns-nameservers 8.8.4.4 8.8.8.8 

Para salvar e fechar o Nano, utilize a combinação "Ctrl+x", responda à pergunta com "Y" (ou “s”, se seu sitema estiver em português) e aperte "Enter".


Limpe as configurações antigas de IP com o comando:


sudo ip addr flush snp2s0


Reinicie as interfaces de rede com o comando abaixo:


sudo /etc/init.d/networking restart


Para conferir se tudo correu bem, rode novamente o comando "ifconfig".


Se não tiver havido mudança, rode o seguinte comando:


sudo ifdown snp2s0 && sudo ifup snp2s0


Teste a rede, só para conferir, com os comandos abaixo:


ping www.google.com


e


dig www.google.com


Se ainda não estiver acessando a Internet, reinicie o computador e teste novamente os comando “ping” e “dig”.

4) Antes de começar a instalação: configurando o nome de domínio

a) Descobrindo o hostname:


Uma forma rápida de se descobrir o “hostname“ da máquina é rodando o seguinte comando no Terminal:


hostname


Para além de meramente descobri-lo, mas alterá-lo, rode o seguinte comando:


sudo nano /etc/hostname


Se desejar alterar o nome da máquina, esse é o momento. Em seguida, feche o editor Nano, com a seguinte sequência de teclas: Ctrl+X, Y e Enter.


Nota: se tiver alterado o nome da máquina, não esqueça de repetir a alteração no arquivo “hosts”, após rodar o comando a seguir:


sudo nano /etc/hosts


O arquivo exibe o que segue:


127.0.0.1 localhost

127.0.1.1 nome_da_máquina


nome_da_máquina”, acima, é o “hostname” de sua máquina, e deve ser igual ao “hostname” anteriormente descoberto.


Se você tiver alterado o nome da máquina no arquivo hostname, altere-o aqui também, pois ambos os arquivos devem exibir o mesmo nome da máquina.


Edite o arquivo, substituindo:

- “127.0.1.1” pelo número de IP estático de sua máquina servidora, neste exemplo: 192.168.1.15;

- “nome_da_máquina” pelo “hostname” de sua máquina, seguido do nome de domínio que será utilizado e, após um espaço, o próprio “hostname” novamente;


Nota sobre o nome de domínio: é necessário criar um nome de domínio para o servidor. Neste tutorial, será configurado o nome de domínio interno chamado: linux.rocks. Se quiser usar outro nome de domínio, altere linux.rocks pelo que desejar. Apenas tome cuidado para utilizar um nome que não exista na rede. A extensão "rocks" não é um domínio de alto nível, como .com, .net ou .org, então não há risco de conflito (para uma lista completa dos nomes de domínio de alto nível, confira na Wikipedia), caso você abra seu servidor para ser acessado pela Internet.


Ao final, o arquivo deverá ficar assim:

 127.0.0.1localhost 
192.168.1.15userver userver.linux.rocks
#127.0.1.1userver

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Salve e feche o arquivo, utilizando a seguinte sequência de comandos: Ctrl+X, Y (ou “S”, se seu sistema estiver em português), Enter.


A alteração deste arquivo demanda que a máquina servidora seja reiniciada. Já que o Terminal ainda está aberto, aplique o comando:


sudo shutdown -r now


3) Configurando o servidor de DNS:

Com o servidor novamente ligado, é hora de instalar o Bind9. Reinicie o Terminal (Ctr+Altl+T), acesse o servidor via SSH e rode o seguinte comando:


sudo apt-get install bind9 dnsutils bind9-doc


Após a instalação, é necessário configurar três arquivos:

- named.conf.options;

- named.conf.local;

- resolv.conf.


A eles.


a) Configurando o arquivo named.conf.options:


Para configurar o Bind9 é preciso, inicialmente, indicar onde procurar pela resolução dos números de IP. Neste tutorial, serão utilizados os endereços dos servidores de DNS do Google, que são rápidos e gratuitos. Se você tiver um domínio registrado, terá recebido os números de IP do servidor de DNS da autoridade servidora de internet. Use-os também.


Rode o comando abaixo no Terminal:


sudo nano /etc/bind/named.conf.options


Apague o conteúdo do arquivo e substitua pelo que segue: 

 acl goodclients {
  192.168.1.15; #IP do servidor;
  192.168.1.1; #gateway
  localhost;
  localnets;
};

options {
  directory "/var/cache/bind";

  recursion yes;
  allow-query {goodclients;};

  forwarders {
  8.8.8.8; #DNS google
  8.8.4.4; #DNS google
  };

  forward only;

  dnssec-enable yes;
  dnssec-validation yes;

  auth-nxdomain no; # conform to RFC1035
  listen-on-v6 { any; };
};

Concluída a edição, feche o Nano. O procedimento é o mesmo: Ctrl+X, Y (ou “s”), Enter.


Nota: a explicação para as alterações acima são longas. Em linhas curtas e gerais, ao se criar uma chamada separada para um grupo de domínios confiáveis (goodclients), e se permitir a pesquisa recursiva apenas nesses clientes, o que se está fazendo é tentar proteger o servidor DNS de ataques (D)DoS. As pesquisas externas à rede da qual faz parte o servidor são direcionadas aos servidores do Google.

 

 

b) Configurando o arquivo named.conf.local:


O arquivo "named.conf.local" indica os bancos de dados (localizados na pasta /etc/bind) que armazenam as informações das zonas Forward (direta) e Reverse (reversa), cuja função, basicamente, é traduzir nomes de domínio em números de IP e vice-versa, que o Bind9 deve carregar quando iniciado.


Lembrando: neste tutorial será configurado o nome de domínio interno chamado linux.rocks.


É necessário determinar o alcance dos números de IP da rede interna, para que os arquivos de zona direta e reversa sejam corretamente criados. Para tanto, dê uma olhada no número de IP inserido anteriormente ("address"). Interessam os três primeiros trios (no exemplo: 192.168.1).


De posse dos números, a zona de busca direta correta será "1.168.192.in-addr.arpa". Use o mesmo método para definir sua própria zona direta.


Para a zona reversa, observe o primeiro trio da sequência: 192. O arquivo de configurações de busca reversa receberá o nome "db.192".


Hora de editar o arquivo "named.conf.local". No Terminal (Ctrl+Alt+T), digite:


sudo nano /etc/bind/named.conf.local


No arquivo que se abre, adicione o código que segue, substituindo "linux.rocks", "1.168.192.in-addr.arpa" e “db.192” pelos valores pertinentes à sua própria configuração. Atente aos endereços dos arquivos de bancos de dados que deverão ser criados a seguir em “/etc/bind/”.

      #Foward zone: 
zone "linux.rocks" {
     type master;
     file "/etc/bind/db.linux.rocks";
     };

#Reverse zone:
#NOTA: Ip do servidor = 192.168.1.15
zone "1.168.192.in-addr.arpa" {
     type master;
     notify yes;
     file "/etc/bind/db.192";
     };

Mais uma vez: Ctrl+X, Y, Enter.


b) Criando o arquivo de busca progressiva:


Agora é preciso criar os dois arquivos de bancos de dados anteriormente indicados. O primeiro será a zona direta (db.linux.rocks). Para evitar erros, será utilizado um arquivo padrão, inserido pela instalação do Bind9. Para tanto, faça uma cópia do arquivo "db.local", renomeando-a para, neste tutorial, "db.linux.rocks" (utilize seu nome de escolha), com o seguinte comando:


sudo cp /etc/bind/db.local /etc/bind/db.linux.rocks


Para editar esse arquivo, abra-o no Nano:


sudo nano /etc/bind/db.linux.rocks


É preciso alterar algumas configurações neste arquivo. Se quiser, copie e cole o conteúdo a seguir, substituindo o presente no arquivo aberto no Nano. Substitua os parâmetros de modo a se adequarem aos de seu servidor.

      ; 
; BIND data file for local loopback interface
;
$TTL 604800 @ IN SOA userver.linux.rocks. torvalds.linux.rocks. (
               3        ; Serial
               604800   ; Refresh
               86400    ; Retry
               2419200  ; Expire
               604800 ) ; Negative Cache TTL

             IN     NS     linux.rocks.
@            IN     A      192.168.1.15
linux.rocks. IN     A      192.168.1.15

;Atribuindo apelidos aos componentes da rede:
userver      IN     A      192.168.1.15
desktop      IN     A      192.168.1.16
roteador     IN     A      192.168.1.1

www          IN     CNAME  userver.linux.rocks.


Preste atenção à diagramação. Abaixo, uma reprodução do Nano exibindo o arquivo editado:

Notas sobre alguns dos elementos do arquivo de configuração:


a) userver.linux.rocks. -  é o domínio qualificado encarregado do servidor responsável pelo domínio sendo criado, e combina o “hostname” de sua máquina (no exemplo: userver) e o domínio do site (no exemplo: linux.rocks). Não esqueça do ponto final.
b) torvalds.linux.rocks.  - é o e-mail do responsável pelo servidor de domínio. Não se usa a arroba neste endereço. Em seu lugar, usa-se um ponto.


Acerca dos nomes dos dispositivos conectados à rede:


c) na coluna da esquerda estão os nomes dos dispositivos;

d) IN quer dizer internet;

e) a terceira coluna define o tipo de entrada, no caso, como A (Address – endereço de IP);

f) Na quarta coluna, o endereço de IP do componente sendo conectado;

g) na última linha, "www" é apontado como um CNAME (nome canônico), em vez de um endereço (A), ao domínio. Isso permite que se introduza o endereço "www.linux.rocks" na barra de endereços do navegador, em vez do nome do servidor seguido do domínio (userver.linux.rocks).


Para explicações mais completas sobre o arquivo de zona direta (e o de zona reversa), indicarei uma leitura mais adiante.

Salve as edições e saia do Nano com a sequência de teclas: Ctrl+x, S (ou “y”, se seu sistema estiver em inglês), e Enter.


b.3) Criando o arquivo de busca reversa:


Mais acima no tutorial, foi atribuído o nome "db.192" para o arquivo de configurações da busca reversa.


A zona reversa faz o contrário da zona direta: traduz o número de IP em nome fantasia (em vez do nome fantasia em número de IP).


Novamente, para evitar erros, utilize um arquivo de configurações existente, para gerar o "db.192". No Terminal, digite:


sudo cp /etc/bind/db.127 /etc/bind/db.192


Para editá-lo, rode o comando:


sudo nano /etc/bind/db.192


Use o exemplo abaixo como referência, substituindo as especificações por aquelas correspondentes à sua rede:

Como se percebe, o esquema é parecido com o do arquivo da zona progressiva. O que vai mudar é a forma como se faz referência aos componentes de rede e suas identificações. Para a identificação, basta o último número das sequências de IP (exemplo: "15" em "192.168.1.15").


Na linha "12 IN PTR desktop.linux.rocks.", por exemplo:


- "12": último grupo de números da sequência do IP do aparelho;

- "IN": Internet Address;

- "PTR": Pointer record: que nome será chamado quando o IP for buscado;

- "desktop.linux.rocks.": nome completo que será apresentado após uma consulta "nslookup".


Nota: para uma explicação completa sobre os arquivos de zona direta e reversa, e os parâmetros de sua configuração, leia o artigo An Introduction to DNS Terminology, Components, and Concepts.

c) Habilitando a função RESOVCONF:


Agora, é necessário habilitar a função RESOVCONF no arquivo de configurações gerais do Bind9. Para tanto, rode o seguinte comando, para abri-lo no Nano:


sudo nano /etc/default/bind9


Na segunda linha, altere “RESOLVCONF=no” para “RESOLVCONF=yes”. Salve o arquivo e feche o Nano.


Obs: se não funcionar, para reconfigurar o arquivo resolv.conf, use o comando:


sudo dpkg-reconfigure resolvconf

4) Inicie o servidor DNS:

Feitas as configurações, hora de iniciar o serviço DNS. Rode o seguinte comando no Terminal:


sudo /etc/init.d/bind9 start


Abaixo, outros comandos úteis:


Parar o serviço:

sudo /etc/init.d/bind9 stop


Reiniciar:

sudo /etc/init.d/bind9 restart


Verificar seu estado:

sudo /etc/init.d/bind9 status

5) Testando o servidor:

Para testar se o servidor está funcionando corretamente, rode os seguintes comandos no Terminal conectado à máquina com o  servidor de DNS, via SSH:


host -l linux.rocks


Outro teste:


nslookup linux.rocks


e


nslookup 192.168.10.15


Use o comando dig:


dig linux.rocks


Teste a busca reversa:


host 192.1168.10.15


A resposta deve algo como:


15.10.168.192.in-addr.arpa domain name pointer testServer.linux.rock.

6) Notas finais:

Para que as configurações do servidor de DNS surtam efeito - para que você possa acessar as máquinas na rede interna e os sites desenvolvidos localmente, por seus nomes, em vez do número de IP - é necessário configurar os computadores que acessam a rede para que usem o servidor de DNS configurado acima como uma das fontes de resolução de nomes de domínio. Para isso, será necessário acessar as configurações de rede relativas à rede local, em cada uma das máquinas conectadas, independentemente de seus sistemas operacionais, e incluir o número de IP do servidor (no exemplo: 192.168.1.15) na lista de servidores de DNS.