W Linuksie, w jaki sposób /etc/hosts
i DNS współpracują w celu konwersji nazw hostów na adresy IP?
- jeśli nazwa hosta może zostać
/etc/hosts
rozpoznana w , to czy DNS stosuje się później/etc/hosts
do rozpoznania nazwy hosta, czy też traktuje rozstrzygnięty adres IP/etc/hosts
jako „nazwę hosta”, aby rozwiązać rekurencyjnie? 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/hosts
mogę połączyć się ze stroną internetową. Czy to oznacza, że/etc/hosts
zastępuje DNS w celu rozwiązania nazw hostów?Po ponownym dodaniu wiersza
/etc/hosts
mogę nadal łączyć się ze stroną internetową, nawet po odświeżeniu strony. Dlaczego nie/etc/hosts
złożysz ponownie, aby nie móc połączyć się z witryną?
Dzięki.
/etc/hosts
i lokalnie zdefiniowane serwery nazw. Świadectwo za pierwszym razem jest dość mylące. (Patrzę na ciebie, przeglądarki oparte na chromie!)/etc/hosts
i zdefiniowane przez system serwery DNS: ( github.com/Eloston/ungoogled-chromium ). Instalacja na MacOS z Homebrew:brew cask install eloston-chromium
.Odpowiedzi:
Jest to podyktowane konfiguracją NSS (Name Service Switch), tj
/etc/nsswitch.conf
.hosts
Dyrektywą pliku . Na przykład w moim systemie:Tutaj
files
odnosi się do/etc/hosts
pliku idns
odnosi się do systemu DNS. I jak możesz sobie wyobrazić, cokolwiek nastąpi pierwsze, wygrywa .Zobacz też,
man 5 nsswitch.conf
aby uzyskać więcej informacji na ten temat.Jak na bok, aby wykonać uporządkowania rozdzielczości gospodarz NSS, korzystanie
getent
zhosts
jak bazy danych, np:źródło
systemd.resolver
wpływa na rozdzielczości? Gdzie NIS i LDAP pasują do systemu rozdzielczości? Jaka kolejność jest zgodna z systemem MacOS lub systemem Windows ?.Aby odpowiedzieć tylko na twoje ostatnie pytanie:
/etc/hosts
nie aplikuje się od razu, ponieważfirefox
buforuje ostatnią nazwę hosta, dla której magoogle.com
; jeśli chcesz to zawsze pobrać go ponownie, będziesz musiał ustawićnetwork.dnsCacheExpiration
się0
wabout: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 togetaddrinfo_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 adresowejdlopen()
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.conf
lub/etc/gai.conf
.[1] i nawet nie wspominając o nieautententowanym, tylko ipv4
gethostbyname()
, który był przestarzały od wieków.źródło
google = GHBN("google.com"); facebook = GHBN("facebook.com")
, możesz skończyć na obugoogle
ifacebook
zawierać adresfacebook.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.gethostbyname()
teraz zastąpiło ?getaddrinfo
jest 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.Plik
/etc/hosts
i DNS nie działają razem. Zapewniają niezależne rozdzielczości nazw (nazw sieciowych).Klej, który je łączy, znajduje się wewnątrz
/etc/nsswitch.conf
systemów Linux . W/etc/netsvc.conf
przypadku serwerów AIX w systemie Windows i może być wymieniony jakolookupd -configuration
(wyszukaj LookupOrder, podobny do:)Cache FF DNS NI DS
w 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 w127.0.0.1:53
lub::1:53
(lub oba)) zwykle czyta i zawiera/etc/hosts
zawartość pliku. Lub podobnasystemd.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 komputerahostname
w serwisiemyhostname
Na przykład w tym systemie (od
cat /etc/nsswitch
):Zauważ, że bardzo stary (glibc 2.4 i wcześniejszy)
order
wpis ustawiony/etc/host.conf
jako:Dotyczy tylko
/etc/hosts
usł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:
Żaden.
Jeśli nazwa hosta może zostać rozpoznana w
/etc/hosts
,DNS
nie 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/hosts
wcześniejDNS
, oznacza to, że wpis w tym pliku będzie miał pierwszeństwo przedDNS
usługą rozstrzygania.Więc:
Tak (jeśli przeglądarka korzysta z rozdzielczości dostarczonej przez system).
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ę.
źródło