Como o traceroute resolve nomes?

11

Enquanto escrevia um script, quis referenciar uma máquina pelo nome do computador que eu dei (por exemplo, "selenium-rc"). Como não consegui executar ping usando "selenium-rc", tentei os seguintes comandos para verificar se o nome era reconhecido.

> traceroute 192.168.235.41
traceroute to 192.168.235.41 (192.168.235.41), 64 hops max, 52 byte packets
 1  selenium-rc (192.168.235.41)  0.545 ms  0.241 ms  0.124 ms

Ok, o traceroute "encontrou" o nome. Quão? Próximo ...

> traceroute selenium-rc
traceroute: unknown host selenium-rc

Hmm ... o mecanismo de pesquisa aqui deve ser diferente porque o host é desconhecido. Estou assumindo que isso está usando um processo de resolução de nomes de sistema, enquanto o primeiro exemplo estava usando um processo específico para rastrear. Corrigir?

Então, quando voltei um pouco mais tarde ...

> traceroute 192.168.235.41
traceroute to 192.168.235.41 (192.168.235.41), 64 hops max, 52 byte packets
 1  minint-q4e8i52.mycorp.net (192.168.235.41)  0.509 ms  0.206 ms  0.136 ms

Ok, resultado diferente. O nome "selenium-rc" não foi alterado na própria máquina, mas o processo de resolução de nomes de traceroute deve incluir algum tipo de prioridade e agora fornece um resultado presumivelmente mais autoritário atribuído por outro sistema / serviço na rede. (Infelizmente, estou assumindo que é um nome dinâmico que não controle, e, portanto, não seria útil em um script.)

Alguém pode explicar os resultados?

Keith Bentrup
fonte

Respostas:

9

Geralmente, no Linux e no Unix, o traceroute e o ping usariam uma chamada para gethostbyname () para pesquisar o nome de um sistema. O gethostbyname (), por sua vez, usa os arquivos de configuração do sistema para determinar a ordem na qual consultar os bancos de dados de nomes, ou seja: / etc / hosts e DNS.

No Linux, a ação padrão é (ou talvez costumava ser) consultar o DNS primeiro e depois o / etc / hosts. Isso pode ser alterado ou atualizado definindo a ordem desejada no /etc/host.conf.

Para pesquisar / etc / hosts antes do DNS, defina a seguinte ordem no /etc/host.conf:

order hosts,bind

No Solaris, essa mesma ordem é controlada pelo arquivo /etc/nsswitch.conf, na entrada do banco de dados hosts.

hosts: arquivos dns

Define a ordem de pesquisa para procurar em / etc / hosts antes de pesquisar no DNS.

O traceroute e o ping usariam esses métodos para pesquisar todos os bancos de dados de nomenclatura configurados. os comandos hoste nslookupusam apenas DNS, portanto não necessariamente duplicam os resultados aparentemente inconsistentes que você está vendo.

O Solaris possui uma ferramenta de pesquisa getent, que pode ser usada para identificar hosts ou endereços da mesma maneira que os traceroute e ping - seguindo o conjunto configurado de bancos de dados de nomes a serem pesquisados.

getent hosts <hostname>

pesquisaria em qualquer banco de dados listado para hosts, em /etc/nsswitch.conf.

Assim. No seu caso, para obter resultados consistentes, adicione o seguinte em / etc / hosts

192.168.235.41 selenium-rc

E verifique se o /etc/host.conf possui:

order hosts,bind

Ou verifique se /etc/nsswitch.conf possui:

hosts: files dns

Feito isso, você verá resultados mais consistentes com ping e traceroute, além de outros comandos, como ssh, telnet, curl, wget, etc.

Tim Kennedy
fonte
Quando consultei o servidor DNS listado no arquivo resolv.conf com o utilitário dig, encontrei as duas entradas. Acho que o traceroute preferia o totalmente qualificado.
precisa saber é o seguinte
2

Parece que você tem a pesquisa reversa configurada corretamente, mas não a frente.

Seu sistema pode procurar o endereço IP 192.168.235.41 e reconhecer que é selenium-rc, mas quando tenta procurá- selenium-rclo , ele falha.

Eu recomendo que você verifique /etc/hostse /etc/resolv.conf; o comportamento da getaddrinfochamada do sistema é ditado pelo último e faz referência ao primeiro.

Shadur
fonte
1

Meu palpite: invocar traceroute 192.168.235.41causou uma solicitação de DNS para encontrar o nome que acompanha o endereço IP 192.168.235.41. traceroute -n 192.168.235.41é a maneira de iniciar o traceroute sem fazer pesquisas de DNS em cada endereço IP encontrado. O servidor DNS demorou mais para responder do que o sistema DNS desejava esperar, portanto, no primeiro traceroute, não havia um nome de host para 192.168.235.41. No momento em que o traceroute envia e recebe pacotes de 192.168.235.41, seu servidor DNS respondeu, de modo que o traceroute pode fornecer um nome de host para ele.

Então, eu diria "problemas no servidor DNS", com um timing muito conveniente que o fez desconfiar de outras coisas. Pense na "Lei de Murphy" aqui. Quando você voltou um pouco mais tarde, recebeu um nome diferente para o mesmo endereço IP, o que também me faz pensar que talvez alguém estivesse mexendo com a configuração do servidor DNS durante o tempo em que estava fazendo os traceroutes.

Bruce Ediger
fonte