Cum lucrează împreună `/etc/hosts` și DNS pentru a rezolva numele de gazdă în adrese IP? (Unix, Linux, Dns, Gazde, Rezoluție Nume Gazdă)

Tim a intrebat.

În Linux, cum se face /etc/hosts și DNS colaborează pentru a rezolva numele de gazdă în adrese IP?

  1. Dacă un nume de gazdă poate fi rezolvat în /etc/hosts, , se aplică DNS după /etc/hostspentru a rezolva numele de gazdă sau tratează adresa IP rezolvată prin/etc/hosts ca „nume de gazdă” pentru a fi rezolvată în mod recursiv?
  2. În browserul meu (firefox și google chrome), atunci când adaug la/etc/hosts:

    127.0.0.1 google.com www.google.com
    

    tastând www.google.com în bara de adrese a browserelor și apăsând enter nu se conectează la site. După ce am eliminat această linie din /etc/hosts, , mă pot conecta la site-ul web. Înseamnă că /etc/hosts prevalează asupra DNS pentru rezolvarea numelor de gazdă?

    După ce am adăugat din nou linia la /etc/hosts, , mă pot conecta în continuare la site, chiar și după ce actualizez pagina web. De ce nu/etc/hosts se aplică din nou, astfel încât să nu mă pot conecta la site-ul web?

Mulțumesc.

Comentarii

  • Aveți grijă că multe browsere web își implementează propriile servere DNS și cache DNS și nu consultă mecanismele de căutare a numelui care au fost configurate pe sistem. Cu alte cuvinte, unele browsere Web ignoră complet /etc/hosts și serverele de nume definite la nivel local. Este destul de derutant să fii martor la prima încercare. (Mă uit la voi, browsere bazate pe Chromium!) –  > Por Christopher.
  • @Christopher Veneam aici să spun același lucru. Legat de unix.stackexchange.com/questions/363498/… –  > Por Rui F Ribeiro.
  • @Christopher După ce am reintrodus linia în /etc/hosts, mă pot conecta în continuare la site, chiar și după ce am reîmprospătat pagina web. De ce nu se aplică din nou /etc/hosts, astfel încât să nu mă pot conecta la site-ul web? Este din cauza cache-ului DNS din Firefox? –  > Por Tim.
  • @RuiFRibeiro Acest build Chromium pare să respecte /etc/hosts și serverele DNS definite de sistem: (github.com/Eloston/ungoogled-chromium). Instalare pe macOS cu Homebrew: brew cask install eloston-chromium. –  > Por Christopher.
3 răspunsuri
heemayl

Acest lucru este dictat de configurația NSS (Name Service Switch), adică. /etc/nsswitch.conf fișierului hosts directivă. De exemplu, pe sistemul meu:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Aici, files se referă la /etc/hosts și dns se referă la sistemul DNS. Și, după cum vă puteți imagina oricare dintre ele vine prima câștigă.

De asemenea, consultați man 5 nsswitch.conf pentru a obține mai multe idei în acest sens.


Ca o paranteză, pentru a urma ordinea rezoluțiilor de rezoluție a gazdelor NSS, utilizați getent cu hosts ca bază de date, de exemplu:

getent hosts example.com

Comentarii

  • Mulțumesc. În partea mea 2, se datorează faptului că serverul DNS al browserului meu web nu funcționează, dar cache-ul DNS al browserului web funcționează? –  > Por Tim.
  • Cum funcționează systemd.resolver afectează rezoluțiile? Unde se încadrează NIS și LDAP în sistemul de rezoluție? Ce ordine urmează un sistem MacOS sau un sistem Windows?. –  > Por Isaac.
  • @Tim Da, browserul tău preia datele din memoria cache. –  > Por heemayl.
Unchiul Billy

Pentru a răspunde doar la ultima întrebare: /etc/hosts nu se aplică din nou imediat pentru că firefox stochează ultimul nume de gazdă pe care l-a primit pentru google.com; dacă vrei să îl recupereze întotdeauna, va trebui să setezi network.dnsCacheExpiration la 0 în about:config. Mai multe informații (deși puțin depășite) aici. Îmi pare rău dacă acest lucru este offtopic.


Ca o notă secundară, multe programe nu folosesc rezolutorul standard (getaddrinfo(3), , getnameinfo(3) [1]) deoarece este nașpa.

În primul rând, interfața nu este asincronă; orice program moderat de complex va trebui să genereze un fir de execuție separat care să facă doar operațiunea getaddrinfo() și apoi să-și inventeze propriul protocol pentru a comunica cu acesta (și să nu intrăm în getaddrinfo_a(), , care trimite un semnal la finalizare, deci este și mai rău).

În al doilea rând, implementarea rezolvatorului din glibc (biblioteca standard C în linux) este oribilă, așteptând să o lăsați să tragă obiecte dinamice aleatorii în spațiul de adrese prin intermediul dlopen() pe la spatele tău, și făcând imposibilă contenirea în vreun fel sau utilizarea acestuia în executabilele legate static.

Deoarece multe programe nu folosesc direct rezolvatorul standard, acestea nu se obosesc nici să îi reproducă exact comportamentul și ignoră unele sau toate elementele de /etc/resolv.conf, , /etc/hosts, , /etc/nsswitch.conf sau /etc/gai.conf.

[1] și nici măcar nu menționează sistemul de rezolvare non-reentrant, numai ipv4 gethostbyname(), , care a fost depreciat de mult timp.

Comentarii

  • Mulțumesc. Ce vrei să spui prin „non-reentrant”? –  > Por Tim.
  • Înseamnă că, dacă faceți o google = GHBN("google.com"); facebook = GHBN("facebook.com") s-ar putea să sfârșești cu ambele google și facebook conținând adresa lui facebook.com. Atunci când cele două apeluri sunt efectuate în fire diferite, este și mai amuzant: s-ar putea să vă treziți cu o adresă care este jumătate google și jumătate facebook sau un gunoi complet. –  > Por Unchiul Billy.
  • Ce a înlocuit gethostbyname() acum? –  > Por Tim.
  • getaddrinfo este funcția standard pentru acest lucru, dar este ea însăși stricată, așa cum am explicat deja, așa că nu este folosită ca atare de browsere sau alte aplicații din viața reală. –  > Por Unchiul Billy.
  • Într-adevăr, Firefox și Chrome folosesc propriile rezolvări, de exemplu. Mulțumesc pentru notele pătrunzătoare. –  > Por Rui F Ribeiro.
Isaac

Fișierul /etc/hosts și DNS nu funcționează împreună. Ele oferă rezoluții independente ale numelor (nume de rețea).

Lipiciul care le leagă se află în interiorul /etc/nsswitch.conf pentru sistemele linux. În /etc/netsvc.conf pentru serverele AIX, în sistemul pentru Windows și ar putea fi enumerate cu lookupd -configuration (căutați LookupOrder, similar cu: Cache FF DNS NI DS) în sistemele MacOS.

Ordinea reală devine complexă și, de obicei, complicată, deoarece fiecare serviciu de rezolvare a numelui poate (și de multe ori o face) să caute în interiorul altor niveluri de rezolvare. Cum ar fi dnsmasq (un server DNS ușor, în general la 127.0.0.1:53, , sau ::1:53 (sau ambele)) citește și include de obicei nivelul /etc/hosts conținutul fișierului. Sau ca systemd.resolver (un rezolvator de bază care ar trebui să rezolve doar nume fără puncte, cum ar fi mycomputer) apelează direct rezoluțiile DNS pentru nume cu puncte (mycomputer.here.dev.) în anumite condiții.

În general, serviciile sunt apelate în ordine, iar primul care nu dă greș câștigă și este acceptat ca adresă corectă. Ordinea generală de bază este următoarea: /etc/hosts (fișier), mDNS (nume nepunctate), DNS, NIS, NIS+, LDAP. În unele sisteme linux există o rezoluție de ultimă instanță pentru calculatorul hostname în serviciul myhostname

De exemplu, în acest sistem (de la cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Rețineți că sistemul foarte vechi (glibc 2.4 și anterioare) order intrarea setată în /etc/host.conf ca:

order hosts,bind,nis

Se aplică numai fișierelor (fișier /etc/hosts) name service.

Efectele asupra acestui computer client (linux) legate de NIS și LDAP sunt (de obicei) controlate de serverul DNS utilizat (bind, unbound etc.).

deci:

  1. Dacă un nume de gazdă poate fi rezolvat în /etc/hosts, DNS se aplică după /etc/hosts pentru a rezolva numele de gazdă sau tratează adresa IP rezolvată de /etc/hosts ca un „nume de gazdă” pentru a rezolva recursiv?

Nu.

În cazul în care un nume de gazdă poate fi rezolvat în /etc/hosts, , se va utiliza DNS nu se aplică (dacă fișierele sunt înaintea DNS).

nici adresa IP rezolvată este tratată ca un „hostname”.

Este pur și simplu: adresa rezolvată.

browser

Un browser poate utiliza orice metodă pentru a rezolva un nume (după ce a verificat memoria cache a numelor rezolvate). Numai în cazul în care utilizează o metodă furnizată de sistem, se aplică ordinea de mai sus. Browserul, ca orice program, poate alege să contacteze direct orice server DNS.

În cazul în care ordinea sistemului a /etc/hosts înainte de DNS, , înseamnă că o intrare din acel fișier va avea prioritate față de DNS serviciului de rezoluție.

Astfel:

  1. … Înseamnă că /etc/hosts prevalează asupra DNS pentru rezolvarea numelor de gazdă?

Da (în cazul în care browserul utilizează rezoluția furnizată de sistem).

De ce nu /etc/hosts se aplică din nou, astfel încât să nu mă pot conecta la site-ul web?

Numai până când memoria cache internă a browserului este ștearsă (sau se termină) pentru acel nume specific, numele respectiv este căutat din nou în afara browserului.

Dacă browserul are un nume rezolvat în memoria cache, browserul îl folosește din nou.

Pentru a șterge memoria cache, folosiți acest lucru.

Sau pur și simplu închideți (așteptați un timp) și reporniți browserul.