sexta-feira, 28 de outubro de 2016

Tutorial DNS - Parte 1 - Introdução

DNS(Domain name System) é um serviço criado para resolver os nomes na Internet, "traduzi-los" para endereços IP, e vice versa. Por exemplo o endereço "www.Exemplo.com.br" deve corresponder à um determinado endereço IP. Isso facilita a vida do usuário, na verdade a Internet seria impossível sem este serviço muito simples.


 Um pouquinho de história


Nos primórdios da Internet era muito fácil se lembrar dos endereços IP de outros servidores já que havia muito poucos hosts na rede. Conforme a rede cresceu este trabalho se tornou cada vez mais dispendioso. A solução seguinte foi criar um arquivo de texto chamado "hosts" onde era colocado todos os nomes conhecidos e os respectivos endereços IP. Este arquivo era atualizado periodicamente com um número de versão para controle. A cada acesso a aplicação poderia checar o arquivo para saber qual o endereço IP correspondente ao host. Naturalmente isto também ficou absolutamente insustentável com o crescimento da rede. Então foi criado um serviço próprio para o mapeamento dos nomes em um sistema distribuído em várias zonas e domínios diferentes, o DNS.

O arquivo hosts


O arquivo hosts até hoje é usado. Na verdade ele é o primeiro a ser consultado quando digitamos um nome de domínio qualquer para acessar qualquer coisa na rede. No Windows o seu endereço é "C:\Windows\System32\Drivers\etc\hosts" e no Linux, e familiares, "/etc/hosts". Você pode abrir o arquivo e dar uma olhada. Ele quase sempre está vazio ou apenas com linhas comentadas. É possível adicionar entradas manualmente nele, para o bem ou para o mal, como descrito neste artigo aqui.

Os Root Servers


O protocolo DNS funciona mapeando zonas de cima para baixo. Cada servidor pode ser o dono, chamado servidor Autoritativo, de uma ou mais zonas. Em primeiro lugar existem os root servers, que são os servidores raiz do sistema. Ele são responsáveis pela zona primária que é referenciada com um ponto, ou melhor Root Zone. São 13 no total e cada um recebe uma letra como nome, de A até M. Eles são administrados pela IANA e distribuídos pelo globo. No site oficial é possível ver um mapa de onde eles estão localizados. Cada servidor pode ter várias cópias. No Brasil, por exemplo, temos vários exemplares do J e do L.


Você pode se perguntar o porque de ter "clones" dos root servers pelo mundo e não novos servidores até completar o alfabeto. A questão é que a cada novo servidor, seu endereço deveria ser divulgado para todos os outros no mundo. Sem falar que um único root "B", por exemplo, estando apenas em uma localidade poderia receber muito tráfego. Eles são "clonados" para manter coerência dos 13 nomes históricos e balancear o tráfego global. Seus endereços são configurados em anycast, de forma que se você precisa do root "C", chegará sempre ao mais próximo.

O trabalho dos root servers, sendo donos da zona raiz, é delegar autoridade à outros servidores das zonas do topo, chamadas Top Level Domains(TLDs). Dentro das TLDs podemos ter várias categorias como os códigos de países. Brasil com o ".br", Japão com ".jp" e assim por diante, além de outros domínios genéricos como ".com", ".gov" e ".net", etc. Repare que todo o funcionamento da Internet depende desses domínios e do trabalho dos root servers. Todo servidor DNS deve saber de cor os endereços dos root servers para iniciarem as pesquisas.
Uma questão bem atual na governança da Internet é justamente a liberação de novos TLDs. Países mais conservadores tentem à proibir domínios ".xxx" por exemplo, e outras discussões como alocação de TLDs para grandes empresas como Google e Audi. Veja na lista que várias empresas já reservaram domínios com seus nomes ou mesmo de seus produtos. A zona ".br" é de responsabilidade do Comitê gestor da Internet no Brasil e administrada pelo Nic.Br. Isto significa, basicamente, que todo domínio ".br" deve ser registrado lá.
Para ficar mais claro você pode fazer uma consulta DNS rápida para entender. Use o comando "nslookup -type=NS br.". Traduzindo você está perguntando para o seu servidor DNS quem é o NS(name server) da zona "br."(com ponto no final). Ele vai te responder com os nomes dos servidores responsáveis do Brasil.

Repare que na imagem acima, nas primeiras linhas, que quem me responde é o servidor do Google, e com o aviso "Não é resposta de autorização". Na tradução tosca do Windows, isto significa que este servidor do Google está te respondendo mas ele não é o dono da zona. Você pode perguntar diretamente para os donos e receber uma resposta autoritativa, basta adicionar o endereço de um dos servidores logo no final do comando:
Repare que quem responde é o próprio servidor dono da zona, e não há mensagem de "Não é resposta de autorização".

Servidores Autoritativos


Um servidor DNS pode ser o autoritativo de uma determinada zona. Isto significa que o servidor responsável pela zona superior lhe delegou esta autoridade. Por exemplo a empresa ABC para registrar o domínio "ABC.com.br" precisa requerer o registro da zona com a autoridade do domínio superior e indicar quais serão os servidores autoritativos da zona "ABC.com.br". Uma vez configurado o administrador pode criar os hosts dentro desta zona no arquivo do servidor autoritativo, como "www", "blog", "mail" ou "loja". Cada registro desse vai corresponder ao endereço IP do servidor que hospeda o serviço.
Por exemplo:
mail.abc.com.br  192.0.2.25     #Servidor de email
www.abc.com.br   198.51.100.42  #Servidor web
blog.abc.com.br  203.0.113.89   #Servidor do blog

  Servidores Recursivos


Os servidores chamados recursivos não respondem apenas por suas próprias zonas(se houver), mas fazem a pesquisa recursivamente em toda árvore de domínios até chegar na resposta e entregar ao usuário, sobre qualquer nome. Tudo que ele precisa saber são os endereços dos root servers, o resto flui naturalmente. É o caso dos servidores públicos do Google ou OpenDNS, que qualquer pessoa pode usar. A ideia é distribuir o volume das consultas nos servidores autoritativos já que em uma rede, ou região, vários usuários vão fazer as mesmas perguntas várias vezes. Um servidor recursivo armazena em cache cada resposta que obtém para entregar mais rápido quando solicitado novamente sobre os mesmos nomes e não ter de fazer o processo todo de novo. Geralmente usamos os DNS recursivos do nosso provedor de acesso ou mesmo através do nosso roteador doméstico, que pode fazer o mesmo papel.

Servidores autoritativos podem fazer o trabalho recursivo também e vice versa. Mas geralmente os servidores autoritativos na Internet são somente autoritativos. Isto é, respondem apenas o sobre os hosts e subdomínios dentro de sua zona.

Para fazer um teste rápido, pergunte ao servidor DNS de "globo.com" sobre o endereço IP de "www.facebook.com", e receberá uma resposta negativa de "Query refused". Mas se você perguntar sobre o "g1.globo.com", que é um host dentro de sua zona, responderá normalmente com máxima autoridade:
   nslookup www.facebook.com ns01.globo.com 
#Pergunta para ns01.globo.com quem é www.facebook.com


   nslookup g1.globo.com ns01.globo.com
#Pergunta para ns01.globo.com quem é g1.globo.com

Um servidor atuando como recursivo também pode ser o autoritativo de uma ou mais zonas sem problema algum. Por fim, veja a animação abaixo de uma pesquisa solicitada por um cliente sobre o nome "www.exemplo.com.br" ao seu servidor recursivo:

  
Quando um cliente recebe uma resposta sobre determinado nome ele também armazena em um cache temporariamente, para que não volte a perguntar ninguém sobre os mesmos nomes por um tempo. Você pode checar o cache DNS do seu computador com o comando:
 ipconfig /DisplayDNS
Ou mesmo limpá-lo:
ipconfig /FlushDNS
A resolução de nomes em geral funciona assim: