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 :
- 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 :
- ... 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.