GNU/Linux >> Tutoriels Linux >  >> Linux

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

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

hosts:    files mdns4_minimal [NOTFOUND=return] dns

Ici, files fait référence au /etc/hosts fichier, et dns fait référence au système DNS. Et comme vous pouvez l'imaginer, celui qui arrive en premier gagne .

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

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

getent hosts example.com

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

En passant, de nombreux programmes n'utilisent pas le résolveur standard (getaddrinfo(3) , getnameinfo(3) [1]) parce que ça craint .

Premièrement, l'interface n'est pas asynchrone; tout programme modérément complexe devra générer un thread séparé ne faisant que 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, donc c'est encore pire).

Deuxièmement, l'implémentation du résolveur dans glibc (la bibliothèque C standard de Linux) est horrible, en s'attendant à ce que vous la laissiez tirer des objets dynamiques aléatoires dans l'espace d'adressage via dlopen() derrière votre dos, et rendant 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 se soucient pas non plus 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 mentionnez même pas le gethostbyname() non réentrant et ipv4 uniquement , qui était obsolète depuis des lustres.


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

La colle qui les relie est à l'intérieur de /etc/nsswitch.conf pour les systèmes Linux. En /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 pourrait (et le fait souvent) regarder à l'intérieur d'autres niveaux de résolution. Comme dnsmasq (un serveur DNS léger généralement au 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 sans point 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 l'emporte et est accepté comme adresse correcte. L'ordre général de base 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 le très ancien (glibc 2.4 et antérieur) order entrée définie dans /etc/host.conf comme :

order hosts,bind,nis

Ne s'applique qu'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 de manière récursive ?

Aucun.

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

ni est l'adresse IP résolue 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 des noms résolus). Ce n'est que s'il utilise une méthode fournie par le système que l'ordre indiqué ci-dessus s'applique. Le navigateur, comme tout programme, peut choisir de contacter directement n'importe quel serveur DNS.

Si la commande système a /etc/hosts avant DNS , cela signifie qu'une entrée dans ce fichier aura priorité sur DNS service de résolution.

Donc :

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

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

Pourquoi /etc/hosts ne postuler à nouveau, pour que je ne puisse pas me connecter au site ?

Ce n'est que jusqu'à ce que le cache interne du navigateur soit vidé (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 peu) et redémarrez le navigateur.


Linux
  1. Commande grpck – Supprimez les entrées corrompues ou en double dans les fichiers /etc/group et /etc/gshadow.

  2. Comment migrer un serveur DNS BIND vers un nouveau matériel ?

  3. /etc/passwd affiche l'utilisateur dans un groupe, mais /etc/group ne le fait pas

  4. Comment puis-je annuler un chmod sur le répertoire etc?

  5. comment modifier /etc/hosts à partir de scripts shell ?

La bonne façon de modifier les fichiers /etc/passwd et /etc/group sous Linux

CentOS / RHEL 7 :Comment récupérer à partir d'une entrée root supprimée dans les fichiers /etc/shadow et/ou /etc/passwd

Comprendre les fichiers /proc/mounts, /etc/mtab et /proc/partitions

Dans mon fichier /etc/hosts/ sous Linux/OSX, comment créer un sous-domaine générique ?

Différence entre /etc/hosts et /etc/resolv.conf

Comment configurer /etc/issues pour afficher l'adresse IP pour eth0