Jak traceroute rozpoznaje nazwy?

11

Pisząc skrypt, chciałem odwoływać się do maszyny po nazwie komputera, którą mu nadałem (np. „Selenium-rc”). Nie mogłem pingować przy użyciu „selenium-rc”, więc wypróbowałem następujące polecenia, aby sprawdzić, czy nazwa została rozpoznana.

> traceroute 192.168.235.41
traceroute to 192.168.235.41 (192.168.235.41), 64 hops max, 52 byte packets
 1  selenium-rc (192.168.235.41)  0.545 ms  0.241 ms  0.124 ms

Ok, traceroute „znalazł” nazwę. W jaki sposób? Kolejny ...

> traceroute selenium-rc
traceroute: unknown host selenium-rc

Hmm ... mechanizm wyszukiwania musi być inny, ponieważ host jest nieznany. Zakładam, że używa to procesu rozpoznawania nazw systemu, podczas gdy pierwszym przykładem był proces specyficzny dla traceroute. Poprawny?

Potem, kiedy wróciłem trochę później ...

> traceroute 192.168.235.41
traceroute to 192.168.235.41 (192.168.235.41), 64 hops max, 52 byte packets
 1  minint-q4e8i52.mycorp.net (192.168.235.41)  0.509 ms  0.206 ms  0.136 ms

Ok, inny wynik. Nazwa „selenium-rc” nie zmieniła się na samym komputerze, ale proces rozpoznawania nazwy traceroute musi obejmować pewien priorytet i teraz daje prawdopodobnie bardziej wiarygodny wynik przypisany przez inny system / usługę w sieci. (Niestety, zakładam, że jest to nazwa dynamiczna, której nie kontroluję, dlatego nie byłaby przydatna w skrypcie).

Czy ktoś może wyjaśnić wyniki?

Keith Bentrup
źródło

Odpowiedzi:

9

Ogólnie w Linuksie i Uniksie zarówno traceroute, jak i ping użyłyby wywołania gethostbyname () w celu wyszukania nazwy systemu. z kolei gethostbyname () korzysta z plików konfiguracyjnych systemu, aby określić kolejność zapytań do baz danych nazewnictwa, tj .: / etc / hosts i DNS.

W Linuksie domyślną czynnością jest (lub być może kiedyś) zapytanie najpierw do DNS, a następnie / etc / hosts. Można to zmienić lub zaktualizować, ustawiając żądaną kolejność w /etc/host.conf.

Aby wyszukać / etc / hosts przed DNS, ustaw następującą kolejność w /etc/host.conf:

order hosts,bind

W Solarisie ta sama kolejność jest kontrolowana przez plik /etc/nsswitch.conf, we wpisie bazy danych hostów.

hosts: pliki dns

Ustawia kolejność wyszukiwania w / etc / hosts przed przeszukaniem DNS.

Traceroute i ping użyłyby tych metod do przeszukania wszystkich skonfigurowanych baz danych nazewnictwa. hosti nslookuppoleceń zarówno do użytku tylko DNS, więc nie będą koniecznie powielać pozornie niespójne wyniki widzisz.

Solaris ma narzędzie wyszukiwania getent, którego można użyć do identyfikacji hostów lub adresów w taki sam sposób, jak robią to traceroute i ping - postępując zgodnie ze skonfigurowanym zestawem baz danych nazewnictwa do wyszukiwania.

getent hosts <hostname>

przeszuka wszystkie hosty na liście w /etc/nsswitch.conf.

Więc. W twoim przypadku, aby uzyskać spójne wyniki, dodaj następujące polecenie do / etc / hosts

192.168.235.41 selenium-rc

I upewnij się, że /etc/host.conf ma:

order hosts,bind

Lub upewnij się, że /etc/nsswitch.conf ma:

hosts: files dns

Gdy to zrobisz, powinieneś zobaczyć bardziej spójne wyniki zarówno z ping, jak i traceroute, a także z innymi poleceniami, takimi jak ssh, telnet, curl, wget itp.

Tim Kennedy
źródło
Kiedy zapytałem serwer DNS wymieniony w pliku resolv.conf za pomocą narzędzia dig, znalazłem oba wpisy. Chyba traceroute wolał ten w pełni wykwalifikowany.
Keith Bentrup,
2

Wygląda na to, że masz poprawnie skonfigurowane wyszukiwanie wsteczne, ale nie do przodu.

Twój system może wyszukać adres IP 192.168.235.41 i rozpoznać, że jest selenium-rc, ale próba wyszukania selenium-rckończy się niepowodzeniem.

Polecam sprawdzić /etc/hostsi /etc/resolv.conf; zachowanie getaddrinfowywołania systemowego jest podyktowane tym drugim i odnosi się do pierwszego.

Shadur
źródło
1

Zgaduję: wywołanie traceroute 192.168.235.41spowodowało, że żądanie DNS wyszło, aby znaleźć nazwę, która ma adres IP 192.168.235.41. traceroute -n 192.168.235.41to sposób na uruchomienie traceroute bez wyszukiwania DNS dla każdego znalezionego adresu IP. Serwer DNS odpowiedział dłużej niż system DNS chciał czekać, więc na początku traceroute nie podał nazwy hosta 192.168.235.41. Zanim traceroute wyśle ​​i odbierze pakiety z 192.168.235.41, twój serwer DNS odpowiedział, więc traceroute może podać dla niego nazwę hosta.

Powiedziałbym więc „problemy z serwerem DNS” z bardzo dogodnym czasem, który wzbudzał podejrzenia innych rzeczy. Pomyśl tutaj o „prawie Murphy'ego”. Gdy wrócisz nieco później, otrzymujesz inną nazwę dla tego samego adresu IP, co sprawia, że ​​myślę, że może ktoś bałaganił konfigurację serwera DNS w czasie, gdy robiłeś swoje traceroute.

Bruce Ediger
źródło