Adivinha o nome?

Propaganda
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).
Download