Как может быть так, что ssh somename работает, а nslookup somename - нет?

16

Как узнать IP-адрес какого-нибудь хоста, на который somenameя могу ssh? Если я делаю nslookupна этом хосте, он говорит «нет ответа». Как можно sshопределить его имя?


Ни /etc/hostsни .ssh/configобъяснения не работали.


РЕДАКТИРОВАТЬ

Извините somename, полностью квалифицирован.

ssh somename.somedomain

работает, пока

ping somename.somedomain

и

nslookup somename.somedomain

не

Dims
источник
12
Это перечислено в /etc/hostsили ~/.ssh/config?
Стивен Китт
1
Имя также может быть разрешено с использованием mDNS (Multicast DNS) или LLMNR (Link-Local Multicast Name Resolution).
Йохан Мирен
Он может иметь запись в вашем файле .ssh / config
Tagwint
1
@Dims Вы можете попробовать пинговать somename.local. .localэто специальный домен, зарезервированный для mDNS. Для LLMNR вы можете использовать этот сценарий NMAP.
Йохан Мирен
2
@ mckenzm нет, не будет.
Стивен Китт

Ответы:

31

Nslookup - это программа для запроса серверов доменных имен в Интернете . Nslookup очень хорош для запросов к DNS-серверам, но не дает полной картины, когда дело касается разрешения имен.

В Linux разрешение имен чаще всего контролируется NSS, который настраивается с помощью /etc/nsswitch.conf. В частности, эта конфигурация содержит hostsзапись. Например:

hosts:          files dns

В приведенной выше записи , которую вы можете увидеть , что первое , что нужно быть запрошены в filesследует dns, что означает , что /etc/hostsбудет запрошен перед тем DNS. Существуют и другие варианты, включая LDAP , Multicast DNS и WINS .

Отвечая на ваш вопрос напрямую, SSH разрешает имя хоста в IP-адрес, используя NSS (получение результатов из нескольких источников), где nslookup запрашивает только DNS.

Вы можете проверить, какой IP NSS разрешает имя хоста для использования getent. Например, чтобы решить somename:

getent hosts somename

Также в случае SSH вы можете настроить информацию о хосте в /etc/ssh/ssh_configи ~/.ssh/config. Это даже позволит вам указать IP-адрес для имени хоста, полностью пропуская разрешение имени.

Следующее говорит SSH использовать 192.168.1.25для обоих devи dev.example.com. SSH будет использовать этот адрес независимо от того, существуют ли эти имена как DNS-имена для другого IP:

# contents of $HOME/.ssh/config
Host dev dev.example.com
    HostName 192.168.1.25
Филип Коуллинг
источник
10

Как узнать IP-адрес какого-нибудь хоста, на который somenameя могу ssh?

Используйте подробный флаг ( -v) sshкоманды:

ssh somename -v

Вывод должен содержать, помимо прочего, строку, которая показывает разрешенный IP-адрес сервера, к которому вы подключаетесь:

debug1: Connecting to aur.archlinux.org [5.9.250.164] port 22.

Если я делаю nslookup на этом хосте, он говорит «нет ответа». Как можно sshопределить его имя?

Наиболее вероятная причина sshразрешения имени узла, которое nslookupне может быть, заключается в том, что оно настроено на sshуровне.

Per на ssh_config(5)странице руководства , есть три места , где sshсмотрит на для конфигурационных файлов:

  1. параметры командной строки
  2. файл конфигурации пользователя (~ / .ssh / config)
  3. Общесистемный файл конфигурации (/ etc / ssh / ssh_config)

Один из этих файлов может содержать ваше имя хоста somename(или соответствующий ему шаблон) в качестве псевдонима другого имени хоста или IP. Например:

# explicit alias of somename to 8.8.8.8 IP
Host somename
    HostName 8.8.8.8

# pattern alias (that obviously matches somename) to another hostname
# that is itself resolved via DNS (and that can be nslookup-ed).
Host *
    HostName anotherhostname

Пожалуйста, обратитесь к ssh_config(5)руководству на странице объяснений Hostи HostNameдиректив и к PATTERNSразделу для получения дополнительной информации.

Жюль Ламур
источник
Этот ответ не отвечает на вопрос о том, каким образом имя хоста распознается, даже если оно не является сервером DNS-сервером.
Йохан Мирен
1
В ответе правильно упоминается очень вероятный сценарий, когда ssh user@someserverкажется, что он «разрешает» someserverDNS-имя (даже если это на самом деле не происходит). Если файл Host someserverсконфигурирован в .ssh/configфайле, то можно использовать команду ssh точно в состоянии OP, даже если он someserverвообще отсутствует в DNS.
Fiisch
2
@ JohanMyréen Выходные данные ssh -v somenameвключают IP-адрес (независимо от каких-либо ssh_configзаписей). Таким образом, он напрямую отвечает на вопрос «Как узнать IP-адрес какого-либо хоста, которому я могу использовать ssh?», А также является хорошим первым шагом к ответу «Как может быть, что ssh somename работает ...?».
JigglyNaga
4

Филип почти там, но направляется вниз по склону, .ssh/configкоторый вы вряд ли настроили.

Команды ...

getent hosts somename

... запрашивает NSS, используя hosts:строку поиска в /etc/nsswitch.conf, а не только DNS, как это nslookupделает. Вероятно, ваша среда Unix использует более одной службы именования; возможно, какой-то тип интеграции AD.

Богатый
источник
3
Я бы не сказал, что уехал по этому маршруту. Я добавил «также» для полноты.
Филипп Коулинг
@PhilipCouling Конечно, но ваш «предварительный также» неполон - вы не показываете, как произвольно разрешить имя, когда вопрос о «$ thing vs. nsloookup».
Богатый
3
Как уже отмечалось в вопросе Q, hostобычно является частью bind-utils (или его эквивалентом) и похож на оба, nslookupи digиспользует только DNS. OTOH getent hosts(или, возможно, ahosts) делает то, что вы описываете.
dave_thompson_085
@ dave_thompson_085 Неверно. hostзапрашивает другие службы имен. Договорились, что getent hostsэто лучший однозначный метод для запроса «любых настроенных служб имен».
Богатый
1
hostтолько для DNS для справочных страниц и подтверждено тестированием на системах, которые я использую (CentOS, Ubuntu, FreeBSD, Solaris), а также на апстриме . Также посмотрите (близкие) дупы, которые я прокомментировал, которые также говорят это.
dave_thompson_085