web-dev-qa-db-fra.com

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

Sous Linux, comment /etc/hosts et DNS fonctionnent 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 traiter l'adresse IP résolue par /etc/hosts comme 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 de /etc/hosts, Je peux me connecter au site. Est-ce à dire que /etc/hosts remplace DNS pour résoudre les 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 /etc/hosts réappliquez pour ne pas pouvoir me connecter au site Web?

Merci.

10
Tim

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

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Ici, files fait référence à /etc/hosts fichier et dns fait référence au système DNS. Et comme vous pouvez l'imaginer selon la première éventualité l'emporte.

Regarde aussi man 5 nsswitch.conf pour avoir plus d'idée à ce sujet.


En passant, pour suivre les ordres de résolution de l'hôte NSS, utilisez getent avec hosts comme base de données, par exemple:

getent hosts example.com
21
heemayl

Pour répondre uniquement à votre dernière question: /etc/hosts Ne s'applique plus immédiatement car firefox met en cache le dernier nom d'hôte obtenu pour google.com; si vous voulez qu'il le récupère toujours, vous devrez définir network.dnsCacheExpiration sur 0 dans about:config. Plus d'informations (bien qu'un peu dépassées) ici . Désolé si c'est hors sujet.


En tant que note secondaire, de nombreux programmes n'utilisent pas le résolveur standard (getaddrinfo(3), getnameinfo(3) [1]) parce que il aspire .

Premièrement, l'interface n'est pas asynchrone; tout programme modérément complexe devra générer un thread séparé faisant uniquement la 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 faire il est impossible de le contenir de quelque manière que ce soit ou de l'utiliser dans des exécutables liés statiquement.

Étant donné que de nombreux programmes n'utilisent pas directement le résolveur standard, ils ne prennent pas la peine de reproduire exactement son comportement et ignorent tout ou partie de /etc/resolv.conf, /etc/hosts, /etc/nsswitch.conf ou /etc/gai.conf.

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

7
Uncle Billy

Le fichier /etc/hosts et 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.conf pour les systèmes Linux . Dans /etc/netsvc.conf pour les serveurs AIX, dans le système pour Windows et peut être répertorié avec lookupd -configuration (recherchez LookupOrder, similaire à: Cache FF DNS NI DS) dans 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/hosts contenu 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 ne manque pas gagne et est accepté comme la bonne adresse. L'ordre de base général est: /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 hostname dans le service myhostname

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

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname

Notez que la très ancienne entrée (glibc 2.4 et versions antérieures) orderdéfinie dans /etc/Host.conf comme:

order hosts,bind,nis

Appliquer uniquement aux fichiers (fichier /etc/hosts) service de noms.

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 DNS ne s'applique pas (si les fichiers se trouvent avant DNS).

ni l'adresse IP résolue n'est 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 a /etc/hosts avant DNS, cela signifie qu'une entrée dans ce fichier aura priorité sur le service de résolution DNS.

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 /etc/hosts réappliquez pour ne pas pouvoir 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.

tilisez ceci pour vider le cache .

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

6
Isaac