To je dáno konfigurací NSS (Name Service Switch), tj. /etc/nsswitch.conf hosts souboru směrnice. Například v mém systému:
hosts: files mdns4_minimal [NOTFOUND=return] dns
Zde files odkazuje na /etc/hosts soubor a dns odkazuje na systém DNS. A jak si dokážete představit, vyhrává to, co přijde dříve .
Viz také man 5 nsswitch.conf abyste o tom získali více představ.
Chcete-li se řídit pořadím rozlišení hostitele NSS, použijte getent s hosts jako databáze např.:
getent hosts example.com
Chcete-li odpovědět pouze na vaši poslední otázku:/etc/hosts neplatí znovu okamžitě, protože firefox ukládá do mezipaměti poslední název hostitele, který získal pro google.com; pokud chcete, aby to vždy znovu načetlo, musíte nastavit network.dnsCacheExpiration na 0 v about:config . Více informací (i když trochu zastaralé) zde. Omlouvám se, pokud je to mimo téma.
Jako vedlejší poznámku, mnoho programů nepoužívá standardní resolver (getaddrinfo(3) , getnameinfo(3) [1]), protože je to na hovno .
Za prvé, rozhraní není asynchronní; každý středně složitý program bude muset vytvořit samostatné vlákno, které bude provádět pouze getaddrinfo() a pak vynalezl svůj vlastní protokol pro komunikaci s ním (a to ani nezadávejte do getaddrinfo_a() , který vysílá signál po dokončení, takže je to ještě horší).
Za druhé, implementace resolveru v glibc (standardní knihovna C v linuxu) je příšerná, když očekáváte, že ji necháte vytáhnout náhodné dynamické objekty do adresového prostoru přes dlopen() za vašimi zády a znemožňuje jej jakkoli obsahovat nebo používat ve staticky propojených spustitelných souborech.
Protože mnoho programů nepoužívá standardní resolver přímo, také se neobtěžují přesně replikovat jeho chování a ignorují některé nebo všechny /etc/resolv.conf , /etc/hosts , /etc/nsswitch.conf nebo /etc/gai.conf .
[1] a nezmiňujte ani nereentrantní, pouze ipv4 gethostbyname() , který byl od věků zastaralý.
Soubor /etc/hosts a DNS spolu nefungují. Poskytují nezávislé rozlišení názvů (názvů sítí).
Lepidlo, které je spojuje, je uvnitř /etc/nsswitch.conf pro linuxové systémy. V /etc/netsvc.conf pro servery AIX, v systému pro Windows a může být uveden s lookupd -configuration (vyhledejte LookupOrder, podobně jako:Cache FF DNS NI DS ) v systémech MacOS.
Skutečná objednávka se stává složitou a obvykle spletitou, protože každá služba rozlišení názvů by mohla (a často to dělá) nahlížet do jiných úrovní rozlišení. Jako dnsmasq (lehký server DNS obecně na 127.0.0.1:53 nebo ::1:53 (nebo obojí)) obvykle čte a obsahuje /etc/hosts obsah souboru. Nebo jako systemd.resolver (základní překladač, který by měl vyřešit pouze názvy bez teček jako mycomputer ) volá přímo rozlišení DNS pro názvy s tečkami (mycomputer.here.dev. ) za určitých podmínek.
Obecně platí, že služby jsou volány v pořadí a první, která neprojde, vyhrává a je akceptována jako správná adresa. Obecné základní pořadí je:/etc/hosts (soubor), mDNS (názvy bez teček), DNS, NIS, NIS+, LDAP. V některých linuxových systémech existuje poslední řešení pro počítač hostname ve službě myhostname
Například v tomto systému (od cat /etc/nsswitch ):
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname
Všimněte si, že velmi stará (glibc 2.4 a starší) order položka nastavena v /etc/host.conf jako:
order hosts,bind,nis
Platí pouze pro soubory (soubor /etc/hosts ) jmenná služba.
Účinky na tento (linuxový) klientský počítač související s NIS a LDAP jsou (obvykle) řízeny použitým DNS serverem (bind, unbound, atd.).
takže:
- Pokud lze název hostitele přeložit v /etc/hosts, použije se DNS po /etc/hosts k vyřešení názvu hostitele nebo se s IP adresou vyřešenou pomocí /etc/hosts zachází jako s "názvem hostitele" pro rekurzivní překlad?
Žádné.
Pokud lze název hostitele vyřešit v /etc/hosts , DNS neplatí (pokud jsou soubory před DNS).
ani je vyřešená IP adresa považována za "název hostitele".
Jednoduše je:vyřešená adresa.
prohlížeč
Prohlížeč může k překladu názvu použít jakoukoli metodu (poté, co zkontroluje mezipaměť přeložených názvů). Výše uvedené pořadí platí pouze v případě, že používá metodu poskytovanou systémem. Prohlížeč, stejně jako jakýkoli program, se může rozhodnout přímo kontaktovat jakýkoli server DNS.
Pokud má systémová objednávka /etc/hosts před DNS , znamená to, že záznam v tomto souboru bude mít přednost před DNS služba rozlišení.
Takže:
- ... Znamená to, že /etc/hosts přepíše DNS pro překlad názvů hostitelů?
Ano (pokud prohlížeč používá rozlišení poskytované systémem).
Proč ne
/etc/hostspožádat znovu, abych se nemohl připojit k webu?
Pouze dokud není vymazána interní mezipaměť prohlížeče (nebo vyprší časový limit) pro konkrétní název, je toto jméno znovu prohledáváno mimo prohlížeč.
Pokud má prohlížeč v mezipaměti vyřešen název, prohlížeč jej znovu použije.
Použijte toto k vymazání mezipaměti.
Nebo jednoduše zavřete (chvíli počkejte) a restartujte prohlížeč.