Comment `/ etc / hosts` et DNS fonctionnent-ils ensemble pour résoudre les noms d'hôtes en adresses IP?

10

Sous Linux, comment /etc/hostsDNS et DNS fonctionnent-ils ensemble pour résoudre les noms d'hôtes en adresses IP?

  1. si un nom d'hôte peut être résolu dans /etc/hosts, DNS s'applique-t-il après /etc/hosts pour résoudre le nom d'hôte ou traite-t-il l'adresse IP résolue /etc/hostscomme un "nom d'hôte" à résoudre récursivement?
  2. Dans mon navigateur (Firefox et Google Chrome), lorsque j'ajoute à /etc/hosts:

    127.0.0.1 google.com www.google.com
    

    en tapant www.google.com dans la barre d'adresse des navigateurs et en appuyant sur Entrée, vous ne vous connecterez pas au site Web. Après avoir supprimé cette ligne /etc/hosts, je peux me connecter au site Web. Cela signifie-t-il que le /etc/hostsDNS remplace la résolution des noms d'hôtes?

    Après avoir rajouté la ligne à /etc/hosts, je peux toujours me connecter au site Web, même après avoir actualisé la page Web. Pourquoi ne postule-t-il pas de /etc/hostsnouveau, pour que je ne puisse pas me connecter au site Web?

Merci.

Tim
la source
9
Attention, de nombreux navigateurs Web implémentent leurs propres serveurs DNS et cache DNS et ne consultent aucun mécanisme de recherche de nom configuré sur le système. En d'autres termes, certains navigateurs Web ignorent complètement /etc/hostsles serveurs de noms définis localement. C'est assez déroutant d'être témoin la première fois. (En vous regardant, navigateurs à base de chrome!)
Christopher
@Christopher Je venais ici pour dire la même chose. Connexes unix.stackexchange.com/questions/363498/...
Rui Ribeiro F
@Christopher Après avoir rajouté la ligne à / etc / hosts, je peux toujours me connecter au site Web, même après avoir actualisé la page Web. Pourquoi / etc / hosts ne s'applique-t-il pas de nouveau, de sorte que je ne peux pas me connecter au site Web? Est-ce à cause du cache DNS de Firefox?
Tim
@RuiFRibeiro Cette version de Chromium semble respecter /etc/hostset les serveurs DNS définis par le système: ( github.com/Eloston/ungoogled-chromium ). Installation sur macOS avec Homebrew: brew cask install eloston-chromium.
Christopher

Réponses:

21

Ceci est dicté par la configuration NSS (Name Service Switch) c'est-à-dire /etc/nsswitch.confla hostsdirective du fichier . Par exemple, sur mon système:

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Ici, filesfait référence au /etc/hostsfichier et dnsfait référence au système DNS. Et comme vous pouvez l'imaginer selon la première de ces victoires .

Voir aussi man 5 nsswitch.confpour avoir plus d'idée à ce sujet.


En passant, pour suivre les ordres de résolution des hôtes NSS, utilisez getentavec hostscomme base de données, par exemple:

getent hosts example.com
heemayl
la source
Merci. Dans ma partie 2, est-ce parce que le serveur DNS de mon navigateur Web ne fonctionne pas, mais que le cache DNS de mon navigateur Web fonctionne?
Tim
Comment systemd.resolveraffecte les résolutions? Où NIS et LDAP s'intègrent-ils dans le système de résolution? Quel ordre suit un système MacOS ou un système Windows?.
Isaac
@Tim Oui, votre navigateur récupère les données du cache.
heemayl
7

Pour répondre à votre dernière question: /etc/hostsne s'applique pas de nouveau immédiatement car firefoxmet en cache le dernier nom d'hôte pour lequel il a été obtenu google.com; si vous voulez qu'il le récupère toujours, vous devrez le régler network.dnsCacheExpirationsur 0in about:config. Plus d'informations (bien qu'un peu dépassées) ici . Désolé si c'est hors sujet.


Comme note secondaire, de nombreux programmes n'utilisent pas le résolveur standard ( getaddrinfo(3), getnameinfo(3)[1]) car il est nul .

Premièrement, l'interface n'est pas asynchrone; tout programme modérément complexe devra engendrer un thread séparé faisant juste le getaddrinfo()puis inventer son propre protocole pour communiquer avec lui (et n'entrons même pas dans getaddrinfo_a(), qui envoie un signal à la fin, c'est encore pire).

Deuxièmement, l'implémentation du résolveur dans glibc(la bibliothèque C standard sous Linux) est horrible, s'attendant à ce que vous le laissiez tirer des objets dynamiques aléatoires dans l'espace d'adressage via dlopen()derrière votre dos, et qu'il soit impossible de le contenir de quelque manière que ce soit ou de l'utiliser statiquement exécutables liés.

Étant donné que de nombreux programmes n'utilisent pas le résolveur norme directement, ils ont aussi ne se soucient pas de reproduire exactement son comportement, et ignorent tout ou partie /etc/resolv.conf, /etc/hosts, /etc/nsswitch.confou /etc/gai.conf.

[1] et ne mentionne même pas le non réentrant, ipv4 uniquement gethostbyname(), qui est obsolète depuis des siècles.

Oncle Billy
la source
Merci. Que voulez-vous dire par "non réentrant"?
Tim
1
Cela signifie que si vous faites un, google = GHBN("google.com"); facebook = GHBN("facebook.com")vous pouvez vous retrouver avec les deux googleet facebookcontenir l'adresse de facebook.com. Lorsque les deux appels sont effectués dans des threads différents, c'est encore plus drôle: vous pouvez terminer avec une adresse qui est à moitié google et à moitié facebook ou des ordures complètes.
Oncle Billy
Qu'est-ce qui a remplacé gethostbyname()maintenant?
Tim
1
getaddrinfoest la fonction standard pour cela, mais elle est elle-même en panne, comme je l'ai déjà expliqué, elle n'est donc pas utilisée telle quelle par les navigateurs ou d'autres applications réelles.
Oncle Billy
En effet, Firefox et Chrome utilisent leurs propres résolutions, par exemple. Merci pour les notes perspicaces.
Rui F Ribeiro
6

Le fichier /etc/hostset le DNS ne fonctionnent pas ensemble. Ils fournissent des résolutions de noms indépendantes (noms de réseau).

La colle qui les relie est à l' intérieur /etc/nsswitch.confpour les systèmes Linux . Dans les /etc/netsvc.confserveurs AIX, dans le système pour Windows et peut être répertorié avec lookupd -configuration(recherchez LookupOrder, similaire à:) Cache FF DNS NI DSdans les systèmes MacOS.

L'ordre réel devient complexe et généralement alambiqué car chaque service de résolution de noms peut (et souvent le fait) regarder à l'intérieur d'autres niveaux de résolution. Comme dnsmasq(un serveur DNS léger généralement à 127.0.0.1:53, ou ::1:53(ou les deux)) lit et inclut généralement le /etc/hostscontenu du fichier. Ou comme systemd.resolver(un résolveur de base qui ne devrait résoudre que les noms non pointés comme mycomputer) appelle directement les résolutions DNS pour les noms pointés ( mycomputer.here.dev.) sous certaines conditions.

En général, les services sont appelés dans l'ordre et le premier qui n'échoue pas gagne et est accepté comme la bonne adresse. L'ordre de base général est le suivant: /etc/hosts(fichier), mDNS (noms sans point), DNS, NIS, NIS +, LDAP. Dans certains systèmes Linux, il existe une résolution de dernier recours pour l'ordinateur hostnamedu servicemyhostname

Par exemple, dans ce système (à partir de cat /etc/nsswitch):

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Notez que l' orderentrée très ancienne (glibc 2.4 et versions antérieures) est définie/etc/host.conf comme:

order hosts,bind,nis

Appliquer uniquement au /etc/hostsservice de noms de fichiers (fichier ).

Les effets sur cet ordinateur client (Linux) liés à NIS et LDAP sont (généralement) contrôlés par le serveur DNS utilisé (bind, unbound, etc.).

donc:

  1. Si un nom d'hôte peut être résolu dans / etc / hosts, le DNS s'applique-t-il après / etc / hosts pour résoudre le nom d'hôte ou traite-t-il l'adresse IP résolue par / etc / hosts comme un "nom d'hôte" à résoudre récursivement?

Aucun.

Si un nom d'hôte peut être résolu dans /etc/hosts, le DNSne s'applique pas (si les fichiers se trouvent avant DNS).

l'adresse IP résolue n'est pas non plus traitée comme un "nom d'hôte".

C'est simplement: l'adresse résolue.

navigateur

Un navigateur peut utiliser n'importe quelle méthode pour résoudre un nom (après avoir vérifié son cache de noms résolus). Ce n'est que s'il utilise une méthode fournie par le système que l'ordre donné ci-dessus s'applique. Le navigateur, comme tout programme, peut choisir de contacter directement n'importe quel serveur DNS.

Si l'ordre du système est /etc/hostsantérieur DNS, cela signifie qu'une entrée dans ce fichier aura priorité sur le DNSservice de résolution.

Donc:

  1. ... Cela signifie-t-il que / etc / hosts remplace DNS pour résoudre les noms d'hôtes?

Oui (si le navigateur utilise la résolution fournie par le système).

Pourquoi ne postule-t-il pas de /etc/hostsnouveau, pour que je ne puisse pas me connecter au site Web?

Ce n'est que jusqu'à ce que le cache interne du navigateur soit effacé (ou qu'il expire) pour ce nom spécifique que ce nom soit à nouveau recherché en dehors du navigateur.

Si le navigateur a un nom résolu dans son cache, le navigateur l'utilise à nouveau.

Utilisez ceci pour vider le cache .

Ou fermez simplement (attendez un moment) et redémarrez le navigateur.

Isaac
la source