Яким чином може бути те, що ssh somename працює, тоді як nslookup деяке ім'я - ні?


16

Як дізнатися IP-адресу якогось хоста, на який somenameя можу ssh? Якщо я роблю nslookupцей хост, він говорить "немає відповіді". Як потім sshвирішити це ім'я?


Ні, /etc/hostsні .ssh/configпояснення не спрацювали.


EDIT

Вибачте, somenameє повністю кваліфікованим.

ssh somename.somedomain

працює, поки

ping somename.somedomain

і

nslookup somename.somedomain

ні


12
Чи перелічено це в /etc/hostsчи ~/.ssh/config?
Стівен Кітт

1
Ім'я також може бути вирішено за допомогою mDNS (Multicast DNS) або LLMNR (Link-Local Multicast Name Resolution).
Йохан Мірен

Він може мати запис у вашому .ssh / config-файлі
Tagwint

1
@Dims Ви можете спробувати pinging 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 , багатоадресу 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рівні.

На сторінці 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здається, "вирішується" someserverім'я DNS (навіть якщо цього насправді не відбувається). Якщо файл Host someserverналаштовано у .ssh/configфайлі, то можна використовувати команду ssh саме як стан OP, навіть якщо цього someserverвзагалі немає в DNS.
Фійш

2
@ JohanMyréen Вихід від ssh -v somenameвключає IP-адресу (незалежно від ssh_configзаписів). Тож він безпосередньо відповідає на питання "Як дізнатись IP-адресу якогось хоста, якесь ім'я я можу отримати за Ssh?", А також є хорошим першим кроком до відповіді "Як це може бути, щоб ssh деяке ім'я працювало ...?".
JigglyNaga

4

Філіпа майже немає, але .ssh/configвідкидає криху, яку навряд чи ви налаштували.

Команди ...

getent hosts somename

... запитує NSS, використовуючи hosts:рядок пошуку в /etc/nsswitch.conf, а не тільки DNS, як nslookupце робиться. Можливо, ваше середовище Unix використовує більше однієї служби іменування; можливо, якийсь тип інтеграції AD.


3
Я б не сказав, що я рушив вниз по цьому маршруту. Я додав "також" для повноти.
Філіп

@PhilipCouling Впевнений, але ваше "попереднє також" є неповним - ви не показуєте, як довільно вирішити ім’я, коли питання стосується "$ речі проти nsloookup".
Багатий

3
Як уже коментується Q, hostзазвичай це частина bind-утиліти (або еквівалент) і подібно до обох nslookupі digвикористовує лише DNS. OTOH getent hosts(або можливо ahosts) робить те, що ви описуєте.
dave_thompson_085

@ dave_thompson_085 Неправильно. hostзапитує інші служби імен. Домовились, що getent hostsце найкращий однозначний метод запиту "будь-які налаштовані послуги імен".
Багатий

1
hostє лише DNS на головних сторінках і підтверджується тестуванням в системах, які я використовую (CentOS, Ubuntu, FreeBSD, Solaris), а також вище . Також дивіться (ближні) дупи, які я прокоментував Q, які також говорять про це.
dave_thompson_085
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.