Как traceroute разрешает имена?

11

При написании сценария я хотел ссылаться на компьютер по имени компьютера, которое я ему дал (например, «selenium-rc»). Я не мог пропинговать его, используя «selenium-rc», поэтому я попробовал следующие команды, чтобы увидеть, было ли имя распознано.

> 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

Хорошо, traceroute "нашел" имя. Как? Следующий ...

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

Хм ... механизм поиска здесь должен быть другим, потому что хост неизвестен. Я предполагаю, что это использует процесс разрешения имен системы, тогда как первый пример использовал процесс, специфичный для traceroute. Верный?

Потом, когда я вернулся чуть позже ...

> 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

ОК, другой результат. Имя «selenium-rc» не изменилось на самой машине, но процесс разрешения имен traceroute должен включать в себя какой-то приоритет и теперь дает предположительно более авторитетный результат, назначенный другой системой / службой в сети. (К сожалению, я предполагаю, что это динамическое имя, которое я не контролирую, и поэтому оно не будет полезным в сценарии.)

Может кто-нибудь объяснить результаты?

Кит Бентруп
источник

Ответы:

9

Как правило, в Linux и Unix, traceroute и ping используют вызов gethostbyname () для поиска имени системы. gethostbyname (), в свою очередь, использует системные файлы конфигурации, чтобы определить порядок, в котором следует запрашивать базы данных имен, то есть: / etc / hosts и DNS.

В Linux действие по умолчанию (или, может быть, раньше) - сначала запрашивать DNS, а затем / etc / hosts. Это можно изменить или обновить, установив желаемый порядок в /etc/host.conf.

Для поиска / etc / hosts перед DNS установите следующий порядок в /etc/host.conf:

order hosts,bind

В Solaris этот же порядок контролируется через файл /etc/nsswitch.conf в записи для базы данных hosts.

хосты: файлы днс

Устанавливает порядок поиска в / etc / hosts перед поиском DNS.

Traceroute и ping будут использовать эти методы для поиска во всех настроенных базах имен. hostи nslookupкоманды как использование только DNS, поэтому они не обязательно будут дублировать , казалось бы , противоречивые результаты , которые вы видите.

В Solaris есть инструмент поиска getent, который можно использовать для идентификации хостов или адресов так же, как это делают traceroute и ping, следуя настроенному набору баз данных имен для поиска.

getent hosts <hostname>

будет искать в любых базах данных, перечисленных для хостов, в /etc/nsswitch.conf.

Так. В вашем случае, чтобы получить согласованные результаты, добавьте следующее в / etc / hosts

192.168.235.41 selenium-rc

И убедитесь, что /etc/host.conf имеет:

order hosts,bind

Или убедитесь, что /etc/nsswitch.conf имеет:

hosts: files dns

Как только это будет сделано, вы должны увидеть более согласованные результаты как с ping, так и с traceroute, а также с другими командами, такими как ssh, telnet, curl, wget и т. Д.

Тим Кеннеди
источник
Когда я запросил DNS-сервер, указанный в файле resolv.conf, с помощью утилиты dig, я нашел обе записи. Я думаю, traceroute предпочел полностью квалифицированный.
Кит Бентруп
2

Похоже, вы правильно настроили обратный поиск, но не вперед.

Ваша система может найти IP-адрес 192.168.235.41 и распознать, что это так selenium-rc, но когда она пытается найти, selenium-rcона не работает.

Я рекомендую вам проверить /etc/hostsи /etc/resolv.conf; Поведение getaddrinfoсистемного вызова определяется последним и ссылается на первое.

Shadur
источник
1

Мое предположение: вызов traceroute 192.168.235.41вызвал запрос DNS, чтобы найти имя, которое соответствует IP-адресу 192.168.235.41. traceroute -n 192.168.235.41способ запустить traceroute без поиска DNS по каждому найденному IP-адресу. DNS-серверу потребовалось больше времени для ответа, чем система DNS хотела ждать, поэтому сначала traceroute не дал имя хоста для 192.168.235.41. К тому времени, когда traceroute отправляет и получает пакеты от 192.168.235.41, ваш DNS-сервер уже ответил, поэтому traceroute может дать ему имя хоста.

Итак, я бы сказал, «проблемы с DNS-сервером», с очень удобным временем, которое вызывало у вас подозрения в отношении других вещей. Подумайте «Закон Мерфи» здесь. Когда вы вернулись чуть позже, вы получили другое имя для того же IP-адреса, что также заставляет меня думать, что, возможно, кто-то связывался с настройкой DNS-сервера во время выполнения ваших трассировок.

Брюс Эдигер
источник