Questo è dettato dalla configurazione NSS (Name Service Switch), cioè /etc/nsswitch.conf
hosts
del file direttiva. Ad esempio, sul mio sistema:
hosts: files mdns4_minimal [NOTFOUND=return] dns
Qui, files
si riferisce al /etc/hosts
file e dns
fa riferimento al sistema DNS. E come puoi immaginare, chi arriva per primo vince .
Inoltre, vedi man 5 nsswitch.conf
per avere più idee su questo.
Per inciso, per seguire gli ordini di risoluzione degli host NSS, usa getent
con hosts
come database, ad esempio:
getent hosts example.com
Per rispondere solo alla tua ultima domanda:/etc/hosts
non si applica di nuovo immediatamente perché firefox
sta memorizzando nella cache l'ultimo nome host ottenuto per google.com
; se vuoi che venga recuperato sempre di nuovo, dovrai impostare network.dnsCacheExpiration
a 0
in about:config
. Maggiori informazioni (anche se un po' obsolete) qui. Scusa se questo è fuori tema.
Come nota a margine, molti programmi non usano il resolver 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 poi inventare un proprio protocollo per comunicare con esso (e non entriamo nemmeno in getaddrinfo_a()
, che sta inviando un segnale al termine, quindi è anche peggio).
In secondo luogo, l'implementazione del resolver in glibc
(la libreria C standard in Linux) è orribile, si aspetta che tu lasci che estragga oggetti dinamici casuali nello spazio degli indirizzi tramite dlopen()
alle tue spalle e rendendo impossibile contenerlo in alcun modo o utilizzarlo in eseguibili collegati staticamente.
Poiché molti programmi non utilizzano direttamente il risolutore standard, non si preoccupano nemmeno di replicarne esattamente il comportamento e ignorano alcuni o tutti /etc/resolv.conf
, /etc/hosts
, /etc/nsswitch.conf
o /etc/gai.conf
.
[1] e non menzionare nemmeno gethostbyname()
non rientrante, solo ipv4 , che è stato deprecato da secoli.
Il file /etc/hosts
e il DNS non funzionano insieme. Forniscono risoluzioni indipendenti di nomi (nomi di rete).
Il collante che li unisce è all'interno di /etc/nsswitch.conf
per sistemi Linux. In /etc/netsvc.conf
per i server AIX, nel sistema per Windows e potrebbe essere elencato con lookupd -configuration
(cerca LookupOrder, simile a:Cache FF DNS NI DS
) nei sistemi MacOS.
L'ordine effettivo diventa complesso e solitamente contorto poiché 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 a 127.0.0.1:53
o ::1:53
(o entrambi)) di solito legge e include il /etc/hosts
contenuto del file. O come systemd.resolver
(un risolutore di base che dovrebbe risolvere solo nomi senza punti come mycomputer
) chiama direttamente le risoluzioni DNS per i nomi puntati (mycomputer.here.dev.
) in determinate condizioni.
In genere i servizi vengono chiamati in ordine e il primo che non fallisce vince ed è accettato come indirizzo corretto. L'ordine di base generale è:/etc/hosts
(file), mDNS (nomi senza punti), DNS, NIS, NIS+, LDAP. In alcuni sistemi Linux esiste una soluzione di ultima istanza per il computer hostname
nel servizio myhostname
Ad esempio, in questo sistema (da cat /etc/nsswitch
):
hosts: files mdns4_minimal [NOTFOUND=return] dns myhostname
Si noti che il molto vecchio (glibc 2.4 e precedenti) order
voce impostata in /etc/host.conf
come:
order hosts,bind,nis
Si applica solo ai file (file /etc/hosts
) servizio nomi.
Gli effetti su questo computer client (linux) relativi a NIS e LDAP sono (solitamente) controllati dal server DNS utilizzato (bind, unbound, ecc.).
quindi:
- Se un nome host può essere risolto in /etc/hosts, il DNS si applica dopo /etc/hosts per risolvere il nome host o trattare l'indirizzo IP risolto da /etc/hosts come un "nome host" per risolvere in modo ricorsivo?
Nessuno.
Se un nome host può essere risolto in /etc/hosts
, il DNS
non si applica (se files è prima di DNS).
né è l'indirizzo IP risolto trattato come un "nome host".
È semplicemente:l'indirizzo risolto.
browser
Un browser potrebbe utilizzare qualsiasi metodo per risolvere un nome (dopo aver controllato 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/hosts
prima di DNS
, significa che una voce in quel file avrà la precedenza su DNS
servizio di risoluzione.
Quindi:
- ... Significa che /etc/hosts sovrascrive il DNS per la risoluzione dei nomi host?
Sì (se il browser utilizza la risoluzione fornita dal sistema).
Perché
/etc/hosts
non funziona presentare nuovamente domanda, in modo che non riesca a collegarmi al sito web?
Solo fino a quando la cache interna del browser non viene cancellata (o scade il timeout) per quel nome specifico, quel nome verrà nuovamente cercato al di fuori del browser.
Se il browser ha un nome risolto nella sua cache, il browser lo utilizza di nuovo.
Usalo per svuotare la cache.
O semplicemente chiudi (aspetta qualche istante) e riavvia il browser.