Pourquoi SSH ne résout-il pas ce nom d'hôte?

12

Lorsque j'essaie de SSH vers un hôte sur le réseau nommé storage, j'obtiens un échec de résolution DNS:

$ ssh storage
ssh: Could not resolve hostname storage: Name or service not known

Mais quand je demande DNS avec l'hôte, cela fonctionne

$ host storage
storage has address 192.168.20.103

Comment peut-il hosttrouver l'IP mais sshne le peut pas?

jldugger
la source
14
Commencez à prendre l'habitude d'utiliser des FQDN partout. Si c'est le premier problème que vous rencontrez dans ce sens, vous avez une chance extraordinaire. Ceux-ci peuvent être vraiment poilus à retrouver, et ce ne sera pas le dernier. Voici un indice: storageest un domaine de premier niveau en direct sur Internet.
Michael Hampton
Êtes-vous en mesure de «ssh» à 192.168.20.103?
IvanGoneKrazy
2
Où avez-vous défini le nom d'hôte de 192.168.20.103? / etc / hosts?
Orphelins
3
La saisie des noms de domaine complets est une douleur. Aliasing "stockage" à "storage.mydomain.com" dans .ssh / config, d'autre part, est vraiment pratique.
pjc50
1
@ pjc50 Je tape stopuis je tape Tab.
Michael Hampton

Réponses:

28

sshet hostrésoudre les noms en suivant des chemins complètement différents, il n'est donc pas surprenant qu'ils donnent parfois des résultats différents, en particulier lorsque le nom à résoudre n'est pas un FQDN (d'où la suggestion d'utiliser des FQDN partout.)

Vous ne mentionnez rien à propos de votre système d'exploitation et de la configuration de votre système, donc je dois rester général, avec un œil sur Linux: les détails de MacOS sont quelque peu différents, et Windows encore plus, mais les concepts généraux sont les mêmes.

  • hostinterroge DNS, donc en gros, il recherche /etc/resolv.confet interroge les serveurs qui y sont répertoriés, en attachant éventuellement un nom de domaine si le nom d'hôte n'est pas déjà pleinement qualifié. Il ignore toutes les autres sources possibles, mais sachez que de nos jours, de nombreux systèmes exécutent un serveur DNS de mise en cache local (généralement dnsmasq) qui lit /etc/hostset d'autres sources avant d'interroger d'autres serveurs DNS, donc si des hostrequêtes sur ce serveur local, les résultats /etc/hostspeuvent s'introduire.

  • sshsuit son propre chemin. Je décrirai ce que opensshfait sous Linux, les autres implémentations diffèrent. Tout d'abord, il recherche les surnoms d'hôte définis dans les fichiers de configuration (à l'échelle du système /etc/ssh/ssh_configet par utilisateur ~/.ssh/config), puis il recherche d'autres sources dans l'ordre spécifié par la hosts:directive dans /etc/nsswitch.conf. Disons que c'est quelque chose comme:

    hosts: files dns
    

    cela signifie: recherchez /etc/hostspuis interrogez le DNS (à /etc/resolv.confnouveau). D'autres sources possibles sont les services obsolètes niset netinfo, LDAP, Active Directory, vous les nommez.

Pour déboguer votre cas particulier, vous devez suivre le chemin suivi par votre implémentation sshet savoir où il se bloque.

Dario
la source
6
ltrace / strace peut vous donner des conseils sur la façon dont ssh essaie réellement de résoudre le domaine ... et l'outil le plus proche de la façon dont le système le fait, l'outil DNS en ligne de commande est probablement très efficace.
rackandboneman
Votre recommandation de changer /etc/nsswitch.confpour lire a hosts: files dnsfonctionné pour moi. Juste comme une note intéressante, j'ai mis en place plusieurs Raspberry Pis avec Raspian Jessie ces dernières semaines, et ils ont tous exigé ce changement.
Patrick Tucci