Утилита host

Эта статья расскажет вам о команде host. Утилита host предназначена для выполнения запросов к DNS-серверам.

[Алексей Выскубов]

Эта статья расскажет вам о команде host.

Примеры работы приводятся в операционных системах Linux 2.2.17 (Debian unstable, "woody") и FreeBSD 4.2.

Утилита host предназначена для выполнения запросов к DNS-серверам.
По умолчанию она просто находит IP-адрес, соответствующий заданному имени хоста, например:

[Linux]$ host www.linuxcenter.ru

www.linuxcenter.ru A 195.5.132.10

[FreeBSD]$ host www.linuxcenter.ru

www.linuxcenter.ru has address 195.5.132.10

Как вы видите, в случае Linux утилита выдает DNS-запись типа A, а FreeBSD просто сообщает адрес хоста, используя английский язык. Следует отметить, что DNS-запись, выдаваемая Linux, непригодна для непосредственного помещения в базу данных DNS-сервера, так как имя хоста не заканчивается точкой; указание точки после имени хоста при вызове host также не помогает.
Кроме того, не хватает IN между именем хоста и A. Если вам нужно получить запись, которую можно было бы непосредственно поместить в базу DNS, в Linux вы можете использовать параметр -Z:

[Linux]$ host -Z slashdot.org

slashdot.org. 3600 IN A 64.28.67.48


В FreeBSD такая возможность отсутствует.

Аналогичная ситуация возникает, когда указанное имя является алиасом --- Linux выводит строчку со словом CNAME, а FreeBSD использует конструкцию "xxx.yyy.zzz is a nickname for aaa.bbb.ccc" :

[Linux]$ host admin1.piter-press.ru

admin1.piter-press.ru CNAME ns.piter-press.ru

ns.piter-press.ru A 195.239.142.33

[FreeBSD]$ host admin1.piter-press.ru.

admin1.piter-press.ru is a nickname for ns.piter-press.ru

ns.piter-press.ru has address 195.239.142.33


Следует отметить, что после имени хоста в команде host может быть указано имя сервера, который вы хотите опросить. Если имя сервера не указано (как в наших примерах), то производится опрос одного из DNS-серверов для данной зоны.

Если host получает на вход не имя хоста, а IP-адрес, то производится обратное преобразование --- в FQDN.

[Linux]$ host 195.239.142.33

Name: ns.piter-press.ru

Address: 195.239.142.33

[FreeBSD]$ host 195.239.142.33

33.142.239.195.IN-ADDR.ARPA domain name pointer ns.piter-press.ru


На этот раз в случае Linux приведена обычная текстовая информация (хотя, казалось бы, почему не вывести DNS-запись типа PTR?). FreeBSD поступает логичнее --- IP-адрес преобразован в соответствующее ему имя хоста в зоне IN-ADDR.ARPA, для которого и выведена информация --- опять же, при помощи английского языка.

Подстановка локального домена

Еще одно важное отличие версий host в Linux и FreeBSD заключается в том, что FreeBSD в том случае, если имя хоста не заканчивается точкой, пытается подставить для него локальный домен, чего Linux не делает (возможно, это баг, поскольку man-страница утверждает обратное):

[Linux]$ hostname -d

spb.ru

[Linux]$ nslookup woe.spb.ru

Server: frei.home

Address: 192.168.1.5

Name: woe.spb.ru

Address: 193.125.200.14

[Linux]$ host woe

woe does not exist (Authoritative answer)

Как мы видим, spb.ru является локальным доменом, хост woe.spb.ru существует, но команда host woe не выдает желаемого результата. Следует отметить, что наличие в файле /etc/resolv.conf строки search spb.ru (или domain spb.ru) решило бы проблему. Под FreeBSD поведение host иное:

[FreeBSD]$ host alv

alv.home has address 192.168.1.1

[FreeBSD]$ host alv.

Host not found

Локальный домен был подставлен только в первом случае, так как имя не заканчивалось точкой. Наличие строк search и/или domain в resolv.conf не обязательно.

Подробная информация: параметр -v

Полезным параметром является -v (verbose). И в Linux, и во FreeBSD его действие практически одинаково: выводится дополнительная информация о зоне.

[Linux]$ host -v www.spb.ru

Query about www.spb.ru for record types A

Trying www.spb.ru ...

Query done, 1 answer, status: no error

The following answer is not authoritative:

www.spb.ru 2134 IN A 195.190.101.3

Authority information:

www.spb.ru 48235 IN NS ns.nevalink.ru

www.spb.ru 48235 IN NS ns1.gldn.net

www.spb.ru 48235 IN NS ns2.gldn.net

Additional information:

ns.nevalink.ru 54275 IN A 195.190.100.28

ns1.gldn.net 10978 IN A 194.67.2.108

ns2.gldn.net 10972 IN A 195.218.218.8

[FreeBSD]$ host -v www.spb.ru.

rcode = 0 (Success), ancount=1

The following answer is not authoritative:

The following answer is not verified as authentic by the server:

www.spb.ru 2053 IN A 195.190.101.3

For authoritative answers, see:

www.spb.ru 48154 IN NS ns.nevalink.ru

www.spb.ru 48154 IN NS ns1.gldn.net

www.spb.ru 48154 IN NS ns2.gldn.net

Additional information:

ns.nevalink.ru 51480 IN A 195.190.100.28

ns1.gldn.net 10348 IN A 194.67.2.108

ns2.gldn.net 10342 IN A 195.218.218.8

Пояснений требует числовое поле, появившееся в ответе host. Вызвав host несколько раз, можно заметить, что его значение постоянно уменьшается, что не удивительно, так как это поле содержит TTL --- время жизни записи в зоне.

Под Linux вы можете использовать параметр -vv, вызывающий вывод информации о процессе получения DNS-записей.

Выбор типов записей: параметры -a и -t

Еще два важных параметра команды host --- -a и -t. Параметр -a означает -t ANY в Linux и -v -t any во FreeBSD, поэтому разберем значение параметра -t.

Этот параметр используется для задания типа DNS-записей, которые вас интересуют. Поддерживаются типы записей A, NS, MD, MF, CNAME, SOA, MB, MG, MR, NULL, WKS, PTR, HINFO, INFO, MX, UINFO, UID, GID, UNSPEC. Обратите внимание, что в Linux тип записи можно указвать в любом регистре, а во FreeBSD --- только строчными буквами (a, ns, cname и т. п.). Если параметр -t не указан, то Linux по умолчанию производит поиск записей типа A, если указан параметр -l (см. ниже) --- то типов A, NS, PTR. FreeBSD при неуказанном параметре -t производит поиск записей типов A и MX, при указанном параметре -l --- еще и PTR и NS. Linux-версия host также поддерживает тип записи MAILB, означающий любой тип из MB, MR, MG или MINFO. Вместо указания параметра -t MAILB можно указать параметр -m; в этом случае также будет произведено рекурсивное раскрытие записей типов MR и MG до MB. Листинг зоны: параметр -l При помощи команды host с параметром -l можно получить листинг целой зоны. Для указания типов записей, которые вас интересуют, используйте параметры -a и -t. Имейте в виду, что листинг зоны генерируется при помощи запроса AXFR на передачу зоны и выделения нужной информации из полученной. Это означает, что параметр -l создает дополнительную нагрузку на сеть и DNS-сервера, поэтому использовать его следует как можно реже. Кроме того, многие системные администраторы так настраивают свои DNS-сервера, что они не отдают зону "кому попало", отказывая в обработке запроса AXFR (при этом FreeBSD-версия host даже не потрудится внятно объяснить вам, что произошло):

[Linux]$ host -l slashdot.org

slashdot.org AXFR record query refused by ns2.andover.net

slashdot.org AXFR record query refused by ns3.andover.net

slashdot.org AXFR record query refused by ns1.andover.net

No nameservers for slashdot.org responded

[FreeBSD]$ host -l slashdot.org

Server failed: Query refused

Под Linux вы можете создать полную копию зоны, пригодную для "скармливания" bind, при помощи команды host -Z -a -l (и записать ее в файл, добавив -f имя_файла).

Прочие параметры

Как известно, DNS представляет собой рекурсивную систему. Если DNS-сервер не находит информацию, запрошенную у него, он инициирует рекурсивный запрос к "вышестоящему" серверу.
Команда host имеет возможность для предотвращения этого: параметр -r запрещает производить рекурсивные запросы: опрашивается только DNS-сервер по умолчанию. Этот параметр работает практически одинаково и под Linux, и под FreeBSD, но вывод команды в том случае, когда запись не найдена, слегка отличается:

[Linux]$ host -r www.spb.ru

www.spb.ru A record currently not present

[FreeBSD]$ host -r www.spb.ru

[FreeBSD]$


Как видно, FreeBSD просто ничего не выводит.

Команда host, в принципе, может использоваться не только в сети Интернет. Параметр -c позволяет задать класс записей, которые нас интересуют. Поддерживаются классы записей IN, CHAOS, HS, HESIOD (по умолчанию используется IN). Под Linux также поддерживаются классы INTERNET, CS, CSNET, CH. Для указания всех классов можно использовать ключевое слово ANY (под Linux также можно использовать символ *, только не забудьте заэкранировать его от шелла).

Для вывода отладочной информации используйте параметр -d (под Linux его можно продублировать --- -dd --- для увеличения количества отладочной информации).

В FreeBSD-версии host ключ -s используется для работы с DNSSEC (Linux-версия не работает с DNSSEC, ключ -s используется для указания тайм-аута DNS-сервера в секундах).

Листинг зоны: дополнительные возможности Linux-версии

Параметры, описанные в этом разделе, специфичны для Linux-версии host.

Рекурсивные листинги: параметр -L Парамер -L задает уровень рекурсии при выводе листинга зоны. Например, команда:

[Linux]$ host -l -a -L 1 some.zone

выведет листинг зоны some.zone, а также всех ее делегированных зон.
Увеличение уровня рекурсии увеличивает глубину просмотра делегированных зон. Все, сказанное о нежелательности применения параметра -l, имеет еще большее значение при применении комбинации -L -l .

Статистика: параметр -S Указание параметра -S при получении листинга зоны выводит статистическую информацию о числе найденных записей различных типов, количестве хостов различных типов, количестве делегированных зон и т. п.:

[Linux]$ host -l -a -S freshmeat.net

freshmeat.net. SOA freshmeat.net. dns-admin.freshmeat.net.

...

Found 34 A records within freshmeat.net

Found 4 NS records within freshmeat.net

Found 9 CNAME records within freshmeat.net

Found 2 SOA records within freshmeat.net

Found 4 MX records within freshmeat.net

Found 32 hosts within freshmeat.net

Found 9 duplicate hosts within freshmeat.net

Found 12 extrazone hosts within freshmeat.net

Found 1 gateway host within freshmeat.net

Found 0 delegated zones within freshmeat.net

Использование определенных DNS-серверов: параметры -p и -P

Параметр -p указывает при получении листинга зоны использовать только основной (primary) DNS-сервер. Имя основного DNS-сервера определяется при помощи записи SOA рассматриваемой зоны.
Параметр -P позволяет указать список предпочтительных доменов (через запятую). Будет использоваться DNS-сервер, имеющий наибольшее число совпадений компонентов имени с одним из указанных доменов. Использование этих параметров видно на следующем примере:

[Linux]$ host -vv -p -l piter.com

...

Trying server 195.239.142.33 (ns.piter.com) ...

...

[Linux]$ host -vv -P hellix.piter.com -l piter.com

...

Finding nameservers for piter.com ...

Query done, 2 answers, status: no error

The following answer is not authoritative:

piter.com 3308 IN NS ns.piter.com

piter.com 3308 IN NS hellix.piter.com

Additional information:

ns.piter.com 85293 IN A 195.239.142.33

hellix.piter.com 3308 IN A 193.125.199.13

Found 1 address for ns.piter.com

Found 1 address for hellix.piter.com

Trying server 193.125.199.13 (hellix.piter.com) ...

Пропуск зон: параметр -N

Параметр -N позволяет указать список зон (через запятую), информация о которых не требуется. Обычно он применяется совместно с параметром -L.

Linux: расширенный синтаксис Задав параметр -x, вы можете использовать так называемый расширенный синтаксис команды host, передавая ей не одно, а несколько имен хостов. Поскольку каждое имя в этом случае трактуется как имя хоста, информацию о котором необходио получить, то для указания DNS-сервера, который нужно опрашивать, используется параметр -X. Если указан параметр -X, то -x подразумевается.

Расширенный синтаксис позволяет запустить host вообще без имен хостов, передавая их впоследствии на стандартный вход программы. Одна строка может содержать несколько имен хостов, но если в строке появляется символ # или ;, то ее остаток игнорируется.

Linux: специальные режимы

Одним из специальных режимов, поддерживаемых утилитой host, является режим передачи зоны, активируемый параметром -l. В Linux-версии утилиты имеется еще несколько специальных режимов, все из которых, за исключением одного, являются вариациями режима -l.

Вариации режима передачи зоны

Параметр -C аналогичен параметру -l, но вызывает различные проверки зоны, в частности, проверяется, действительно ли каждый из DNS-серверов, перечисленных в NS-записях для зоны, способен дать авторитетный (authoritative) ответ на запрос о зоне. Выполняются также прочие проверки корректности зоны.

Параметр -H также аналогичен параметру -l, вызывая передачу зоны, хотя он не выводит информации о записях. Вместо этого производится подсчет количества A-записей в зоне. Принимаются специальные меры (см. man 1 host) для того, чтобы принимать во внимание только "настоящие" хосты. Сочетание параметров -H -S позволяет получить подробную статистику зоны:

[Linux]$ host -H -S freshmeat.net

Found 34 A records within freshmeat.net

Found 4 NS records within freshmeat.net

Found 9 CNAME records within freshmeat.net

Found 2 SOA records within freshmeat.net

Found 4 MX records within freshmeat.net

Found 32 hosts within freshmeat.net

Found 9 duplicate hosts within freshmeat.net

Found 12 extrazone hosts within freshmeat.net

Found 1 gateway host within freshmeat.net

Found 0 delegated zones within freshmeat.net

Параметры -G, -D, -E выводят имена соответственно хостов-шлюзов (gateway), дублирующихся хостов и внезонных (extrazone) хостов. При этом под шлюзом понимается хост, имеющий более одного IP-адреса, под дублирующимся хостом понимается хост с ровно одним IP-адресом, которому также соответствует несколько имен (возможно, из разных зон --- это может означать ошибку в зоне). Под внезонным хостом для зоны some.zone понимается хост вида host.something.some.zone, где something.some.zone не является делегированной зоной.

Режим проверки адресов

Последний не разобранный нами режим Linux-версии утилиты host --- режим проверки адресов, инициируемый параметром -A. При этом производятся следующие действия:

* Если в качестве аргумента было указано имя хоста, то определяется его адрес, по которому определяется имя хоста, и проверяется на совпадение с исходным именем.

* Если в качестве аргумента был указан IP-адрес, то определяется соответствующее ему имя хоста, после чего проверяется, входит ли исходный IP-адрес в список IP-адресов для найденного имени хоста.

* Если параметр задан совместно с параметром -l, то описанные действия производятся для каждой A-записи в зоне.

Алексей Выскубов, alexey@pepper.spb.ru

[ опубликовано 29/03/2001 ]

Алексей Выскубов - Утилита host   Версия для печати