Часто в ответах на обратные запросы можно увидеть адреса вроде 192.0.2.10.customers.example.com. Такие записи удобны для админов других сетей — из вывода traceroute или tcpdump сразу понятно, какой компании принадлежит адрес. Как они делаются?
Генерация записей для диапазонов адресов в BIND
Можно сгенерировать их скриптом и записать в файл зоны, но в BIND для этой цели есть встроенный механизм — директива $GENERATE.
Для примера сгенерируем записи вида 192.0.2.X.users.example.com для диапазона адресов 192.0.2.1–100.
Сначала добавим обратную зону для сети 192.0.2.0/24 в /etc/named.conf.
1 2 3 4 |
zone "2.0.192.in-addr.arpa" { type master; file "/var/named/data/2.0.192.in-addr.arpa"; }; |
Затем создадим файл зоны.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$TTL 86400 @ IN SOA localhost. root.localhost. ( 2020071001 ; serial 28800 ; refresh 14400 ; retry 3600000 ; expire 86400 ; default TTL ) 2.0.192.in-addr.arpa. IN NS ns1.example.com. 200 IN PTR jrandomhacker.users.example.com. $GENERATE 1-100 $ PTR 192.0.2.$.users.example.com. |
Применим изменения командой rndc reload или перезапуском сервиса. Для начала убедимся, что зона работает, и запросим PTR к настроенному вручную 192.0.2.200.
1 2 |
$ host 192.0.2.200 localhost 200.2.0.192.in-addr.arpa domain name pointer jrandomhacker.users.example.com. |
Теперь проверим адрес, для которого нет явной записи.
1 2 |
$ host 192.0.2.76 localhost 76.2.0.192.in-addr.arpa domain name pointer 192.0.2.76.users.example.com. |
Как видим, все работает как ожидалось.
Разберем директиву на части. Первый аргумент ( 1-100) — это диапазон значений счетчика. Символ $ при генерации записей заменяется на текущее значение счетчика. В нашем случае BIND сгенерирует 99 правил от $=1 до $=100.
Второй аргумент — имя записи. Для записей типа PTR это номер хоста в сети, и он совпадает со счетчиком, потому и просто $. Третий аргумент — тип записи. Наконец, последний аргумент — ее значение.
Увы, в BIND нет способа исключить из автоматической генерации адреса, для которых уже есть явные записи, так что для клиентов со статическими адресами нужно либо выделить отдельный диапазон, либо смириться с двумя записями для одного адреса — явной и автоматически сгенерированной (что, впрочем, не принесет никакого вреда).
Директива $GENERATE обрабатывается при загрузке зоны и генерирует все записи в памяти. Таким образом, с ее помощью можно сэкономить время админа и число строк в файле зоны, но требования к памяти останутся теми же.
РЕКОМЕНДУЕМ:
Защита почтового сервера без антивируса
Автоматически сгенерированные записи обычно ассоциируются с обратными зонами, но не ограничиваются ими.
Предположим, у тебя есть пять веб-серверов с адресами 203.0.113.10–15. Ты хочешь создать для них записи вида www[1-5].example.com. Это вполне можно сделать автоматически. Добавь вот такую запись в файл зоны example.com:
1 |
$GENERATE 1-5 www$ A 203.0.113.${10,0,d} |
Здесь 10 это константа, которая добавляется к значению счетчика, 0 — число ведущих нулей в значении (мы генерируем IP-адрес и дополнение нулями нам не нужно), d — десятичный формат вывода.