In che modo `/ etc / hosts` e DNS collaborano per risolvere i nomi host in indirizzi IP?


10

In Linux, come /etc/hostscollaborano DNS e DNS per risolvere i nomi host in indirizzi IP?

  1. se è possibile risolvere un nome host /etc/hosts, il DNS si applica dopo /etc/hosts per risolvere il nome host o trattare l'indirizzo IP risolto /etc/hostscome un "nome host" da risolvere in modo ricorsivo?
  2. Nel mio browser (Firefox e Google Chrome), quando aggiungo a /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    digitando www.google.com nella barra degli indirizzi dei browser e premendo Invio non si collegherà al sito Web. Dopo aver rimosso quella linea /etc/hosts, posso collegarmi al sito Web. Significa che /etc/hostssovrascrive DNS per la risoluzione dei nomi host?

    Dopo aver aggiunto nuovamente la linea a /etc/hosts, posso ancora collegarmi al sito Web, anche dopo aver aggiornato la pagina Web. Perché non si /etc/hostsapplica di nuovo, quindi non riesco a collegarmi al sito Web?

Grazie.


9
Attenzione che molti browser Web implementano i propri server DNS e cache DNS e non consultano alcun meccanismo di ricerca dei nomi configurato sul sistema. In altre parole, alcuni browser Web ignorano completamente /etc/hostsi server dei nomi definiti localmente. È abbastanza confuso assistere alla prima volta. (Guardandoti, browser basati su Chromium!)
Christopher,

@Christopher Stavo venendo qui per dire la stessa cosa. Correlati unix.stackexchange.com/questions/363498/…
Rui F Ribeiro

@Christopher Dopo aver aggiunto nuovamente la linea a / etc / hosts, posso ancora collegarmi al sito Web, anche dopo aver aggiornato la pagina web. Perché / etc / hosts non si applica di nuovo, quindi non riesco a collegarmi al sito Web? È a causa della cache DNS di Firefox?
Tim

@RuiFRibeiro Questa build di Chromium sembra rispettare /etc/hostse i server DNS definiti dal sistema: ( github.com/Eloston/ungoogled-chromium ). Installazione su MacOS con Homebrew: brew cask install eloston-chromium.
Christopher,

Risposte:


21

Ciò è dettato dalla configurazione NSS (Name Service Switch), ovvero /etc/nsswitch.confdalla hostsdirettiva del file . Ad esempio, sul mio sistema:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Qui, si filesriferisce al /etc/hostsfile e dnsal sistema DNS. E come puoi immaginare, qualunque sia la prima vittoria vince .

Inoltre, vedi man 5 nsswitch.confper avere più idea su questo.


A parte questo, per seguire gli ordini di risoluzione dell'host NSS, utilizzare getentcon hostscome database, ad esempio:

getent hosts example.com

Grazie. Nella mia parte 2, è perché il server DNS del mio browser non funziona, ma la cache DNS del browser funziona?
Tim

In che modo systemd.resolverinfluisce sulle risoluzioni? Dove si inseriscono NIS e LDAP nel sistema di risoluzione? Quale ordine segue un sistema MacOS o un sistema Windows ?.
Isaac,

@Tim Sì, il browser sta recuperando i dati dalla cache.
Hememl

7

Per rispondere solo alla tua ultima domanda: /etc/hostsnon si applica di nuovo immediatamente perché firefoxsta memorizzando nella cache l'ultimo nome host per cui ha ottenuto google.com; se si vuole recuperare sempre di nuovo, dovrete impostato network.dnsCacheExpirationa 0in about:config. Maggiori informazioni (anche se un po 'obsolete) qui . Mi dispiace se questo è offtopico.


Come sidenote, molti programmi non usano il risolutore standard ( getaddrinfo(3), getnameinfo(3)[1]) perché fa schifo .

Innanzitutto, l'interfaccia non è asincrona; qualsiasi programma moderatamente complesso dovrà generare un thread separato facendo solo il getaddrinfo()e quindi inventare il proprio protocollo per comunicare con esso (e non entriamo nemmeno in getaddrinfo_a(), che sta inviando un segnale al completamento, quindi è anche peggio).

In secondo luogo, l'implementazione del risolutore in glibc(la libreria C standard in linux) è orribile, aspettandosi che tu lasci trascinare oggetti dinamici casuali nello spazio degli indirizzi da dlopen()dietro la schiena, e rendendo impossibile contenerlo in alcun modo o usarlo in modo statico eseguibili collegati.

Dal momento che molti programmi non utilizzano direttamente il risolutore di serie, ma anche non si preoccupano di replicare il suo comportamento esattamente, e ignorano tutto o in parte /etc/resolv.conf, /etc/hosts, /etc/nsswitch.confo /etc/gai.conf.

[1] e non menzioniamo nemmeno il non rientrante, solo ipv4 gethostbyname(), che è stato deprecato da secoli.


Grazie. Cosa intendi con "non rientrante"?
Tim

1
Vuol dire che se lo stai facendo google = GHBN("google.com"); facebook = GHBN("facebook.com")potresti finire con entrambi googlee facebookcontenere l'indirizzo di facebook.com. Quando le due chiamate vengono fatte in thread diversi, è ancora più divertente: potresti finire con un indirizzo che è metà google e metà facebook o spazzatura completa.
Zio Billy,

Cosa ha sostituito gethostbyname()ora?
Tim

1
getaddrinfoè la funzione standard per questo, ma è di per sé brokrn, come ho già spiegato, quindi non viene utilizzato come lo è dai browser o da altre app nella vita reale.
Zio Billy,

In effetti firefox e Chrome usano le proprie risoluzioni, per esempio. Grazie per le note perspicaci.
Rui F Ribeiro,

6

Il file /etc/hostse il DNS non funzionano insieme. Forniscono risoluzioni indipendenti di nomi (nomi di rete).

La colla che li collega è dentro /etc/nsswitch.confper i sistemi linux . In /etc/netsvc.confper server AIX, nel sistema per Windows e potrebbe essere elencato con lookupd -configuration(cerca LookupOrder, simile a:) Cache FF DNS NI DSnei sistemi MacOS.

L'ordine reale diventa complesso e solitamente contorto come ogni servizio di risoluzione dei nomi potrebbe (e molte volte lo fa) guardare all'interno di altri livelli di risoluzione. Come dnsmasq(un server DNS leggero generalmente in 127.0.0.1:53, o ::1:53(o entrambi)) di solito legge e include il /etc/hostscontenuto del file. O come systemd.resolver(un risolutore di base che dovrebbe risolvere solo nomi non puntati come mycomputer) chiama direttamente le risoluzioni DNS per i nomi punteggiati ( mycomputer.here.dev.) in alcune condizioni.

In generale, i servizi vengono chiamati in ordine e il primo che non fallisce vince e viene accettato come indirizzo corretto. L'ordine di base generale è: /etc/hosts(file), mDNS (nomi non punteggiati), DNS, NIS, NIS +, LDAP. In alcuni sistemi Linux esiste un'ultima risorsa per il computer hostnamenel serviziomyhostname

Ad esempio, in questo sistema (da cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Si noti che le persone molto anziane (glibc 2.4 e precedenti) orderdi entrata insieme a/etc/host.conf come:

order hosts,bind,nis

Si applica solo al /etc/hostsservizio di nomi file (file ).

Gli effetti su questo computer client (linux) relativi a NIS e LDAP sono (generalmente) controllati dal server DNS utilizzato (bind, unbound, ecc.).

così:

  1. Se un nome host può essere risolto in / etc / hosts, DNS si applica dopo / etc / hosts per risolvere il nome host o considera l'indirizzo IP risolto da / etc / hosts come un "nome host" da risolvere in modo ricorsivo?

Nessuna.

Se è possibile risolvere un nome host /etc/hosts, DNSnon si applica (se i file sono precedenti a DNS).

l'indirizzo IP risolto viene trattato come un "nome host".

È semplicemente: l'indirizzo risolto.

del browser

Un browser potrebbe utilizzare qualsiasi metodo per risolvere un nome (dopo aver verificato la cache dei nomi risolti). Solo se utilizza un metodo fornito dal sistema si applica l'ordine sopra indicato. Il browser, come qualsiasi programma, potrebbe scegliere di contattare direttamente qualsiasi server DNS.

Se l'ordine di sistema ha /etc/hostsprima DNS, significa che una voce in quel file avrà la precedenza sul DNSservizio di risoluzione.

Così:

  1. ... Significa che / etc / hosts ha la precedenza su DNS per la risoluzione dei nomi host?

Sì (se il browser utilizza la risoluzione fornita dal sistema).

Perché non si /etc/hostsapplica di nuovo, quindi non riesco a collegarmi al sito Web?

Solo fino a quando la cache interna del browser non viene svuotata (o scade) per quel nome specifico, quel nome viene cercato nuovamente al di fuori del browser.

Se il browser ha un nome risolto nella sua cache, il browser lo utilizza nuovamente.

Usa questo per cancellare la cache .

O semplicemente chiudi (attendi qualche istante) e riavvia il browser.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.