Como o `/ etc / hosts` e o DNS trabalham juntos para resolver nomes de host para endereços IP?

10

No Linux, como o /etc/hostsDNS trabalha em conjunto para resolver nomes de host para endereços IP?

  1. se um nome de host puder ser resolvido /etc/hosts, o DNS será aplicado depois /etc/hosts para resolver o nome do host ou tratar o endereço IP resolvido /etc/hostscomo um "nome do host" para resolver recursivamente?
  2. No meu navegador (firefox e google chrome), quando adiciono a /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    digitar www.google.com na barra de endereços dos navegadores e pressionar Enter não se conectará ao site. Depois de remover essa linha /etc/hosts, posso me conectar ao site. Isso significa que /etc/hostssubstitui o DNS para resolver nomes de host?

    Depois de adicionar novamente a linha /etc/hosts, ainda consigo conectar-me ao site, mesmo depois de atualizar a página. Por que não se /etc/hostsaplica novamente, para que eu não consiga me conectar ao site?

Obrigado.

Tim
fonte
9
Observe que muitos navegadores da Web implementam seus próprios servidores DNS e cache DNS e não consultam nenhum mecanismo de pesquisa de nome que tenha sido configurado no sistema. Em outras palavras, alguns navegadores da Web ignoram completamente /etc/hostse os servidores de nomes definidos localmente. É bastante confuso testemunhar a primeira vez. (Olhando para você, navegadores baseados no Chromium!) #
1010 Christopher Christopher
@ Christopher, eu estava vindo aqui para dizer a mesma coisa. Relacionados unix.stackexchange.com/questions/363498/...
Rui F Ribeiro
@Christopher Depois de adicionar a linha novamente ao / etc / hosts, ainda posso conectar-me ao site, mesmo depois de atualizar a página da web. Por que o / etc / hosts não se aplica novamente, para que eu não consiga me conectar ao site? É por causa do cache DNS do Firefox?
Tim
@RuiFRibeiro Esta versão do Chromium parece respeitar /etc/hostse os servidores DNS definidos pelo sistema: ( github.com/Eloston/ungoogled-chromium ). Instalação em MacOS com Homebrew: brew cask install eloston-chromium.
28419 Christopher

Respostas:

21

Isso é ditado pela configuração do NSS (Name Service Switch), ou seja, /etc/nsswitch.confpela hostsdiretiva do arquivo . Por exemplo, no meu sistema:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Aqui, filesrefere-se ao /etc/hostsarquivo e dnsrefere-se ao sistema DNS. E como você pode imaginar, o que ocorrer primeiro .

Além disso, veja man 5 nsswitch.confpara ter mais idéia sobre isso.


Como um aparte, a seguir as ordenações resolução anfitrião NSS, o uso getentcom hostsa base de dados, por exemplo:

getent hosts example.com
heemail
fonte
Obrigado. Na parte 2, é porque o servidor DNS do meu navegador não funciona, mas o cache DNS do navegador funciona?
Tim
Como systemd.resolverafeta as resoluções? Onde o NIS e o LDAP se encaixam no sistema de resolução? Que ordem segue um sistema MacOS ou Windows ?.
Isaac
@ Tim Sim, seu navegador está buscando os dados do cache.
heemayl
7

Para responder apenas à sua última pergunta: /etc/hostsnão se aplica novamente imediatamente, porque firefoxestá armazenando em cache o último nome de host que recebeu google.com; se você quer que ele sempre buscá-la novamente, você tem que definir network.dnsCacheExpirationa 0no about:config. Mais informações (embora um pouco desatualizadas) aqui . Desculpe se isso é offtopic.


Como nota de rodapé, muitos programas não usam o resolvedor padrão ( getaddrinfo(3), getnameinfo(3)[1]) porque é péssimo .

Primeiro, a interface não é assíncrona; qualquer programa moderadamente complexo terá que gerar um encadeamento separado, fazendo exatamente o mesmo, getaddrinfo()e então inventar seu próprio protocolo para se comunicar com ele (e nem vamos entrar getaddrinfo_a(), o que está enviando um sinal após a conclusão, por isso é ainda pior).

Segundo, a implementação do resolvedor glibc(a biblioteca C padrão no linux) é horrível, esperando que você permita que ele puxe objetos dinâmicos aleatórios para o espaço de endereço dlopen()nas suas costas e torne impossível contê-lo de qualquer forma ou usá-lo estaticamente executáveis ​​vinculados.

Uma vez que muitos programas não usam o resolvedor padrão diretamente, eles também não se preocupam em replicar seu comportamento exatamente, e ignorar algumas ou todas /etc/resolv.conf, /etc/hosts, /etc/nsswitch.confou /etc/gai.conf.

[1] e nem mencione o não-reentrante, somente ipv4 gethostbyname(), que foi descontinuado desde as idades.

Tio Billy
fonte
Obrigado. O que você quer dizer com "não reentrante"?
Tim
1
Isso significa que, se você estiver fazendo um, google = GHBN("google.com"); facebook = GHBN("facebook.com")pode acabar com os dois googlee facebookcom o endereço de facebook.com. Quando as duas chamadas são feitas em segmentos diferentes, é ainda mais engraçado: você pode terminar com um endereço que é metade do google e meio do facebook ou lixo completo.
Tio Billy
O que substituiu gethostbyname()agora?
Tim
1
getaddrinfoé a função padrão para isso, mas é em si brokrn, como já expliquei, portanto não é usada como é por navegadores ou outros aplicativos da vida real.
Tio Billy
De fato, o Firefox e o Chrome usam suas próprias resoluções, por exemplo. Obrigado pelas notas perspicazes.
Rui F Ribeiro
6

O arquivo /etc/hostse o DNS não funcionam juntos. Eles fornecem resoluções independentes de nomes (nomes de rede).

A cola que os liga está dentro /etc/nsswitch.confdos sistemas Linux . Nos /etc/netsvc.confservidores AIX, no sistema para Windows e pode ser listado com lookupd -configuration(procure LookupOrder, semelhante a:) Cache FF DNS NI DSnos sistemas MacOS.

A ordem real se torna complexa e geralmente complicada, pois cada serviço de resolução de nomes pode (e muitas vezes o faz) procurar dentro de outros níveis de resolução. Like dnsmasq(um servidor DNS leve geralmente em 127.0.0.1:53, ou ::1:53(ou ambos)) geralmente lê e inclui o /etc/hostsconteúdo do arquivo. Ou like systemd.resolver(um resolvedor básico que só deve resolver nomes não pontilhados como mycomputer) chama diretamente resoluções DNS para nomes pontilhados ( mycomputer.here.dev.) sob algumas condições.

Em geral, os serviços são chamados em ordem e o primeiro que não falha ganha e é aceito como o endereço correto. A ordem básica geral é: /etc/hosts(arquivo), mDNS (nomes não pontilhados), DNS, NIS, NIS +, LDAP. Em alguns sistemas Linux, há uma resolução de último recurso para o computador hostnameno serviçomyhostname

Por exemplo, neste sistema (de cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Note-se que os muito idosos (glibc 2.4 e anteriores) orderentrada set em/etc/host.conf como:

order hosts,bind,nis

Aplique apenas ao /etc/hostsserviço de nomes de arquivos (arquivo ).

Os efeitos neste computador cliente (linux) relacionados ao NIS e LDAP são (geralmente) controlados pelo servidor DNS usado (ligação, não acoplada etc.).

tão:

  1. Se um nome de host puder ser resolvido em / etc / hosts, o DNS será aplicado após / etc / hosts para resolver o nome do host ou tratar o endereço IP resolvido por / etc / hosts como um "nome de host" para resolver recursivamente?

Nenhum.

Se um nome de host puder ser resolvido /etc/hosts, DNSele não se aplicará (se os arquivos estiverem antes do DNS).

nem o endereço IP resolvido é tratado como um "nome de host".

Simplesmente é: o endereço resolvido.

navegador

Um navegador pode usar qualquer método para resolver um nome (depois de verificar seu cache de nomes resolvidos). Somente se ele usar um método fornecido pelo sistema, a ordem fornecida acima será aplicada. O navegador, como qualquer programa, pode optar por entrar em contato diretamente com qualquer servidor DNS.

Se a ordem do sistema já tiver sido feita /etc/hostsanteriormente DNS, isso significa que uma entrada nesse arquivo terá precedência no DNSserviço de resolução.

Assim:

  1. ... Isso significa que / etc / hosts substitui o DNS para resolver nomes de host?

Sim (se o navegador usar o sistema fornecido com resolução).

Por que não se /etc/hostsaplica novamente, para que eu não consiga me conectar ao site?

Somente até o cache interno do navegador ser limpo (ou atingir o tempo limite) para esse nome específico, esse nome será pesquisado fora do navegador novamente.

Se o navegador tiver um nome resolvido em seu cache, ele o utilizará novamente.

Use isso para limpar o cache .

Ou simplesmente feche (espere um pouco) e reinicie o navegador.

Isaac
fonte