У меня есть следующие /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
если вашего нет или в другом порядке, это может быть вашей проблемой.