GNU/Linux >> Znalost Linux >  >> Linux

Jak `/etc/hosts` a DNS spolupracují při překladu názvů hostitelů na IP adresy?

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:

  1. 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:

  1. ... 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č.


Linux
  1. Jak migrovat server DNS BIND na nový hardware?

  2. /etc/passwd zobrazuje uživatele ve skupině, ale /etc/group nikoli

  3. Jaké je spojení mezi adresáři /etc/init.d a /etc/rcX.d v Linuxu?

  1. Jak se aktualizuje /etc/motd?

  2. Rozdíl mezi /etc/hosts a /etc/resolv.conf

  3. Jak nastavit /etc/issues, aby zobrazoval IP adresu pro eth0

  1. Ruční změny provedené v /etc/hosts nebo /etc/sysconfig/network-scripts/ifcfg-* jsou ztraceny

  2. CentOS / RHEL :Jak obnovit ze smazaného souboru /etc/passwd

  3. Příkaz grpck – Odstraňte poškozené nebo duplicitní položky v souborech /etc/group a /etc/gshadow.