W jaki sposób `/ etc / hosts` i DNS współpracują w celu konwersji nazw hostów na adresy IP?


10

W Linuksie, w jaki sposób /etc/hostsi DNS współpracują w celu konwersji nazw hostów na adresy IP?

  1. jeśli nazwa hosta może zostać /etc/hostsrozpoznana w , to czy DNS stosuje się później /etc/hosts do rozpoznania nazwy hosta, czy też traktuje rozstrzygnięty adres IP /etc/hostsjako „nazwę hosta”, aby rozwiązać rekurencyjnie?
  2. W mojej przeglądarce (Firefox i Google Chrome), gdy dodam do /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    wpisanie www.google.com w pasku adresu przeglądarki i naciśnięcie klawisza Enter nie spowoduje połączenia z witryną. Po usunięciu tej linii /etc/hostsmogę połączyć się ze stroną internetową. Czy to oznacza, że /etc/hostszastępuje DNS w celu rozwiązania nazw hostów?

    Po ponownym dodaniu wiersza /etc/hostsmogę nadal łączyć się ze stroną internetową, nawet po odświeżeniu strony. Dlaczego nie /etc/hostszłożysz ponownie, aby nie móc połączyć się z witryną?

Dzięki.


9
Uważaj, że wiele przeglądarek internetowych implementuje własne serwery DNS i pamięć podręczną DNS i nie sprawdza żadnych mechanizmów wyszukiwania nazw skonfigurowanych w systemie. Innymi słowy, niektóre przeglądarki internetowe całkowicie ignorują /etc/hostsi lokalnie zdefiniowane serwery nazw. Świadectwo za pierwszym razem jest dość mylące. (Patrzę na ciebie, przeglądarki oparte na chromie!)
Christopher

@Christopher Przybyłem tutaj, aby powiedzieć to samo. Powiązane unix.stackexchange.com/questions/363498/…
Rui F Ribeiro

@Christopher Po ponownym dodaniu wiersza do / etc / hosts nadal mogę połączyć się z witryną, nawet po odświeżeniu strony. Dlaczego / etc / hosts nie stosuje się ponownie, więc nie mogę się połączyć z witryną? Czy to z powodu pamięci podręcznej DNS przeglądarki Firefox?
Tim

@RuiFRibeiro Ta kompilacja Chromium wydaje się szanować /etc/hostsi zdefiniowane przez system serwery DNS: ( github.com/Eloston/ungoogled-chromium ). Instalacja na MacOS z Homebrew: brew cask install eloston-chromium.
Christopher

Odpowiedzi:


21

Jest to podyktowane konfiguracją NSS (Name Service Switch), tj /etc/nsswitch.conf. hostsDyrektywą pliku . Na przykład w moim systemie:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Tutaj filesodnosi się do /etc/hostspliku i dnsodnosi się do systemu DNS. I jak możesz sobie wyobrazić, cokolwiek nastąpi pierwsze, wygrywa .

Zobacz też, man 5 nsswitch.confaby uzyskać więcej informacji na ten temat.


Jak na bok, aby wykonać uporządkowania rozdzielczości gospodarz NSS, korzystanie getentz hostsjak bazy danych, np:

getent hosts example.com

Dzięki. Czy w mojej części 2 to dlatego, że serwer DNS mojej przeglądarki nie działa, ale działa pamięć podręczna DNS przeglądarki?
Tim

Jak systemd.resolverwpływa na rozdzielczości? Gdzie NIS i LDAP pasują do systemu rozdzielczości? Jaka kolejność jest zgodna z systemem MacOS lub systemem Windows ?.
Izaak

@Tim Tak, Twoja przeglądarka pobiera dane z pamięci podręcznej.
heemayl

7

Aby odpowiedzieć tylko na twoje ostatnie pytanie: /etc/hostsnie aplikuje się od razu, ponieważ firefoxbuforuje ostatnią nazwę hosta, dla której ma google.com; jeśli chcesz to zawsze pobrać go ponownie, będziesz musiał ustawić network.dnsCacheExpirationsię 0w about:config. Więcej informacji (choć nieco przestarzałe) tutaj . Przepraszam, jeśli to nie na temat.


Na marginesie, wiele programów nie używa standardowego resolvera ( getaddrinfo(3), getnameinfo(3)[1]), ponieważ jest do bani .

Po pierwsze, interfejs nie jest asynchroniczny; każdy umiarkowanie skomplikowany program będzie musiał odrodzić oddzielny wątek robiąc tylko, getaddrinfo()a następnie wynaleźć własny protokół do komunikacji z nim (i nie wchodźmy nawet w to getaddrinfo_a(), co wysyła sygnał po zakończeniu, więc jest jeszcze gorzej).

Po drugie, implementacja resolvera w glibc(standardowa biblioteka C w linuksie) jest okropna, spodziewając się, że pozwolisz wciągnąć losowe obiekty dynamiczne do przestrzeni adresowej dlopen()za twoimi plecami, uniemożliwiając jej jakiekolwiek zawarcie lub użycie w statyce powiązane pliki wykonywalne.

Ponieważ wiele programów nie używać standardowego resolverowi bezpośrednio, ale również nie przeszkadza, aby replikować jego zachowanie dokładnie i ignorować niektóre lub wszystkie /etc/resolv.conf, /etc/hosts, /etc/nsswitch.conflub /etc/gai.conf.

[1] i nawet nie wspominając o nieautententowanym, tylko ipv4 gethostbyname(), który był przestarzały od wieków.


Dzięki. Co masz na myśli mówiąc „nie-reentrant”?
Tim

1
Oznacza to, że jeśli to robisz google = GHBN("google.com"); facebook = GHBN("facebook.com"), możesz skończyć na obu googlei facebookzawierać adres facebook.com. Gdy dwa połączenia są wykonywane w różnych wątkach, jest to nawet zabawniejsze: możesz skończyć z adresem w połowie google i w połowie facebook lub kompletnym śmieciem.
Wujek Billy,

Co gethostbyname()teraz zastąpiło ?
Tim

1
getaddrinfojest standardową funkcją do tego, ale sam w sobie jest brokrn, jak już wyjaśniłem, więc nie jest używany tak jak w przeglądarkach lub innych rzeczywistych aplikacjach.
Wujek Billy,

Rzeczywiście Firefox i Chrome używają na przykład własnych rozwiązań. Dzięki za wnikliwe notatki.
Rui F Ribeiro

6

Plik /etc/hostsi DNS nie działają razem. Zapewniają niezależne rozdzielczości nazw (nazw sieciowych).

Klej, który je łączy, znajduje się wewnątrz /etc/nsswitch.confsystemów Linux . W /etc/netsvc.confprzypadku serwerów AIX w systemie Windows i może być wymieniony jako lookupd -configuration(wyszukaj LookupOrder, podobny do:) Cache FF DNS NI DSw systemach MacOS.

Rzeczywista kolejność staje się złożona i zwykle zawiłowana, ponieważ każda usługa rozpoznawania nazw może (i niejednokrotnie) zajrzeć do innych poziomów rozdzielczości. Podobnie jak dnsmasq(lekki serwer DNS zwykle w 127.0.0.1:53lub ::1:53(lub oba)) zwykle czyta i zawiera /etc/hostszawartość pliku. Lub podobna systemd.resolver(podstawowy program rozpoznawania nazw, który powinien rozpoznawać tylko nazwy bez kropek, np. mycomputer) Wywołuje bezpośrednio rezolucje DNS dla nazw kropkowanych ( mycomputer.here.dev.) pod pewnymi warunkami.

Zasadniczo usługi są wywoływane w kolejności, a pierwsza, która nie zawiedzie, wygrywa i jest akceptowana jako poprawny adres. Ogólna kolejność podstawowa to: /etc/hosts(plik), mDNS (nazwy bez kropek), DNS, NIS, NIS +, LDAP. W niektórych systemach linuxowych istnieje rozdzielczość ostateczna dla komputera hostnamew serwisiemyhostname

Na przykład w tym systemie (od cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Zauważ, że bardzo stary (glibc 2.4 i wcześniejszy) orderwpis ustawiony/etc/host.conf jako:

order hosts,bind,nis

Dotyczy tylko /etc/hostsusługi nazewnictwa plików (plików ).

Wpływ na ten (kliencki) komputer kliencki związany z NIS i LDAP jest (zwykle) kontrolowany przez używany serwer DNS (powiązanie, niezwiązany itp.).

więc:

  1. Jeśli nazwa hosta może zostać rozstrzygnięta w / etc / hosts, to czy DNS stosuje się po / etc / hosts do rozpoznania nazwy hosta, czy też traktuje rozstrzygnięty adres IP przez / etc / hosts jako „nazwę hosta”, aby rozwiązać rekurencyjnie?

Żaden.

Jeśli nazwa hosta może zostać rozpoznana w /etc/hosts, DNSnie ma zastosowania (jeśli pliki znajdują się przed DNS).

rozstrzygnięty adres IP nie jest również traktowany jako „nazwa hosta”.

To po prostu: rozstrzygnięty adres.

przeglądarka

Przeglądarka może użyć dowolnej metody do rozpoznania nazwy (po sprawdzeniu pamięci podręcznej rozpoznanych nazw). Tylko w przypadku zastosowania metody dostarczonej przez system obowiązuje powyższa kolejność. Przeglądarka, jak każdy program, może wybrać bezpośredni kontakt z dowolnym serwerem DNS.

Jeśli zamówienie systemowe miało to /etc/hostswcześniej DNS, oznacza to, że wpis w tym pliku będzie miał pierwszeństwo przed DNSusługą rozstrzygania.

Więc:

  1. ... Czy to oznacza, że ​​/ etc / hosts zastępuje DNS w celu rozwiązania nazw hostów?

Tak (jeśli przeglądarka korzysta z rozdzielczości dostarczonej przez system).

Dlaczego nie /etc/hostszłożysz ponownie, aby nie móc połączyć się z witryną?

Tylko do momentu wyczyszczenia (lub przekroczenia limitu) pamięci podręcznej przeglądarki dla tej konkretnej nazwy nazwa ta jest ponownie wyszukiwana poza przeglądarką.

Jeśli nazwa przeglądarki została rozpoznana w pamięci podręcznej, przeglądarka używa jej ponownie.

Użyj tego, aby wyczyścić pamięć podręczną .

Lub po prostu zamknij (poczekaj chwilę) i uruchom ponownie przeglądarkę.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.