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/hosts
požá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č.