No Linux, como /etc/hosts
e o DNS trabalham juntos para resolver nomes de host para endereços IP?
- se um nome de host pode ser resolvido em
/etc/hosts
, o DNS se aplica depois/etc/hosts
de resolver o nome de host ou trata o endereço IP resolvido/etc/hosts
como um "nome de host" para resolver recursivamente? 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 conecta ao site. Depois de remover essa linha de
/etc/hosts
, posso me conectar ao site. Isso significa que/etc/hosts
substitui o DNS para resolver nomes de host?Depois de adicionar novamente a linha a
/etc/hosts
, ainda posso me conectar ao site, mesmo depois de atualizar a página da Web. Por que não se/etc/hosts
aplica novamente, para que eu não possa me conectar ao site?
Obrigado.
Isso é determinado pela configuração NSS (Name Service Switch), ou seja , pela diretiva
/etc/nsswitch.conf
do arquivo .hosts
Por exemplo, no meu sistema:Aqui,
files
refere-se ao/etc/hosts
arquivo edns
refere-se ao sistema DNS. E como você pode imaginar, o que vier primeiro vence .Além disso, veja
man 5 nsswitch.conf
para ter mais idéia sobre isso.Como um aparte, para seguir as ordens de resolução do host NSS, use
getent
comohosts
banco de dados, por exemplo:Para responder apenas à sua última pergunta:
/etc/hosts
não se aplica novamente imediatamente porquefirefox
está armazenando em cache o último nome de host obtido paragoogle.com
; se você quiser que ele sempre o busque novamente , você terá que definirnetwork.dnsCacheExpiration
em0
.about:config
Mais informações (embora um pouco desatualizadas) aqui . Desculpe se isso é offtopic.Como nota, muitos programas não usam o resolvedor padrão (
getaddrinfo(3)
,getnameinfo(3)
[1]) porque é uma droga .Primeiro, a interface não é assíncrona; qualquer programa moderadamente complexo terá que gerar um thread separado fazendo apenas o
getaddrinfo()
e depois inventar seu próprio protocolo para se comunicar com ele (e nem vamos entrar emgetaddrinfo_a()
, que está enviando um sinal após a conclusão, então é ainda pior).Em segundo lugar, a implementação do resolvedor em
glibc
(a biblioteca C padrão no linux) é horrível, esperando que você deixe que ele puxe objetos dinâmicos aleatórios para o espaço de endereço pordlopen()
trás de suas costas, e tornando impossível contê-lo de qualquer maneira ou usá-lo estaticamente executáveis vinculados.Como muitos programas não usam o resolvedor padrão diretamente, eles também não se preocupam em replicar seu comportamento exatamente e ignoram alguns ou todos os
/etc/resolv.conf
, ou ./etc/hosts
/etc/nsswitch.conf
/etc/gai.conf
[1] e nem mencione o não-reentrante, somente ipv4
gethostbyname()
, que foi preterido há muito tempo.O arquivo
/etc/hosts
e 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.conf
para sistemas linux . Em/etc/netsvc.conf
para servidores AIX, no sistema para Windows e pode ser listado comlookupd -configuration
(procure por LookupOrder, semelhante a:Cache FF DNS NI DS
) em sistemas MacOS.A ordem real torna-se complexa e geralmente complicada, pois cada serviço de resolução de nomes pode (e muitas vezes o faz) examinar outros níveis de resolução. Como
dnsmasq
(um servidor DNS leve geralmente em127.0.0.1:53
, ou::1:53
(ou ambos)) geralmente lê e inclui o/etc/hosts
conteúdo do arquivo. Ou comosystemd.resolver
(um resolvedor básico que deve resolver apenas nomes sem ponto comomycomputer
) chama diretamente as resoluções de DNS para nomes com ponto (mycomputer.here.dev.
) sob algumas condições.Em geral, os serviços são chamados em ordem e o primeiro que não falhar ganha e é aceito como o endereço correto. A ordem básica geral é:
/etc/hosts
(arquivo), mDNS (nomes sem pontos), DNS, NIS, NIS+, LDAP. Em alguns sistemas Linux existe uma resolução de último recurso para o computadorhostname
no serviçomyhostname
Por exemplo, neste sistema (de
cat /etc/nsswitch
):Observe que a
order
entrada muito antiga (glibc 2.4 e anterior) definida/etc/host.conf
como:Aplica-se apenas ao serviço de nomes de arquivos (arquivo
/etc/hosts
).Os efeitos neste computador cliente (linux) relacionados ao NIS e ao LDAP são (geralmente) controlados pelo servidor DNS usado (vincular, desvinculado, etc.).
assim:
Nenhum.
Se um nome de host puder ser resolvido em
/etc/hosts
, oDNS
não se aplicará (se os arquivos forem 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 usar um método fornecido pelo sistema, a ordem dada acima se aplica. O navegador, como qualquer programa, pode optar por entrar em contato diretamente com qualquer servidor DNS.
Se a ordem do sistema tiver
/etc/hosts
antesDNS
, significa que uma entrada nesse arquivo terá precedência aoDNS
serviço de resolução.Então:
Sim (se o navegador usar a resolução fornecida pelo sistema).
Somente até que o cache interno do navegador seja limpo (ou expire) para esse nome específico, esse nome será pesquisado fora do navegador novamente.
Se o navegador tiver um nome resolvido em seu cache, o navegador o usará novamente.
Use isso para limpar o cache .
Ou simplesmente feche (espere um pouco) e reinicie o navegador.