Назад | Перейти на главную страницу

Почему команда host не разрешает записи в / etc / hosts?

У меня есть следующие /etc/hosts файл на машине с Ubuntu 12.04

127.0.0.1 localhost
10.248.27.66 ec2-50-112-220-110.us-west-2.compute.amazonaws.com puppetmaster

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Однако команда хоста не разрешает имя puppetmaster правильно, а команда telnet делает

root@ip-10-248-34-162:/home/ubuntu# host puppetmaster
Host puppetmaster not found: 3(NXDOMAIN)

root@ip-10-248-34-162:/home/ubuntu# telnet puppetmaster 8140
Trying 10.248.27.66...
Connected to ec2-50-112-220-110.us-west-2.compute.amazonaws.com.
Escape character is '^]'.

Почему команда host не разрешает записи в / etc / hosts?

В host программа использует libresolv для прямого выполнения DNS-запроса, т. е. не использует gethostbyname.

Большинство программ при попытке подключиться к другому хосту вызывают gethostbyname системный вызов или аналогичная функция. Эта функция подчиняется конфигурации /etc/nsswitch.conf. В этом файле есть строка, которая в Ubuntu 12.04 по умолчанию имеет следующий вид:

hosts:          files mdns4_minimal [NOTFOUND=return] dns mdns4

что означает, что сначала он будет использовать /etc/hosts, а затем вернуться к запросам DNS.

Если вы хотите выполнить поиск хоста таким образом, вы можете сделать это с помощью getent hosts. Например:

$ getent hosts serverfault.com
198.252.206.16  serverfault.com

Надеюсь, это поможет.

Поскольку host Утилита - это исключительно служебная программа поиска DNS.

Большинство приложений используют вызовы библиотеки getaddrinfo или gethostbyname. Эти библиотеки опрашивают файл с именем /etc/nsswitch.conf для определения приоритета поиска и политики выполнения различных поисков.

Обычно /etc/nsswitch.conf содержит строку

hosts:        files dns

Что говорит программе сначала опросить /etc/hosts а затем опросите DNS в случае неудачи.

Поскольку хосты выполняют исключительно поиск в DNS, они не заглядывают в /etc/hosts сделать поиск.

Вы обнаружите, что dig и nslookup вести себя так же, как host.

Причина этого в том, что цель всех этих команд - выполнять поиск в DNS, а не просматривать файлы.

Большинство других программ используют преобразователь имен операционной системы, который обращается к /etc/nsswitch.conf а затем (при необходимости) /etc/resolv.conf чтобы решить, как разрешить запрашиваемое имя хоста. (Это упрощение, есть и другие варианты.) nsswitch.conf file обычно отдает приоритет локальным файлам, а не DNS.

проверьте файл /etc/nsswitch.conf и найдите строку, начинающуюся со слова "hosts"? Вы видите в этой строке слово «файлы»? Если да, то до или после слова «dns»?

В нормальной системе эта строка должна выглядеть примерно так:

hosts      files dns

если вашего нет или в другом порядке, это может быть вашей проблемой.