Запуск named
Программа, обеспечивающая обслуживание имени области на большинстве Unix-машин, обычно называется named. Эта программа была первоначально разработана для BSD и, возможно, для других серверов. На многих Linux-дистрибутивах, как мне кажется, используется версия BIND 4.8.3. Новая версия, BIND-4.9.3, в данный момент находится на стадии бета-тестирования и скоро должна стать доступной для Linux.
Этот раздел требует понимания работы Domain Name System. Если изложенная ниже информация вам кажется сложной, рекомендую перечитать главу 3, в которой дана более подробная информация по основам DNS.
Named обычно запускается при начальной загрузке системы и работает до момента перезагрузки машины. Он использует информацию из конфигурационного файла /etc/named.boot и различных файлов, содержащих данные имен областей адресов, которые называются zone files. Форматы и семантика этих файлов будут объяснены в следующем разделе. Для запуска named достаточно ввести в командной строке:
# /usr/sbin/named
После запуска named начнёт чтение файла named.boot и соответствующих zone file. Программа записывает идентификатор процесса в файл /var/run/named.pid в формате ASCII. При необходимости named выгружает zone files с основных серверов и начинает прослушивание порта 53 для обработки DNS-запросов.
Файл named.boot
Файл named.boot обычно невелик по размеру, но в нём содержится важная информация: ссылки на основные файлы с данными областей (zone) и ссылки на другие серверы. Комментарии в этом файле начинаются с символа ";" и продолжаются до конца строки.
В приведенном примере кэш и основные команды загружают информацию в named. Данные берутся из главного файла, который указан вторым аргументом. Этот файл содержит текстовые представления записей DNS, которые будут рассмотрены далее.
Существуют разные версии программы named для различных дистрибутивов Linux. Они могут несколько отличаться друг от друга. Например, у некоторых версий свой собственный pid-файл, который может храниться в /tmp или /var/tmp. Важно отметить, что в некоторых версиях имена доменов, указанные в named.boot, не должны оканчиваться точкой. В более старых версиях named наличие этой точки считалось ошибкой и отбрасывалось. Версия BIND-4.9.3 решает эту проблему.
; /etc/named.boot file for vlager.vbrew.com
directory /var/named
domain file
;---------------------------------------------------
cache . named.ca
primary vbrew.com named.hosts
primary 0.0.127.in-addr.arpa named.local
primary 72.191.in-addr.arpa named.rev
В этом примере мы конфигурировали named как основной сервер для трёх областей, как указано основными операторами в конце файла. Первая из этих строк, например, инструктирует named действовать как основной сервер для vbrew.com, принимая данные zone из файла named.hosts. Ключевое слово "каталог" указывает ему, что все файлы zone размещены в /var/named.
Запись кеша очень важна и должна присутствовать практически на всех машинах, на которых запущен сервер. Её функция двойственна: она инструктирует named для очистки кеша и загружает основные серверные подсказки из файла кеша (named.ca в нашем примере). Мы вернёмся к серверам с подсказками позже.
Также имеется список наиболее важных опций, которые вы можете использовать в named.boot:
- directory - определяет директорию, в которой zone files постоянно находятся. Имена файлов могут быть указаны относительно этой директории. Несколько директорий могут быть определены при многократном использовании directory. Согласно стандарту файловой системы Linux, эта директория должна быть /var/named.
- primary - принимает имя области и имя файла в качестве аргументов, объявляя локальный сервер авторитетным для данной области named. В роли основного сервера, named загружает информацию zone из указанного файла.
Как правило, в каждом boot-файле всегда присутствует по крайней мере одна основная запись, предназначенная для обратного адреса сети 127.0.0.0, которая является локальной закрытой сетью.
- secondary - принимает имя области, список адресов и имя файла в качестве аргументов. Данный оператор объявляет локальный сервер вторичным главным сервером для указанной области. Вторичный сервер сохраняет авторитетные данные для области, однако он не извлекает их из файла, а пытается загрузить их с основного сервера. IP-адрес хотя бы одного основного сервера должен быть предоставлен named в списке адресов. Локальный сервер будет пытаться связаться с каждым из них, пока успешно не загрузит всю зональную базу данных. После этого данные сохраняются в файле для резервного копирования, указанном как третий аргумент. Если ни один из основных серверов не отвечает, зональные данные будут восстановлены из файла резервной копии. Named затем будет пытаться обновить зональные данные через регулярные интервалы. Этот процесс подробно описан в разделе о записи типа SOA.
- cache - данный оператор принимает область и имя файла в качестве аргументов. Этот файл содержит подсказки для сервера, состоящие из списка записей, указывающих на другие серверы. Однако признаются только записи NS и A. Аргумент "область" представляет собой, в основном, исходное имя области. Это очень важно: если оператор cache отсутствует в boot-файле, named не создает локальный кэш. Это может снизить производительность и увеличить сетевую нагрузку, если следующий сервер делает запрос не на локальную сеть. Кроме того, named не сможет достичь всех серверов, и, следовательно, не сможет решить проблему с адресами, кроме тех, для которых он является авторитетным. Единственное исключение из этого правила - когда используются серверы пересылки, определенные далее.
- forwarders - этот оператор принимает список адресов в качестве аргумента. IP-адреса в этом списке указывают на серверы, к которым named может обратиться, если запрос не может быть решен с использованием его локального кэша. Адреса проверяются по порядку, пока один из них не ответит на запрос.
- slave - этот оператор делает основной сервер подчиненным. То есть он никогда не будет выполнять рекурсивные запросы самостоятельно, а будет лишь перенаправлять их к серверам, определенным оператором forwarders.
Существуют две опции, которые мы не будем рассматривать в данной статье: sortlist и domain. Также есть две директивы, применяемые внутри файлов зоны базы данных: $INCLUDE и $ORIGIN. Поскольку они редко используются, мы не будем останавливаться на их описании.
DNS файл базы данных
Основной файл, используемый named (например, named.hosts), всегда имеет ассоциированную с ним область, которая называется origin. Это область, имя которой определено с помощью команд cache и primary. Внутри основного файла вы можете определить область и имена хостов в рамках этой области. Имя, указанное в файле конфигурации, считается абсолютным, если оно заканчивается точкой; в противном случае оно рассматривается как относительное origin. Для обозначения всего origin можно использовать символ "@".
Все данные в основном файле представлены в виде источника записей или RRs (resource records) для краткости. Это наименьшие единицы информации, доступные через DNS. Каждая запись имеет свой тип. Например, запись типа A связывает имя хоста с IP-адресом, а запись CNAME ассоциирует псевдоним хоста с его официальным именем. Для примера можно обратиться к рисунку 7.2.3 на странице 116, который демонстрирует основной файл named.hosts для virtual brewery.
Формат записей в основных файлах следующий:
[domain] [ttl] [class] type rdata
Поля разделяются пробелами или табуляцией. Запись может продолжаться на несколько строк. Если перед первой строкой стоит открывающая квадратная скобка, последнее поле должно завершаться закрывающей квадратной скобкой. Всё, что находится между точкой с запятой и концом строки, игнорируется.
- domain - имя области, в которой находится запись. Если имя области не указано, RR использует область из предыдущего RR.
- ttl - время жизни записи, определяющее, как долго информация будет актуальной после её поиска на сервере.
- class - класс записи, который определяет пространство имен или протокол, к которому относится запись.
Если значение ttl не указано, то используется значение по умолчанию, соответствующее минимальному полю предыдущей записи SOA.
- class: Класс адреса, например IN для IP адресов или HS для объекта в классе Hesoid. Для TCP/IP сетей вам следует использовать IN. Если класс не указан, применяется класс предыдущего RR.
- type: Описывает тип RR. Наиболее распространенные типы: A, SOA, PTR и NS. Далее типы RR будут описаны по отдельности.
- rdata: Содержит данные, связанные с RR. Формат этого поля зависит от типа RR. Ниже будет подробное описание для каждого типа RR.
- following: Неполный список RR, который следует использовать в основном файле DNS. Некоторые пары из этого списка экспериментальны и редко используются.
- SOA: Описывает зону власти (SOA - Start of Authority). Указывает, что запись после SOA содержит авторитетную информацию для домена. Каждый основной файл, заданный основным оператором, должен содержать запись SOA для этой зоны. Поле данных содержит следующую информацию:
- origin: Каноническое имя основного сервера для этой области. Обычно указывается как абсолютное имя.
- contact: Email-адрес лица, ответственного за поддержку домена. Знак "@" заменяется точкой. Например, для Virtual Brewery, если ответственный - Janet, это поле будет содержать janet.vbrew.com.
- serial: Номер версии файла зоны, представленный как единственное десятичное число. При любых изменениях в файле зоны это число следует увеличивать.
Серийный номер используется вторичными серверами для определения, была ли изменена зональная информация. Чтобы оставаться в актуальном состоянии, вторичные серверы регулярно запрашивают запись SOA у основного сервера, сравнивая порядковый номер с кэшированной записью SOA. Если номер изменился, вторичные серверы переносят всю зону базы данных с основного сервера.
- refresh: Определяет интервал в секундах, с которым вторичные серверы проверяют записи SOA основного сервера. Это десятичное число с восемью или более разрядами.
В целом, сетевая топология редко меняется настолько часто, чтобы этот параметр требовал корректировки даже в дни активной активности больших сетей, и, тем более, для меньших сетей.
- retry: Определяет интервал, через который вторичный сервер пытается повторно связаться с основным сервером в случае неудачного запроса или переноса зоны. Этот интервал не должен быть слишком коротким, чтобы временные сбои или сетевые проблемы не приводили к излишней нагрузке. Один час или полчаса могут быть хорошим выбором.
- expire: Определяет время в секундах, после которого сервер должен окончательно отбросить все зональные данные, если не удается связаться с основным сервером. Это время обычно должно быть достаточно долгим.
- Craig Hunt (GETS "hunt - tcpip") рекомендует 42 дня.
- minimum: Устанавливает ttl значение по умолчанию для записей, которые явно его не указывают. Это время, в течение которого другой сервер сохраняет запись в кэше. Minimum должен быть достаточно длительным, особенно для локальных сетей, где топология редко меняется. Неделя или месяц может быть подходящим значением. Если какие-то записи часто меняются, вы можете задать для них отдельные значения ttl.
- A: Ассоциирует IP-адрес с именем хоста. Источник данных содержит адрес в формате dotted quad notation.
Для каждого хоста должна быть только одна запись типа "A". Hostname, используемый в этой записи, считается основным или каноническим. Все другие имена хостов являются псевдонимами и должны быть отображены на каноническое имя с помощью записи CNAME.
- NS: Указывает на авторитетный сервер для подчиненной зоны. Каждая зона должна иметь запись NS. Источник данных этой записи содержит имя сервера. Также можно предоставить дополнительное имя хоста и его запись "A", так называемый "glue", который указывает IP-адрес сервера.
- CNAME: Ассоциирует псевдоним с его каноническим именем хоста. Каноническое имя хоста — это основное имя, имеющее запись "A"; псевдонимы просто связаны с этим именем через запись CNAME и не имеют собственных записей "A".
- PTR: Этот тип записи используется для ассоциации имени в домене Addr.arpa с именами хостов. Он служит для обратного отображения IP-адресов в имена хостов. Указанное имя хоста должно быть каноническим.
- MX: Эта запись определяет почтовый сервер для домена. Синтаксис записи MX следующий: [domain] [ttl] [class] MX preference host. Здесь "host" обозначает почтовый сервер для домена. Каждому почтовому серверу присваивается числовое значение предпочтения (preference value). Почтовый агент, который пытается доставить почту в домен, будет пытаться доставить ее по порядку, начиная с сервера с наименьшим значением предпочтения.
- HINFO: Эта запись предоставляет информацию о аппаратной и программной конфигурации системы. Синтаксис этой записи следующий:
[domain] [ttl] [class] HINFO hardware software
Аппаратная область идентифицирует аппаратные средства, используемые данным хостом. Существуют специальные соглашения для её точного определения. Список подходящих имен приведён в "Assigned Numbers" (RFC 1340). Если область содержит пробелы, её следует заключить в двойные кавычки. Имена областей программного обеспечения соответствуют операционной системе. Снова, подходящее имя можно выбрать из "Assigned Numbers" RFC.
Учитывая характер рассматриваемой сети (единственная локальная вычислительная сеть), приведённый пример довольно прост. Если ваши требования слишком сложны и вы не можете запустить named, рекомендую обратиться к книге "DNS and BIND" авторов Cricket Liu и Paul Albitz.
Кэш-файл named.ca демонстрирует пример записи hint для корневого сервера имен. Типичный кэш-файл обычно содержит информацию о десятке серверов или около того. Вы можете получить актуальный список серверов для корневой зоны, используя утилиту nslookup, которая описана ближе к концу этой главы.
; /var/named/named.ca Cache file for the brewery.
; We're not on the Internet, so we don't need
; any root servers. To activate these
; records, remove the semicolons.
; . 99999999 IN NS NS.NIC.DDN.MIL
; NS.NIC.DDN.MIL 99999999 IN A 26.3.0.103
; . 99999999 IN NS NS.NASA.GOV
; NS.NASA.GOV 99999999 IN A 128.102.16.10
Файл named.ca.
Проверка установки сервера (Name Server Setup)
Обратите внимание, что вы не сможете отправить запрос к вашему серверу на корневые серверы, если у вас нет подсказок к корневым серверам. Чтобы решить эту проблему, вы можете попробовать заставить nslookup использовать другой сервер, либо вы можете использовать файл, представленный на рисунке 7.2.3, и затем получить полный список соответствующих серверов.
; /var/named/named.hosts Local hosts at the brewery
; Origin is vbrew.com
@ IN SOA vlager.vbrew.com. (
janet.vbrew.com.
16 ; serial
86400 ; refresh: once per day
3600 ; retry: one hour
3600000 ; expire: 42 days
604800 ; minimum: 1 week
)
IN NS vlager.vbrew.com.
; local mail is distributed on vlager
IN MX 10 vlager
; loopback address
localhost. IN A 127.0.0.1
; brewery Ethernet
vlager IN A 191.72.1.1
vlager-if1 IN CNAME vlager
; vlager is also news server
news IN CNAME vlager
vstout IN A 191.72.1.2
vale IN A 191.72.1.3
; winery Ethernet
vlager-if2 IN A 191.72.2.1
vbardolino IN A 191.72.2.2
vchianti IN A 191.72.2.3
vbeaujolais IN A 191.72.2.4
Файл named.hosts.
Существует отличный инструмент для проверки настройки вашего сервера — nslookup. Он может работать как в интерактивном режиме, так и из командной строки. В последнем случае, чтобы вызвать его, используйте команду: nslookup hostname. Она отправит запрос на сервер, указанный в файле resolv.conf, для hostname. Если в этом файле указано несколько серверов, nslookup выберет любой из них.
; /var/named/named.local Reverse mapping of 127.0.0
; Origin is 0.0.127.in-addr.arpa.
@ IN SOA vlager.vbrew.com. (
joe.vbrew.com.
1 ; serial
360000 ; refresh: 100 hrs
3600 ; retry: one hour
3600000 ; expire: 42 days
; minimum: 100 hrs
)
IN NS vlager.vbrew.com.
1 IN PTR localhost.
Файл named.local.
Интерактивный режим предоставляет больше возможностей. Вы можете запрашивать любой тип DNS-записи и извлекать зональную информацию для домена.
Использование утилиты nslookup
При вызове без аргументов утилита nslookup отображает название используемого сервера и переходит в интерактивный режим. Ответив на приглашение ">", вы можете ввести любое имя, чтобы выполнить запрос. По умолчанию, он будет запрашивать записи класса A, содержащие IP-адреса. Вы можете изменить этот тип запроса с помощью команды "set type=type", где "type" — это одно из возможных значений для типа записи.
; /var/named/named.rev Reverse mapping of our IP addresses
; Origin is 72.191.in-addr.arpa.
@ IN SOA vlager.vbrew.com. (
joe.vbrew.com.
16 ; serial
86400 ; refresh: once per day
3600 ; retry: one hour
3600000 ; expire: 42 days
604800 ; minimum: 1 week
)
IN NS vlager.vbrew.com.
; brewery
1.1 IN PTR vlager.vbrew.com.
2.1 IN PTR vstout.vbrew.com.
3.1 IN PTR vale.vbrew.com.
; winery
1.2 IN PTR vlager-if1.vbrew.com.
2.2 IN PTR vbardolino.vbrew.com.
3.2 IN PTR vchianti.vbrew.com.
4.2 IN PTR vbeaujolais.vbrew.com.
Файл named.rev.
$ nslookup
Default Name Server: rs10.hrz.th-darmstadt.de
Address: 130.83.56.60
> sunsite.unc.edu
Name Server: rs10.hrz.th-darmstadt.de
Address: 130.83.56.60
Non-authoritative answer:
Name: sunsite.unc.edu
Address: 152.2.22.81
Если вы попробуете запросить имя, которое не имеет соответствующего IP-адреса, но для которого в DNS-базе данных найдены другие записи, nslookup вернет ошибку: "No type A records found". Однако, вы можете задать запрос на другие типы записей (не только A), используя команду "set type". Например, чтобы запросить SOA-запись для unc.edu, выполните следующие команды:
> unc.edu
*** No address (A) records available for unc.edu
Name Server: rs10.hrz.th-darmstadt.de
Address: 130.83.56.60
> set type=SOA
> unc.edu
Name Server: rs10.hrz.th-darmstadt.de
Address: 130.83.56.60
Non-authoritative answer:
unc.edu
origin = ns.unc.edu
mail addr = shava.ns.unc.edu
serial = 930408
refresh = 28800 (8 hours)
retry = 3600 (1 hour)
expire = 1209600 (14 days)
minimum ttl = 86400 (1 day)
Authoritative answers can be found from:
UNC.EDU nameserver = SAMBA.ACS.UNC.EDU
SAMBA.ACS.UNC.EDU internet address = 128.109.157.30
Таким образом, вы можете запросить MX-записи и другие типы записей. Использование типа ANY вернёт все записи, связанные с указанным именем.
> set type=MX
> unc.edu
Non-authoritative answer:
unc.edu preference = 10, mail exchanger = lambada.oit.unc.edu
lambada.oit.unc.edu internet address = 152.2.22.80
Authoritative answers can be found from:
UNC.EDU nameserver = SAMBA.ACS.UNC.EDU
SAMBA.ACS.UNC.EDU internet address = 128.109.157.30
После этого вы можете запросить список root-серверов для файла named.ca, запрашивая все NS-записи, связанные с корневой областью:
> set type=NS
> .
Name Server: fb0430.mathematik.th-darmstadt.de
Address: 130.83.2.30
Non-authoritative answer:
(root) nameserver = NS.INTERNIC.NET
(root) nameserver = AOS.ARL.ARMY.MIL
(root) nameserver = C.NYSER.NET
(root) nameserver = TERP.UMD.EDU
(root) nameserver = NS.NASA.GOV
(root) nameserver = NIC.NORDU.NET
(root) nameserver = NS.NIC.DDN.MIL
Authoritative answers can be found from:
(root) nameserver = NS.INTERNIC.NET
(root) nameserver = AOS.ARL.ARMY.MIL
(root) nameserver = C.NYSER.NET
(root) nameserver = TERP.UMD.EDU
(root) nameserver = NS.NASA.GOV
(root) nameserver = NIC.NORDU.NET
(root) nameserver = NS.NIC.DDN.MIL
NS.INTERNIC.NET internet address = 198.41.0.4
AOS.ARL.ARMY.MIL internet address = 128.63.4.82
AOS.ARL.ARMY.MIL internet address = 192.5.25.82
AOS.ARL.ARMY.MIL internet address = 26.3.0.29
C.NYSER.NET internet address = 192.33.4.12
TERP.UMD.EDU internet address = 128.8.10.90
NS.NASA.GOV internet address = 128.102.16.10
NS.NASA.GOV internet address = 192.52.195.10
NS.NASA.GOV internet address = 45.13.10.121
NIC.NORDU.NET internet address = 192.36.148.17
NS.NIC.DDN.MIL internet address = 192.112.36.4
Дополнительные инструменты
При использовании утилиты nslookup можно получить полный список доступных команд, введя команду "help". Но кроме nslookup существуют и другие полезные инструменты, которые могут помочь вам в роли администратора BIND. Давайте рассмотрим некоторые из них.
hostcvt — инструмент, который помогает при начальной настройке BIND, преобразуя ваш файл /etc/hosts в главный файл для named. Он генерирует и прямые (A), и обратные (PTR) отображения, а также учитывает псевдонимы и т. п. Хотя он и не выполняет всю работу за вас, это инструмент может сэкономить вам много времени. Hostcvt является частью исходного кода BIND, но также может быть использован как отдельный пакет на некоторых FTP-серверах для Linux.
После настройки вашего сервера вы, возможно, захотите проверить вашу конфигурацию. Идеальным инструментом для этого является dnswalk — на основе Perl пакет, который сканирует вашу DNS-базу данных на предмет ошибок и проверяет соответствие информации. Dnswalk был опубликован в группе comp.sources.misc и должен быть доступен на всех FTP-серверах, которые архивируют эту группу.