Почему SSH не разрешает это имя хоста?

12

Когда я пытаюсь выполнить SSH к узлу в сети с именем storage, я получаю ошибку разрешения DNS:

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

Но когда я запрашиваю DNS с хоста, он работает

$ host storage
storage has address 192.168.20.103

Как это hostможет найти IP, но sshне может?

jldugger
источник
14
Начните привыкать использовать FQDN везде. Если это первая проблема, с которой вы столкнулись, вам чрезвычайно повезло. Это может быть действительно волосатым, чтобы отследить, и это не будет вашим последним. Вот подсказка: storageэто живой домен верхнего уровня в Интернете.
Майкл Хэмптон
Вы в состоянии 'ssh' к 192.168.20.103?
IvanGoneKrazy
2
Где вы определили имя хоста 192.168.20.103? / и т.д. / хосты?
Сироты
3
Печатание полных доменных имен - это боль. С другой стороны, наложение псевдонима «storage» на «storage.mydomain.com» в .ssh / config действительно удобно.
pjc50
1
@ pjc50 Я печатаю, stoа затем нажимаю клавишу Tab.
Майкл Хэмптон

Ответы:

28

sshи hostразрешать имена по совершенно разным путям, поэтому неудивительно, что они иногда дают разные результаты, особенно когда разрешаемое имя не является полным доменным именем (отсюда и предложение использовать полные доменные имена везде).

Вы ничего не упоминаете о своей ОС и конфигурации вашей системы, поэтому я должен держать это в общих чертах, ориентируясь на Linux: детали MacOS несколько отличаются, а Windows - даже больше, но общие концепции совпадают.

  • hostзапрашивает DNS, поэтому в основном он ищет /etc/resolv.confи запрашивает перечисленные там серверы, возможно, присоединяя имя домена, если имя хоста еще не полностью определено. Он игнорирует любой другой возможный источник, но имейте в виду, что в наши дни многие системы используют локальный кеширующий DNS-сервер (обычно dnsmasq), который читает /etc/hostsи другие источники перед запросом других DNS-серверов, поэтому, если hostзапросы этого локального сервера, /etc/hostsмогут появиться.

  • sshследует своим путем. Я опишу, что opensshделает под Linux, другие реализации отличаются. Сначала он ищет псевдонимы хоста, определенные в конфигурационных файлах (для всей системы /etc/ssh/ssh_configи для каждого пользователя ~/.ssh/config), затем он ищет другие источники в порядке, указанном в hosts:директиве /etc/nsswitch.conf. Скажи, что это что-то вроде:

    hosts: files dns
    

    это означает: посмотрите /etc/hostsи затем запросите DNS ( /etc/resolv.confснова). Другие возможные источники являются устаревшими nisи netinfoуслуги, LDAP, Active Directory, вы называете их.

Чтобы отладить ваш конкретный случай, вы должны следовать по пути, по которому следует ваша реализация, sshи выяснить, где он застрял.

Dario
источник
6
ltrace / strace может дать вам подсказки о том, как ssh на самом деле пытается разрешить домен ... и как это возможно, инструмент командной строки dns, вероятно, getent.
rackandboneman
Ваша рекомендация перейти /etc/nsswitch.confна чтение hosts: files dnsсработала для меня. В качестве интересного примечания я за последние несколько недель приготовил несколько Raspberry Pis с Raspian Jessie, и все они нуждались в этом изменении.
Патрик Туччи