În Linux, cum se face /etc/hosts
și DNS colaborează pentru a rezolva numele de gazdă în adrese IP?
- Dacă un nume de gazdă poate fi rezolvat în
/etc/hosts
, , se aplică DNS după/etc/hosts
pentru a rezolva numele de gazdă sau tratează adresa IP rezolvată prin/etc/hosts
ca „nume de gazdă” pentru a fi rezolvată în mod recursiv? -
Î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.
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
- 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ă? – > .
- 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?. – > . - @Tim Da, browserul tău preia datele din memoria cache. – > .
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.
- Mulțumesc. Ce vrei să spui prin „non-reentrant”? – > .
- Înseamnă că, dacă faceți o
google = GHBN("google.com"); facebook = GHBN("facebook.com")
s-ar putea să sfârșești cu ambelegoogle
șifacebook
conținând adresa luifacebook.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. – > . - Ce a înlocuit
gethostbyname()
acum? – > . 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ă. – > .- Într-adevăr, Firefox și Chrome folosesc propriile rezolvări, de exemplu. Mulțumesc pentru notele pătrunzătoare. – > .
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:
- 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:
- … Î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.
/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./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.