SysAdmin Resolução de DNS Resolvendo nomes com DNS Adivinha o nome? O sistema de resolução de nomes é a ligação de seu credits of the images computador com o sistema DNS global. O simples ato de digitar uma URL em seu navegador inicia uma conexão com computadores espalhados por todo o mundo. por Marc André Selig A lgumas pessoas com memória excepcional conseguem se lembrar de uma lista de mais de 300 números, enquanto outras podem ter dificuldades até mesmo para decorar os quatro grupos de números que compõem um endereço IP. A maioria das pessoas concorda que um nome é mais fácil de lembrar do que um número; a vantagem de associar um objeto a um nome alfanumérico é o verdadeiro motivo para a existência do gigantesco sistema DNS globalmente distribuído que faz a liga- ção entre os nomes de computadores (ou hostnames) e seus endereços. O sistema DNS já foi assunto de inúmeros artigos e livros, a maioria deles concentrada no sistema de nomes propriamente dito ou em servidores DNS como o Berkeley Internet Name Domain (BIND). Mas não podemos nos esquecer que, na outra ponta da linha, temos um aplicativo em um computador desktop qualquer que precisa de um meio de contatar um servidor para converter um nome para um endereço IP. Listagem 1: /etc/hosts 127.0.0.1 localhost.localdomain localhost ishi # As linhas a seguir são recomendadas para hosts compatíveis com IPv6 ::1 localhost.localdomain localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts 172.16.45.1 natrouter 216.92.94.3 sedacon.pair.com 72 novembro 2005 edição 14 www.linuxmagazine.com.br Resolução de nomes A interface que fornece a um aplicativo os meios para acessar os serviços de resolução de nomes é comumente chamada de resolver (palavrinha em inglês que alguns traduzem como resolvedor ou resolvedor de nomes). Uma forma popular de integrar a resolução de nomes a um aplicativo no Linux é através das funções de biblioteca C GNU (glibc). As mais comuns são a gethostbyname(), que traduz um nome em um endereço IP, e gethostbyaddr(), que faz o serviço na direção oposta. Essa interface, e suas funções auxiliares, está sendo gradualmente substituída por uma versão mais flexível, que usa getaddrinfo() para traduzir nomes em endereços, e getnameinfo() para fazer o contrário. A maioria das linguagens de script fornece funções similares: por exemplo, Perl tem gethostbyname() e gethostbyaddr(). As variantes mais recentes não costumam estar disponíveis – no caso de Perl, são parte de um módulo separado que provê compatibilidade com o protocolo IPv6. Resolução de DNS Listagem 2: /etc/resolv.conf nameserver 172.16.45.2 nameserver 172.16.45.3 options rotate Ferramentas extras para resolução de nomes estão disponíveis no shell, como o já obsoleto comando nslookup ou os mais recentes host e dig. A pegadinha ao lidar com nomes e endereços é o fato de que nem todos os programas realmente usam as funções da biblioteca padrão. Muitas das ferramentas do shell foram desenvolvidas para auxiliar na depuração de problemas e, portanto, fornecem acesso direto ao sistema de rede. E outra coisa: muitas destas ferramentas são compiladas estaticamente, o que significa que as rotinas de resolução de nomes usam versões específicas (e freqüentemente obsoletas) das bibliotecas. Configuração O sistema de resolução de nomes pode usar várias fontes de dados. A mais simples de todas elas é o velho arquivo /etc/ hosts (listagem 1), que contém uma lista de endereços IP e os nomes correspondentes. Cada endereço pode ser mapeado a um, ou mais, nomes. Os registros no arquivo hosts consistem de um endereço seguido por um ou mais nomes, além de linhas em branco e comentários (linhas que começam com o caractere #). A listagem 1 tem vários tipos de registros: o primeiro deles, 127.0.0.1 localhost, é comum a todos os arquivos hosts, já que é necessário para comunicação local entre processos. O segundo bloco de registros, logo abaixo do comentário, contém alguns endereços IPv6 importantes. O terceiro bloco mostra como endereços na rede local podem ser adicionados, oferecendo um modo simples de lidar com nomes de domínio fora do domínio local. A verdade está lá fora Se o sistema de resolução de nomes não conseguir encontrar o hostname desejado no arquivo /etc/hosts, pode contatar um servidor DNS como o BIND. O cliente consulta seu arquivo /etc/resolv.conf (listagem 2) para descobrir o endereço do servidor de nomes. Esse arquivo pode tanto ser criado manualmente como por um servidor DHCP. Normalmente, até três entradas para servidores de nome diferentes são permitidas. A segunda e terceira entradas só são usadas se os servidores especificados nas linhas anteriores não responderem. A última linha (options rotate) na listagem 2 muda esse comportamento, permitindo a distribuição das consultas ao servidor entre múltiplas máquinas. Fontes O sistema de resolução de nomes precisa saber quais das fontes de dados citadas estão disponíveis em uma máquina Linux e em qual ordem elas devem ser consultadas. Essa informação está armazenada em vários arquivos de configuração. O arquivo de configuração originalmente usado para este propósito é o /etc/host.conf. O seu conteúdo provavelmente se parece com isto: order hosts,bind multi on A palavra-chave aqui é order, seguida pela ordem em que a consulta deve ser feita. hosts representa a lista local de endereços no arquivo /etc/hosts.conf e bind se refere ao acesso a um servidor DNS via rede. A opção multi on indica que o arquivo /etc/hosts pode ter múltiplas entradas para o mesmo nome. Ou seja, estamos dizendo ao "resolvedor" para primeiro verificar se um nome de máquina ou endereço requisitado consta no arquivo hosts. Se a busca não tiver resultado, é feita uma consulta a um dos SysAdmin servidores DNS (nameservers) especificados no arquivo /etc/resolv.conf. O arquivo host.conf é um resíduo de versões antigas da glibc, libc.so.5 ou anterior. Versões atuais agora usam o name service switch do Solaris 2 e suportam um sistema de configuração flexível com vários serviços de resolução de nomes especificados na ordem que você quiser. O name service switch é configurado no arquivo /etc/nsswitch.conf (listagem 3). O arquivo contém uma lista de serviços e fontes de dados, além da descrição do comportamento desejado. O serviço hosts é o referente à resolução de nomes. A estratégia indicada na listagem, files dns, é o padrão e indica que o arquivo /etc/hosts deve ser consultado em primeiro lugar, seguido de uma consulta a um servidor DNS. Há mais arquivos de configuração. O Sendmail é apenas um exemplo de programa que tem sua própria biblioteca de resolução de nomes. A configuração é similar à do nsswitch da glibc, mas não idêntica. O arquivo de configuração específico do Sendmail é o /etc/mail/service.switch, que suporta apenas os serviços passwd, hosts e aliases. O Sendmail não usa vírgulas para separar os nomes dos serviços e, fora isso, o conteúdo de um arquivo /etc/mail/services.switch é muito similar ao de um /etc/nsswitch.conf. Sem rede Em algumas circunstâncias, recorrer à rede pode não ser o comportamento desejado. Por exemplo, se você tiver um Listagem 3: /etc/nsswitch.conf passwd: group: shadow: compat compat compat hosts: networks: files dns files novembro 2005 www.linuxmagazine.com.br edição 14 73 SysAdmin modem ou conexão DSL e pagar por hora de conexão, evitar consultas a servidores DNS pode lhe economizar uma boa grana. Além disso, motivos de segurança podem tornar o tráfego de rede indesejado. Se você precisar usar um túnel – como uma VPN – para trabalho confidencial, vai ser necessário evitar as consultas ao servidor DNS ou direcioná-las através do túnel. Em muitos casos, basta configurar o sistema para se conectar ao seu servidor de email através do endereço IP ou adicionar o nome do domínio ao arquivo /etc/hosts. Isto deixa apenas o navegador como principal gerador de consultas DNS. Um proxy socks-4a, como o privoxy (veja artigo na página XX desta edição) pode ser bastante útil nesse caso, já que permite redirecionar as consultas DNS à outra ponta do túnel. Considerando a variedade de "resolvedores" em potencial, as melhores práticas de segurança recomendam o uso de um firewall para evitar consultas DNS indesejadas. Resolução de DNS Mantendo-se na linha Os administradores precisam se certificar de que os vários arquivos de configuração não entrem em conflito. Se seu arquivo host.conf só aponta para o /etc/hosts, mas o arquivo /etc/nsswitch.conf também aponta para um servidor DNS, programas mais antigos com seus próprios sistemas de resolução ou compilados estaticamente não conseguirão encontrar alguns endereços. Se o arquivo nsswitch.conf não existir, a glibc irá usar valores padrão. Nameserver B Nameserver C � � Resolver � � Nameserver A � � Nameserver D Figura 1: A resolução de nomes às vezes resulta em uma cadeia de vários pedidos e respostas. O futuro parecia sombrio. Com o número de usuários explodindo, os procedimentos que haviam servido tão bem à ARPANET, a predecessora da Internet, na década de 70, estavam entrando em colapso. E um desses procedimentos era o processo de tradução de nomes de máquinas para endereços IP. Para isso os administradores da rede simplesmente mantinham um gigantesco arquivo com os nomes e endereços de todas as máquinas da rede e quem precisasse simplesmente baixava uma nova cópia desse arquivo via FTP. Qualquer um que quisesse adicionar um novo computador à rede notificava o centro de informações da rede (NIC – Network Information Center) por email e o centro atualizaria a lista mestre de hosts e a colocaria para download. O número cada vez maior de computadores causava um aumento do tráfego, já que cada vez mais pessoas necessitavam baixar o arquivo hosts. O tamanho da rede também criava um problema aparentemente insolúvel para os administradores: embora fosse possível designar um endereço único para cada máquina, não havia um meio de evitar conflitos de nome. Infelizmente, nomes duplicados podiam causar sérias interrupções de tráfego na rede, possivelmente tornando inacessíveis outras máquinas mais importantes. Além de tudo isso, havia a tendência da informação se tornar obsoleta no caminho entre o NIC e as partes mais distantes da rede, ou seja, não havia um meio de garantir a consistência da informação. A busca por uma solução finalmente levou a um sistema que – após algumas correções e melhorias – aguentou firme a explosão da Internet, o DNS ou Do- novembro 2005 � � A origem do DNS e como ele funciona 74 Todos os mecanismos que discutimos aqui têm implementações específicas. Embora cada "sabor" de Unix tenha seu próprio sistema de resolução de nomes padrão, os detalhes de implementação serão diferentes. Por exemplo, sistemas BSD usam uma sintaxe diferente no arquivo host.conf, os nomes dos serviços em nsswitch.conf são diferentes dependendo da versão do Unix e o Solaris agora usa o /etc/netconfig, um método que substitui o nsswitch por uma biblioteca própria. ■ edição 14 www.linuxmagazine.com.br main Name System (sistema de nomes de domínios). A receita para o sucesso do DNS é a descentralização. Em vez de uma única entidade com autoridade sobre um número inimaginavelmente grande de computadores ligados à rede, o sistema usa um tipo de "liderança em grupo", em que uma entidade é responsável por um grupo de computadores chamado de domínio e estes podem ser divididos em subdomínios. O gráfico representando os grupos e subgrupos tem a forma de uma árvore, muito similar à arvore de diretórios de um sistema de arquivos. Para dirigir-se a um host em particular, você informa seu nome e o domínio ao qual ele pertence, além de outros domínios no caminho até a raiz da árvore. A cadeia de caracteres (string) resultante é chamada de "nome de domínio completamente qualificado" (FQDN – Fully Qualified Domain Name). Um servidor de nomes gerencia a lista de nomes e endereços que pertencem ao seu domínio. Esse servidor pode delegar a responsabilidade pelos subdomínios a outros servidores. Se um cliente estiver interessado em descobrir o endereço correspondente a um nome específico, ele contata o servidor de nomes de seu próprio domínio. Se este não tiver a resposta em seu banco de dados ou cache, a pergunta é repassada ao servidor de nomes considerado como o mais próximo do objetivo, ou ao menos passa o nome desse servidor ao cliente. Dessa forma, o pedido "navega" pela hierarquia de domínios sempre de olho no alvo, até chegar a um servidor que tenha a resposta em seu cache ou lista de endereços e que possa responder ao cliente ou servidor de nomes que fez a pergunta (figura 1).