====== Resolução de Nomes ====== Nomes e endereços têm finalidades distintas: nomes servem para identificar recursos, enquanto endereços servem para localizar recursos. Na Internet, existe uma infraestrutura relativamente complexa para a tradução de nomes em endereços, e vice-versa. Essa infra-estrutura é fundamental para o funcionamento correto da maioria dos serviços Internet. ===== Nomes de hosts ===== As interfaces de um host em uma rede TCP/IP são identificadas basicamente por seus endereços de rede (endereços IP), que permitem localizá-las. No entanto, para facilitar a memorização dos endereços por seres humanos e para prover um nível de transparência sobre o endereçamento de rede, é possível associar nomes simbólicos (strings) a esses endereços IP, facilitando sua identificação. No início da Internet, todos os nomes de hosts conhecidos eram catalogados com seus respectivos endereços em um arquivo ''hosts.txt'', localizado no SRI-NIC (//Stanford Research Institute - Network Information Center//). A manutenção e distribuição desse arquivo eram feitas manualmente, via e-mail. Com o crescimento da rede, esse método tornou-se inviável, o que acabou levando à definição do //Domain Name System// (DNS) em 1984, através das RFCs 882 e 883, mais tarde atualizadas pelas RFCs [[http://www.ietf.org/rfc/rfc1034.txt|1034]] e [[http://www.ietf.org/rfc/rfc1035.txt|1035]] (uma lista mais completa de [[http://www.dns.net/dnsrd/rfc/|RFCs relacionadas ao DNS]]). O DNS usa uma estrutura hierárquica de domínios para a definição de nomes. Os nomes que seguem essa estrutura são chamados **FQDN** - //Fully Qualified Domain Names//. Um FQDN é estruturado da seguinte forma: host.3rd-level-domain.2nd-level-domain.top-level-domain Exemplos de FQDN: espec.ppgia.pucpr.br www.uol.com.br www.mit.edu edas.info O número de níveis em um FQDN não é fixo. Caso nenhum domínio seja definido, o domínio default "''localdomain''" será usado. O espaço de nomes de domínio é definido como uma árvore de domínios, iniciando no domínio ".", chamado domínio raiz (//root domain//). A figura abaixo ilustra essa estrutura: {{ :espec:dns-hierarquia.png |}} Cada parte da árvore de domínios pode ser gerenciada por uma organização diferente, de forma hierárquica. A responsabilidade pelos domínios brasileiros (nomes terminando em ".br") está a cargo do serviço [[http://registro.br|Registro.BR]], mantido pelo [[http://www.cgi.br|Comitê Gestor da Internet no Brasil]]. A figura abaixo ilustra esse conceito com um exemplo: {{ :espec:dns-dominios.png |}} Cada domínio ou sub-domínio de nomes (indicado pelos retângulos coloridos na figura acima) está a cargo de um servidor DNS. Um servidor pode ser responsável por um ou mais domínios de nomes, e pode delegar sub-domínios a outros servidores. ===== Resolução de nomes ===== A resolução de nomes consiste em encontrar o endereço IP associado a um nome de domínio (resolução direta), ou vice-versa (resolução reversa): {{ :espec:dns-resolucao.png |}} No UNIX (e na maioria dos sistemas operacionais com suporte a TCP/IP), a resolução de nomes está a cargo de uma biblioteca de sistema chamada [[http://www.faqs.org/docs/linux_network/x-087-2-resolv.library.html|Resolver Library]] (que faz parte da biblioteca geral do sistema, a ''LibC''), chamada pelos processos de aplicação e servidores. Essa biblioteca oferece diversas funções para resolução de nomes, das quais as mais utilizadas são: * ''gethostbyname()'': resolução direta: a partir do nome de um host, informa o seu número IP. * ''gethostbyaddress()'': resolução reversa: a partir do número IP de um host, informa seu nome. Essa biblioteca consulta a biblioteca NSS (//Name Service Switch//, que também parte da biblioteca LibC) para determinar o mecanismo a ser utilizado para a resolução de um nome. A resolução de nomes pode fazer uso de diversos mecanismos, entre os quais os mais importantes são: * ''/etc/hosts'' : esse arquivo do sistema local contém uma tabela de números IP e nomes associados. * DNS: //Domain Name System//, é o sistema de resolução de nomes da Internet. * NIS: //Network Information System//, um sistema criado pela Sun para difundir informações administrativas pela rede, como nomes de hosts, informações de usuários, etc. A figura a seguir ilustra o funcionamento básico da biblioteca //resolver//: {{ :espec:dns-resolver.png |}} ===== Name Service Switch ===== O sistema //Name Service Switch//, criado inicialmente para o Solaris, permite definir a ordem de procura de serviços para a resolução de diversos tipos de nomes em um ambiente Unix: hosts, usuários/senhas, parâmetros de rede (serviços TCP/IP, serviços RPC, etc). A configuração desse serviço é feita no arquivo ''/etc/nsswitch.conf'' ([[man-nsswitch.conf|página de manual]]), conforme indica o exemplo a seguir: # exemplo de arquivo /etc/nsswitch.conf passwd: files nis+ nis shadow: files nis+ nis group: files nis+ nis hosts: files dns ethers: files services: files A linha "''hosts''" do exemplo acima indica que a resolução de nomes de computadores deverá ser feita inicialmente via arquivos locais (''/etc/hosts'') e depois, caso o nome não tenha sido encontrado, através do serviço DNS. ===== Arquivo /etc/hosts ===== Esta forma de resolução de nome geralmente é usada para que a máquina resolva seu próprio nome e o nome da interface de //loopback// sem ter de acessar serviços de rede externos. Esse arquivo também pode ser usado, de forma limitada, para resolver nomes de máquinas quando os serviços DNS ou NIS não estiverem disponíveis. Eis um exemplo típico desse arquivo ([[man-hosts|manpage]]): # exemplo de arquivo /etc/hosts # formato: IP nome alias alias alias ... 127.0.0.1 localhost localhost.localdomain 10.26.128.139 espec.labredes # espec na rede fria 200.192.112.139 espec espec.ppgia.pucpr.br # espec na rede PUC Na plataformas Windows esse arquivo está localizado em ''c:\windows\system32\drivers\etc\hosts'' (Windows XP) ou ''c:\winnt\system32\drivers\etc\hosts'' (Windows 2K). Alguns softwares maliciosos (//trojans//) colocam informações falsas nesse arquivo, para fazer com que o usuário acesse um site malicioso acreditando ser um site confiável. Por exemplo, caso a linha a seguir seja inserida nesse arquivo, todos os acessos a ''www.google.com'' na máquina local serão direcionados para o IP 200.192.112.139: 200.192.112.139 www.google.com Por essa razão, o acesso a esse arquivo deve ser restrito ao administrador do sistema. ===== Network Information System ===== O NIS - //Network Information System// - é um sistema de difusão de informações similar ao sistema de domínios do Windows. Ele foi concebido pela Sun nos anos 80, com o nome de //Yellow Pages// (YP) e tornou-se um padrão no mundo UNIX, sendo suportado pela maioria dos sistemas. O NIS pode ser usado para difundir as seguintes informações: * Descrição de usuários e grupos, extendendo o uso dos arquivos ''/etc/passwd'', ''/etc/group'' e ''/etc/shadow''. * Nomes de computadores, como definidos no arquivo ''/etc/hosts''. * Serviços e protocolos suportados pelo sistema, como os descritos em ''/etc/services'', ''/etc/rpc'' e ''/etc/protocols''. * Informações de aliases globais de e-mail e outros, como os definidos em ''/etc/aliases''. * Parâmetros de rede, como os definidos em ''/etc/networks'', ''/etc/ethers'' e ''/etc/bootparams''. * Mapas de serviço de automontagem de diretórios remotos, como usados pelos serviços //autofs// e AMD. Os //daemons// responsáveis pelo NIS são: * ''ypserv'' : servidor NIS principal. * ''ypbind'' : cliente NIS. * ''yppasswd'' : cliente/servidor para atualizações de senhas. ===== DNS ===== O DNS (//Domain Name System//) implementa um serviço distribuído para a resolução de nomes de domínio e outras informações correlatas. Ele é estruturado na forma de um banco de dados hierárquico distribuído, onde cada servidor é responsável por manter uma tabela com os IPs e nomes dos hosts em seu sub-domínio. O serviço DNS é acessado pelos processos clientes através da biblioteca resolver. As definições contidas no arquivo ''/etc/resolv.conf'' são consultadas a para decidir qual servidor DNS deve ser usado. Eis um conteúdo típico para esse arquivo ([[man-resolv.conf|manpage]]): # exemplo de arquivo /etc/resolv.conf domain ppgia.pucpr.br nameserver 200.192.112.2 nameserver 200.192.112.3 A definição desse arquivo normalmente é suficiente para a operação de um cliente DNS.