Jak to możliwe, że nazwa ssh działa, a nazwa nslookup nie?


16

Jak poznać adres IP jakiegoś hosta somename, na którym mogę ssh? Jeśli zrobię to nslookupna tym hoście, powie „nie ma odpowiedzi”. Jak zatem sshrozwiązać jego nazwę?


Ani wyjaśnienie /etc/hostsnie .ssh/configzadziałało.


EDYTOWAĆ

Przepraszamy, somenamejest w pełni wykwalifikowany.

ssh somename.somedomain

działa, podczas gdy

ping somename.somedomain

i

nslookup somename.somedomain

nie


12
Czy jest wymieniony w /etc/hostslub ~/.ssh/config?
Stephen Kitt

1
Nazwę można również rozwiązać za pomocą mDNS (Multicast DNS) lub LLMNR (Link-Local Multicast Name Resolution).
Johan Myréen,

Może mieć wpis w pliku .ssh / config
Tagwint

1
@Dims Możesz spróbować pingować somename.local. .localto specjalna domena zarezerwowana dla mDNS. W przypadku LLMNR możesz użyć tego skryptu NMAP.
Johan Myréen,

2
@mckenzm nie, nie będzie.
Stephen Kitt

Odpowiedzi:


31

Nslookup to program do sprawdzania serwerów nazw domen internetowych . Nslookup jest bardzo dobry do wysyłania zapytań do serwerów DNS, ale nie daje pełnego obrazu, jeśli chodzi o rozpoznawanie nazw.

W systemie Linux rozpoznawanie nazw jest najczęściej kontrolowane przez NSS, który jest konfigurowany przez /etc/nsswitch.conf. W szczególności ta konfiguracja zawiera hostswpis. Na przykład:

hosts:          files dns

W powyższym wpisie widać, że po pierwszym pytaniu filesnastępuje zapytanie dns, co oznacza, że /etc/hostszostanie ono wysłane przed DNS. Istnieją inne opcje, w tym LDAP , Multicast DNS i WINS .

Odpowiadając bezpośrednio na twoje pytanie, SSH przekształca nazwę hosta na adres IP za pomocą NSS (pobieranie wyników z wielu źródeł), gdzie nslookup tylko wysyła zapytanie do DNS.

Możesz sprawdzić, który IP NSS rozpoznaje nazwę hosta za pomocą getent. Na przykład, aby rozwiązać somename:

getent hosts somename

Również w przypadku SSH możesz skonfigurować informacje specyficzne dla hosta w /etc/ssh/ssh_configi ~/.ssh/config. Pozwoli to nawet określić adres IP dla nazwy hosta, całkowicie pomijając rozpoznawanie nazw .:

Następujące polecenie SSH do użycia 192.168.1.25zarówno dla, jak devi dla dev.example.com. SSH użyje tego adresu, niezależnie od tego, czy te nazwy istnieją jako nazwy DNS dla innego adresu IP:

# contents of $HOME/.ssh/config
Host dev dev.example.com
    HostName 192.168.1.25

10

Jak poznać adres IP jakiegoś hosta somename, na którym mogę ssh?

Użyj pełnej flagi ( -v) sshpolecenia:

ssh somename -v

Dane wyjściowe powinny zawierać między innymi wiersz pokazujący rozstrzygnięty adres IP serwera, z którym się łączysz:

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

Jeśli nslookup na tym hoście, to powie „brak odpowiedzi”. Jak zatem sshrozwiązać jego nazwę?

Najbardziej prawdopodobną przyczyną sshrozwiązania nazwy hosta, która nslookupnie może tego zrobić, jest to, że jest ona skonfigurowana na sshpoziomie.

Na stronie ssh_config(5)podręcznika są trzy miejsca, w których sshszuka się plików konfiguracyjnych:

  1. opcje wiersza poleceń
  2. plik konfiguracyjny użytkownika (~ / .ssh / config)
  3. ogólnosystemowy plik konfiguracyjny (/ etc / ssh / ssh_config)

Jeden z tych plików może zawierać nazwę hosta somename(lub pasujący do niego wzorzec) jako alias innej nazwy hosta lub adresu IP. Na przykład:

# 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

Więcej informacji można znaleźć w ssh_config(5)objaśnieniach Hosti HostNamedyrektywach podręcznika oraz w PATTERNSsekcji.


Ta odpowiedź nie odpowiada na pytanie, w jaki sposób rozpoznawana jest nazwa hosta, nawet jeśli nie jest to serwer DNS.
Johan Myréen,

1
Odpowiedź poprawnie wymienia bardzo prawdopodobny scenariusz, w którym ssh user@someserverwydaje się, że „rozwiązuje” someservernazwę DNS (nawet jeśli tak się nie dzieje). Jeśli plik Host someserverjest skonfigurowany w .ssh/configpliku, wówczas możliwe jest użycie polecenia ssh dokładnie tak, jak podaje OP, nawet jeśli w someserverogóle nie ma go w DNS.
Fiisch

2
@ JohanMyréen Dane wyjściowe ssh -v somenameobejmują adres IP (niezależnie od ssh_configwpisów). Odpowiada więc bezpośrednio na pytanie „Jak poznać adres IP jakiejś nazwy hosta, do którego mogę ssh?”, A także jest dobrym pierwszym krokiem do odpowiedzi „Jak to możliwe, że sshame działa…?”.
JigglyNaga

4

Philip już prawie tam jest, ale udaje się w dół .ssh/configrathole, którego skonfigurowanie jest mało prawdopodobne.

Polecenia ...

getent hosts somename

... wysyła zapytanie do NSS przy użyciu hosts:linii wyszukiwania /etc/nsswitch.conf, a nie tylko DNS nslookup. Prawdopodobnie twoje środowisko Unix korzysta z więcej niż jednej usługi nazewnictwa; ewentualnie jakiś rodzaj integracji AD.


3
Nie powiedziałbym, że poszedłem tą drogą. Dodałem „również” dla kompletności.
Philip Couling,

@PhilipCouling Pewnie, ale twoje „przed-również” jest niepełne - nie pokazujesz, jak arbitralnie rozwiązać nazwę, gdy pytanie dotyczy „$ rzecz kontra nsloookup”.
Bogaty

3
Jak już skomentowano na Q, hostzwykle jest częścią bind-utils (lub odpowiednikiem) i podobnie jak oba nslookupi digużywa tylko DNS. OTOH getent hosts(lub ewentualnie ahosts) robi to, co opisujesz .
dave_thompson_085

@ dave_thompson_085 Niepoprawnie. hostodpytuje inne usługi nazewnicze. Uzgodniono, że getent hostsjest to najlepsza jednoznaczna metoda zapytania „dowolnych skonfigurowanych usług nazw”.
Bogaty

1
hostjest tylko DNS na stronach podręcznika i potwierdzony przez testy na systemach, których używam (CentOS, Ubuntu, FreeBSD, Solaris), a także na wyższym poziomie . Zobacz także (bliskie) duplikaty, które skomentowałem na Q, które również to mówią.
dave_thompson_085
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.