Файли опису зони

У цьому матеріалі ми розберемо особливості застосування директив управління під час опису зон у master файлах. Крім стандартних директив $ORIGIN і $INCLUDE будуть також розглянуті $TTL та $GENERATE.

Найбільш застосовувана директива управління -$ORIGIN. Вона дозволяє визначити поточне ім'я домену. Пояснимо, що це таке. При описі файлу конфігурації named як перший параметр директив primary, secondary (файл конфігурації BIND 4) та директиви zone (файл конфігурації BIND 8 або 9) вказується ім'я зони, наприклад:

# # файл налаштування для BIND 4 # directory /etc/namedb primary kyky.ru kuku.ry secondary first.kyky.ru 192.168.0.1 first.kuku.ru

/* файл налаштування для BIND 9 */ options directory "/etc/namedb"; >; zone "kyky.ru" in type master; file "kyky.ru"; >; zone "first.kyky.ru" in type slave; file "first.kyky.ru"; masters; >;

В обох прикладах як зона відповідальності для master сервера вказана зона kyky.ru, а для slave - first.kyky.ru.

Тепер якщо перейти до master файлу зони kyky.ru, тобто. файлу опису зони kyky.ru, то за умовчанням як поточне доменне ім'я буде передбачатися ім'я kyky.ru. Якщо бути абсолютно точним, то це ім'я буде утримуватися в змінній @. Саме тому файл опису зони kyky.ru починається записом вигляду:

@ IN SOA ns.kyky.ru. adm.kuku.ru. ( 1 2h 30m 2d 30m) IN NS ns.kyky.ru. ns IN A 192.168.0.2

Що робити, якщо потрібно в опис зони включити запис опису хоста з іншої зони, наприклад із зони делегованої сервером іншому серверу:

@ IN SOA ns.kyky.ru. adm.kuku.ru. ( 1 2h 30m 2d 30m) IN NS ns.kyky.ru. ns IN A 192.168.0.2 sub IN NS first.kyky.ru. first IN A192.168.0.2 $ORIGIN sub.kyky.ru. ns IN A 192.168.0.45

У цьому прикладі директива $ORIGIN перевизначає ім'я поточного домену з kyky.ru на sub.kyky.ru.

Взагалі кажучи, основне призначення $ORIGIN - це спрощення змісту файлу опису зони при визначенні піддоменів в тій же зоні, де описаний і домен, що стоїть вище:

$ORIGIN kyky.ru. ns IN A 192.168.0.1 www IN A 192.168.0.2 $ORIGIN sub1.kyky.ru. host1 IN A 192.168.0.3 host2 IN A 192.168.0.4 $ORIGIN sub2.kyky.ru. host1 IN A 192.168.0.5 host2 IN A 192.168.0.6

У наведеному вище прикладі ми завели два піддомени в домені kyky.ru, причому ім'я машин в них однакове, але повні доменні імена різняться, що і не дивно.

Ще кілька років тому досить часто можна було бачити у файлах опису зон таку картину:

@ IN SOA ns.kyky.ru. adm.kuku.ru. ( 1 2h 30m 2d 30m) IN NS ns.kyky.ru. IN NS ns.provider.ru. ns IN A 192.168.0.2 $ORIGIN provider.ru. ns IN A 192.168.10.5

Що ж тут не так? Формально все правильно. Для зони kyky.ru мають бути визначені два сервери доменних імен із незалежним підключенням до мережі, т.к. йдеться про корпоративний домен.

Перший сервер визначено у мережі компанії та має ім'я ns.kyky.ru, а другий сервер - це сервер провайдера, що забезпечує дублювання, тобто. ns.kyky.ru – це master, а ns.provider.ru – це slave.

Нові версії BIND (4.9 і вище) відстежують цей момент, а ось старіші версії такої перевірки не роблять. Адміністратори системи доменних імен включали такі "приклеєні" записи для того, щоб заощадити на трафіку (немає потреби опитувати сервери доменних імен).

І тут використовується файл /etc/namedb/my_zone.dsc, т.к. зазвичай директиви directory (BIND 4)або directory (BIND 8-9) визначають саме цю директорію зберігання файлів бази даних named.

В даному випадку вказано повний шлях, і саме він використовуватиметься при доступі до файлу.

Розглянемо тепер ще дві директиви управління, які порівняно недавно з'явилися у файлах опису зон: $ TTL та $ GENERATE.

Директива$TTLвизначає час зберігання запису опису ресурсів у кеші resolver, і якщо resolver "дурний" (stub), тобто. немає кешу і посилає лише рекурсивні запити, то $TTL визначатиме час зберігання RR в кеші локального сервера доменних імен, який виконує запити "дурного" resolver.

Ця директива була введена в RFC-2308 для того, щоб звільнити останній параметр запису SOA для часу кешування негативних відповідей (negative caching).

Директиву $TTL слід вказувати прямо перед записом SOA у файлі опису зони. $TTL пов'язана з визначенням 32-бітового значення, тому може набувати значення від 0 до 2147483647(RFC 2181).

Взагалі, адміністратор серверів BIND версій 8 або 9 має можливість визначати максимальний час кешування для запису опису ресурсу. Робиться це у конфігураційному файлі named.conf. За умовчанням цей час дорівнює одному тижні.

У матеріалі "Опис зони. Формат запису опису ресурсів (RR)" було зазначено, що при переході зі старих версій BIND на нові не потрібно змінювати файли опису зон, т.к. Формат RR не змінився. Як тепер зрозуміло, це зовсім так. У всякому разі, змінилося призначення одного з атрибутів SOA і, як наслідок, стала необхідна директива управління $TTL.

Звичайно, розробники BIND розуміють, що в мережі стоїть велика кількість серверів, про які адміністратори просто забули, а тому в BIND закладені розумнізначення часу кешування (TTL) за замовчуванням.

Директива $GENERATE покликана спростити процес створення фалу опису зони. Її головне призначення полягає в тому, щоб скоротити кількість регулярних записів, які відрізняються один від одного одним або декількома символами. Наприклад, якщо стандартний набір записів у фалі опису зони виглядає як:

host1 IN A 192.168.0.1 host2 IN A 192.168.0.2 … host10 IN A 192.168.0.10

То запис із використанням $GENERATE буде виглядати приблизно так:

$GENERATE 1-10 $ IN A 192.168.0.$

Таким чином, 10 записів ми замінили на один.

Дуже корисний цей запис у разі, коли потрібно визначати зворотну зону для мережі класу С (в нотації CIDR масковано перші 24 біти), яка розбита провайдером на підмережі, і ці підмережі роздані різним клієнтам (див. RFC 2317). Залишимо саму проблему за кадром до того моменту, коли нам дійсно знадобиться делегувати подібні зворотні зони, а тут наведемо тільки ту частину файлу опису "зворотної" зони, в якій застосовується директива управління $GENERATE:

$GENERATE 1-63 $.0.168.192.in-addr.arpa IN CNAME $.0-63.0.168.192.in-addr.arpa. 0-63.0.168.192.in-addr.arpa. IN NS ns.kyky.ru.

$GENERATE 65-127 $.0.168.192.in-addr.arpa IN CNAME $.64-128.0.168.192.in-addr.arpa. 64-128.0.168.192.in-addr.arpa. IN NS ns.corp.ru

У цьому випадку $GENERATE використовується для однотипних RR.

Слід зазначити, що $GENERATE це стандартна директива, а розширення директив управління пакета BIND.