Настройка представлений в BIND9 может пригодиться в тех случаях, когда требуется гибко управлять разрешением имен для клиентов из разных подсетей. Это особенно актуально в конфигурациях Split DNS, а отсутствие подобного функционала в Windows ставит BIND9 в ещё более выгодное положение.
Начиная с Windows 2016 есть возможность управлять ответами сервера в зависимости от подсети клиента, скажете вы. Действительно, но в Windows этот функционал очень сырой и крайне неудобный в использовании.
Если вам интересно подробнее изучить задачи администрирования BIND9, рекомендую обратиться к соответствующему тегу на моем блоге.
Содержание
Настройка представлений в BIND9
Помимо использования представлений BIND9 для реализации Split DNS, есть также некоторые другие случаи, когда этот функционал будет крайне полезным. Например в зависимости от расположения клиента – гостевая или корпоративная сеть – вы можете гибко управлять перенаправлениями запросов к разным серверам, не позволяя “чужим” устройствам ломиться к внутренним DNS.
Предварительная настройка
На данном этапе я предполагаю, что у вас уже есть настроенный и работающий сервер BIND9. Если вдруг нет, то предлагаю прочитать мою предыдущую статью – Сервер пересылки на BIND9. Именно на её основе я и буду настраивать представления.
Также помните, что одновременно использовать директивы zone и view на одном уровне нельзя, вы столкнетесь с подобными ошибками:
1 2 |
11-Jun-2019 14:36:37.296 config: error: /etc/bind/named.conf.default-zones:2: when using 'view' statements, all zones must be in views 11-Jun-2019 14:36:37.296 general: error: reloading configuration failed: failure |
Если вы твердо решили иметь дела с представлениями, то директива zone должна появляться только внутри view. Собственно именно поэтому нужно исключить из named.conf вложенный конфиг, который мы добавляли в предыдущей статье. Полная строчка выглядит так:
1 |
include "/etc/bind/named.conf.default-zones"; |
Закомментируйте её и можно приступать к настройке представлений.
Базовая конфигурация
В базовом виде нам достаточно настроить списки доступа и отдельное представление (или несколько) с нужными записями. Списки доступа (acl) можно вполне взять в готовом виде из предыдущей статьи. Речь идет о файле /etc/bind/named.conf.acl и его содержимом:
1 2 3 4 5 6 |
acl acllist_dmz { 172.16.0.0/12; }; acl acllist_local { 192.168.0.0/16; }; |
Не забывайте, что этот файл должен быть подключен в основной конфиг /etc/bind/named.conf с помощью строчки:
1 |
include "/etc/bind/named.conf.acl"; |
Итак, для настройки представлений мы открываем новый файл:
1 |
nano /etc/bind/named.conf.local |
Он будет содержать список представлений (для начала только два). Вставляем в него содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
view "local" { match-clients { acllist_local; }; zone "bissquit.com" { type master; allow-transfer { "none"; }; file "/etc/bind/view/local/bissquit.com"; }; }; view "dmz" { match-clients { acllist_dmz; }; zone "bissquit.com" { type master; allow-transfer { "none"; }; file "/etc/bind/view/dmz/bissquit.com"; }; }; |
Сохраняем файл и закрываем. Далее создадим один родительский каталог и ещё по одному каталогу для каждого представления. Это поможет упорядочить конфигурацию:
1 |
mkdir /etc/bind/view /etc/bind/view/dmz /etc/bind/view/local |
Ну а теперь создаем файлы зон 2 (сначала для представления local). Откроем для редактирования:
1 |
nano /etc/bind/view/local/bissquit.com |
Вставляем содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$TTL 86400 $ORIGIN bissquit.com. @ 1D IN SOA ns1.bissquit.com. hostmaster.bissquit.com. ( 2019060801 ; serial 3H ; refresh 15 ; retry 1w ; expire 3h ; nxdomain ttl ) @ IN NS ns1.bissquit.com. @ IN MX 10 mx1.bissquit.com. @ IN MX 10 mx2.bissquit.com. @ IN A 192.168.0.15 ns1 IN A 192.168.0.14 blog IN A 192.168.0.15 www.blog IN CNAME blog.bissquit.com. mx1.bissquit.com. IN A 192.168.0.11 mx2 IN A 192.168.0.12 |
Теперь открываем для редактирования файл представления dmz:
1 |
nano /etc/bind/view/dmz/bissquit.com |
Вот его содержимое:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
$TTL 86400 $ORIGIN bissquit.com. @ 1D IN SOA ns1.bissquit.com. hostmaster.bissquit.com. ( 2019060801 ; serial 3H ; refresh 15 ; retry 1w ; expire 3h ; nxdomain ttl ) @ IN NS ns1.bissquit.com. @ IN MX 10 mx1.bissquit.com. @ IN MX 10 mx2.bissquit.com. @ IN A 172.16.0.168 ns1 IN A 172.16.0.14 blog IN A 172.16.0.168 www.blog IN CNAME blog.bissquit.com. mx1 IN A 172.16.0.11 mx2 IN A 172.16.0.12 |
Подключаем дополнительный конфиг named.conf.local в основной – /etc/bind/named.conf:
1 |
echo 'include "/etc/bind/named.conf.local";' >> /etc/bind/named.conf |
Подгружаем новую конфигурацию:
1 |
rndc reload |
Если вдруг имена разрешаются неправильно или не разрешаются вообще, то в логах можно посмотреть ошибки подгружения конфигов командой:
1 |
>/var/log/named/default.log && rndc reload && grep -e 'error' /var/log/named/default.log |
Например можете увидеть что-то подобное:
1 2 3 |
09-Jun-2019 19:05:47.282 general: error: dns_master_load: /etc/bind/view/view.dmz:16: www.blog.bissquit.com: CNAME and other data 09-Jun-2019 19:05:47.282 general: error: zone bissquit.com/IN/dmz: loading from master file /etc/bind/view/view.dmz failed: CNAME and other data 09-Jun-2019 19:05:47.282 general: error: zone bissquit.com/IN/dmz: not loaded due to errors. |
Если ошибок у вас нет, самое время проверить как все работает.
Проверка
Итак, с любого клиента в подсети dmz (у меня это 172.16.0.0/12, как и определено в файле named.conf.acl) выполним ряд запросов и убедимся, что сервер отдает именно то, что мы ожидаем:
1 2 3 4 5 6 7 8 9 |
# dig +short -t A @192.168.1.14 bissquit.com 172.16.0.168 # dig +short -t A @192.168.1.14 blog.bissquit.com 172.16.0.168 # dig +short -t MX @192.168.1.14 bissquit.com 10 mx2.bissquit.com. 10 mx1.bissquit.com. # dig +short -t CNAME @192.168.1.14 www.blog.bissquit.com blog.bissquit.com. |
Где 192.168.1.14 – напоминаю, адрес вашего бинда. Если у вас все ещё нет утилиты dig, поставим её командой:
1 |
apt-get update && apt-get install -y dnsutils |
Теперь смотрим что возвращается клиентам в подсети local:
1 2 3 4 5 6 7 8 9 |
# dig +short -t A @192.168.1.14 bissquit.com 192.168.0.15 # dig +short -t A @192.168.1.14 blog.bissquit.com 192.168.0.15 # dig +short -t MX @192.168.1.14 bissquit.com 10 mx2.bissquit.com. 10 mx1.bissquit.com. # dig +short -t CNAME @192.168.1.14 www.blog.bissquit.com blog.bissquit.com. |
Как видно, адреса отличаются, а значит все работает как мы и хотели.
Расширенная конфигурация
С базовой настройкой разобрались и теперь пришло время выяснить какой ещё функционал можно реализовать, используя представления в BIND9. Помните, что в каждое представление вы можете засунуть сколько угодно зон разных типов.
После любого изменения не забывайте подгружать конфигурацию с помощью rndc.
Зоны обратного просмотра
Например вот так может выглядеть файл named.conf.local с секцией обратной зоны внутри представления local (на местах многоточия часть конфигурации пропущена для наглядности):
1 2 3 4 5 6 7 8 9 |
view "local" { ... zone "0.168.192.in-addr.arpa" { type master; allow-transfer { "none"; }; file "/etc/bind/view/local/0.168.192.IN-ADDR.ARPA"; }; }; ... |
Сам файл 0.168.192.IN-ADDR.ARPA может иметь приблизительно такой вид 6, основываясь на данных зоны bissquit.com, которую настраивали в предыдущих главах:
1 2 3 4 5 6 7 8 9 10 11 12 |
$TTL 86400 $ORIGIN 0.168.192.IN-ADDR.ARPA. @ 1D IN SOA ns1.bissquit.com. hostmaster.bissquit.com. ( 2019061101 ; serial 3H ; refresh 15 ; retry 1w ; expire 3h ; minimum ) @ IN NS ns1.bissquit.com. 14 IN PTR ns1.bissquit.com. 168 IN PTR blog.bissquit.com. |
Проверь корректность разрешения записей можно командой:
1 |
dig -t ptr @192.168.1.14 168.0.168.192.in-addr.arpa. |
Идем дальше.
Перенаправление запросов
Предположим, что все локальные зоны (*.local) в нашей воображаемой инфраструктуре хостит контроллер домена и запросы надо перенаправлять на него. Сделать это можно путем добавления дополнительной секции с типом зоны forward:
1 2 3 4 5 6 7 8 9 |
view "local" { ... zone "local" { type forward; forward only; forwarders 172.16.0.50 # DC address }; }; ... |
Для наглядности также пропускаю описанные ранее участки конфигурации.
Стандартные зоны
Есть ряд зон, которые обязательно должны присутствовать в конфигурации сервера имен согласно RFC 1912 7. Собственно эти зоны уже по умолчанию поставляются в BIND9. В основную конфигурацию они подключались файлом named.conf.default-zones, который мы закомментировали в самом начале статьи. Теперь пришло время вернуть дефолтные файлы зон обратно.
Файлы уже лежат в каталоге /etc/bind. Просто добавим в представления следующие куски конфигурации:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
view "local" { ... zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; }; ... |
Готово.
Корневые подсказки
Осталось добавить в наши представления файл зоны со стандартным набором корневых серверов, который также поставляется по умолчанию:
1 2 3 4 5 6 7 8 |
view "local" { ... zone "." { type hint; file "/etc/bind/db.root"; }; }; ... |
Итого представление local внутри файл конфигурации named.conf.local примет следующий вид:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
view "local" { match-clients { acllist_local; }; zone "bissquit.com" { type master; allow-transfer { "none"; }; file "/etc/bind/view/local/bissquit.com"; }; zone "0.168.192.in-addr.arpa" { type master; allow-transfer { "none"; }; file "/etc/bind/view/local/0.168.192.IN-ADDR.ARPA"; }; zone "local" { type forward; forward only; forwarders 172.16.0.50 # DC address }; zone "localhost" { type master; file "/etc/bind/db.local"; }; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127"; }; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0"; }; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255"; }; zone "." { type hint; file "/etc/bind/db.root"; }; }; ... |
На его основе вы можете создать представления любой сложности и столько, сколько вам нужно.