Настройка DNS сервера (BIND9)
Last updated
Last updated
BIND (Berkeley Internet Name Domain) - это реализация протокола DNS. В BIND 9 было сделано несколько серьезных усовершенствований, включая поддержку IPv6, более гибкую конфигурацию и управление, улучшенную производительность кэширования, поддержку EDNS0 для больших ответов UDP и улучшенное управление динамически назначаемыми IP-адресами.
BIND является наиболее широко используемым программным обеспечением сервера имен в Интернете. Он поддерживает ряд различных протоколов службы доменных имен, включая BIND4 (оригинальный Berkeley Internet Name Domain, версия 4), BIND8 (исторический преемник BIND4), а также службы DNS для IPv6 посредством двух отдельных реализаций: одна основана на демоне, а другая называется lwres (light-weight resolver).
Процесс установки довольно прост, но давайте рассмотрим его подробнее. Во-первых, необходимо убедиться, что в системе установлены и обновлены все необходимые пакеты, выполнив следующую команду:
Флаг -y будет автоматически отвечать "да" на все подтверждения, которые могут быть заданы.
Команда apt-get update обновит списки пакетов сервера. При использовании команды apt-get upgrade все установленные на сервере пакеты будут обновлены.
Это займет некоторое время в зависимости от скорости вашего сетевого соединения и количества устанавливаемых обновлений.
Теперь, когда ваша система обновлена, вы можете приступить к установке DNS-сервера - BIND. Это будет сделано путем установки нескольких новых пакетов:
Приведенная выше команда установит BIND9 и два вспомогательных пакета, которые содержат необходимые файлы для правильного функционирования DNS-сервера.
BIND9 - это программное обеспечение DNS-сервера.
bind9utils - это утилиты для управления конфигурацией BIND, а также название команды, используемой для управления BIND из командной строки.
bind9-doc - это пакет документации для программного обеспечения BIND.
Проверка установки сервера DNS
После завершения установки вы можете убедиться, что все пакеты были успешно установлены, выполнив следующую команду:
Приведенная выше команда покажет установленную версию BIND и его зависимостей.
BIND запускается автоматически при установке. Вы можете проверить его состояние с помощью команды systemctl, как показано ниже:
Команда выше даст вам более подробное представление о функциях BIND на вашем сервере, таких как активное время, количество зон и т.д.
Если вы захотите запустить, остановить или перезапустить BIND, просто выполните приведенные ниже команды:
По умолчанию сервер BIND будет работать от имени пользователя и группы bind. Это делает его достаточно безопасным, поскольку любые изменения в файлах зон разрешены только для этого пользователя. По умолчанию сервер BIND слушает DNS-запросы на порту 53. При желании вы можете изменить этот порт в файле named.conf. Выполните следующую команду, чтобы узнать, какой порт прослушивает ваш сервер BIND:
Приведенная выше команда показывает, что названный демон в настоящее время запущен и прослушивает порт 53 UDP. Используйте эту информацию, чтобы проверить, правильно ли вы используете номер порта.
Если ваш сервер не использует порт 53, вы можете исправить это, отредактировав /etc/bind/ named.conf.local и изменив номер порта на любой другой. Вы также можете изменить имя файла журнала сервера, отредактировав /etc/bind/ named.conf.default-zones и добавив утверждения логирования в директиве options.
Теперь, когда BIND9 установлен на вашем сервере, пришло время приступить к его настройке.
Каталог конфигурации для BIND находится в каталоге /etc/bind. В этом каталоге есть несколько важных файлов:
Файл с именем 'named.conf' - это основной конфигурационный файл, который содержит множество комментариев для пояснения каждого раздела.
Следующий конфигурационный файл, который мы будем редактировать, находится по адресу /etc/bind/named.conf.local. Этот файл содержит всю вашу сетевую информацию о сервере и зонах, которые вы хотите разрешать локально (с серверов имен).
Файл named.conf.default-zones находится по адресу /etc/bind/named.conf.default-zones. Этот файл содержит информацию о сервере для зон, используемых BIND, когда ему явно не указано использовать другую зону. Другими словами, зоны, которые включены.
Итак, давайте начнем с базовой конфигурации.
По умолчанию BIND настроен на обслуживание всех доступных интересов, в предыдущих версиях только локального хоста.
Изменим это, отредактировав файл конфигурации named.conf.options
Установим прослушивание только конкретного сетевого интерфейса, задокументировав не нужные нам опции
Сохраните и закройте файл, когда закончите. Затем перезапустите демон BIND9 командой ниже:
Теперь мы разрешили BIND9 прослушивать только определенный интерфейс.
Зоны прямого просмотра являются наиболее распространенным видом файлов зон. Они сопоставляют доменное имя с IP-адресом и используются при преобразовании доменных имен в IP-адреса для электронной почты, веб-страниц и т.д. Следующим шагом будет создание файла зоны прямого просмотра.
Мы отредактируем файл "/etc/bind/named.conf.local", чтобы объявить зону прямого поиска. Для единственной цели этого руководства мы объявим домен под названием "test.local" и укажем его IP-адрес сервера.
Если вы планируете разрешать внешние домены из своей сети, на вашем сервере должен быть установлен действительный IP-адрес с доступом в интернет.
Теперь мы отредактируем файл "/etc/bind/named.conf.local", чтобы объявить зону прямого поиска:
Добавьте следующее в конец файла:
Тип "master". Это файл зоны ведущего домена. Параметр типа может быть установлен в "slave", если вы размещаете прямую или обратную зону только для авторизации и не хотите разрешать динамические обновления.
"/etc/bind/db.domaine.com" - это файл, содержащий записи для домена "test.local" с полным путем.
allow-transfer {xxx.xxx.xxx.xxx;}. Это необходимо, чтобы разрешить передачу зоны на вторичный DNS-сервер хостера, потому что если ваш хостинг-провайдер не разрешит вам это сделать, вы не сможете обновить ее онлайн с помощью команды "rndc reload" на localhost. xxx.xxx.xxx.xxx.xxx; IP-адрес вторичного DNS-сервера (Name Servers), который находится у вашего хостинг-провайдера.
Сохраните и закройте файл, когда закончите.
Теперь мы создадим файл для каждой зоны, объявленной выше:
Заполните файл следующим образом
В этом файле замените значения test.local на ваше доменное имя, за которым следует точка (.) Это необходимо, и это НЕ является ошибкой.
Замените "192.168.0" на ваш публичный IP-адрес, за которым следует точка (.) Это необходимо для того, чтобы сервер был доступен из интернета.
Не забудьте сохранить и закрыть файл после завершения работы.
Зоны обратного поиска используются для сопоставления IP-адреса с доменным именем и обычно требуются для отправки электронной почты. Следующим шагом будет создание файла обратной зоны.
Имя обратной зоны состоит из идентификатора сети (обратного), за которым следует ".in-addr.arpa".
Например:
Если сервер имеет IP-адрес "10.20.30.40", его сетевой ID будет "10.20.30", а имя обратной зоны будет "40.20.10.in-addr.arpa".
Теперь отредактируем файл "/etc/bind/named.conf.local", чтобы объявить обратную зону:
Затем добавьте в файл следующее:
Затем создадим файл для объявленной выше зоны:
Затем заполним файл следующим образом:
Теперь мы проверим синтаксис конфигурации в каждом файле на наличие ошибок. Для этого у нас будет запрос named со следующей командой:
Если ошибок нет, эта команда вернется в пустую оболочку:
Для применения настрок, введите команду
для проверки работы, введите команду nslookup со следующим синтаксисом
к примеру
Для обратной зоны (PTR) синтаксис аналогичный
Первым делом проверим, установлен ли у нас днс сервер в системе:
Сервер имен у нас будет работать в chroot окружении, так что устанавливаем соответствующие пакеты:
Еще раз обращаю внимание, что мы будем использовать bind в chroot среде для увеличения безопасности. Это накладывает определенные особенности в настройке и управлении сервером. Нужно быть внимательным в этих мелочах. Итак, запускаем bind:
Проверяем содержимое chroot каталога:
Все в порядке, сервер запустился, необходимые файлы созданы, все готово для настройки. Займемся ей.
Файл конфигурации нашего сервера располагается по адресу /var/named/chroot/etc/named.conf. Открываем его и приводим к следующему виду:
Эта конфигурация обеспечит работу обычного кэширующего сервера в локальной сети. Комментарии к некоторым параметрам:
listen-on-v6 port 53 { none; }; | Отключили работу на интерфейсе ipv6. |
---|---|
allow-query { 127.0.0.1; 192.168.7.0/24; }; | Разрешаем обычные запросы только из локальной сети. |
allow-recursion { 127.0.0.1; 192.168.7.0/24; }; | Разрешаем рекурсивные запросы только из локальной сети. |
forwarders { 8.8.8.8; }; | Перенаправляем запросы, которые сами не резолвим, на днс сервер гугла. У меня указан он просто для примера. Тут лучше всего указать сначала ДНС серверы провайдера. |
version "DNS Server"; | Скрываем версию бинда, вместо этого выводим указанную строку. |
Не забудьте отредактировать правила фаервола для корректной работы DNS сервера - открыть 53 порт UDP для работы кэширующего сервера, который мы сейчас настроили, и 53 порт TCP для пересылки зон, о которых речь пойдет дальше
Теперь создадим папку для логов. Не забываем, что мы работаем в chroot окружении:
Допустим, нам необходимо в нашем named разместить собственную зону site1.ru. Первым делом создаем файл зоны, которую будет обслуживать dns сервер:
Описание синтаксиса файлов зон достаточно хорошо освещено в интернете, не хочется подробно на этом останавливаться. При желание каждый сам сможет посмотреть, если у него возникнет необходимость настроить поддержку собственной зоны.
Выставляем необходимые права:
Дальше подключаем файл зоны в конфигурационном файле bind - /var/named/chroot/etc/named.conf:
Перечитываем конфигурацию named с помощью rndc:
Если вы хотите на своем сервере держать копию какой-то зоны, взятой с другого dns сервера, то добавьте следующие настройки в конфиг.
10.1.3.4 - ip адрес dns сервера, с которого мы берем зону. Не забудьте на нем разрешить передачу зоны на ваш dns сервер.
Чтобы сервер смог корректно сохранить файл со slave зоной, необходимо добавить разрешение на запись bind для директории /var/named/chroot/var/named. По-умолчанию она имеет следующие права:
Нужно добавить группе named разрешение на запись, чтобы стало вот так:
После этого можно перезапустить bind и проверить, что создался файл слейв зоны. С указанными выше настройками, он будет располагаться по адресу /var/named/chroot/var/named/site.ru.zone. Если у bind не будет прав для создания файла, в логе вы получите ошибку:
Гораздо интереснее и полезнее разобраться с подробным логированием работы сервера. Я долгое время поверхностно хватался за всякие рекомендации и куски примерных конфигов в интернете, пока в не решил разобраться сам с этой темой и не полез в оригинальный мануал.
Bind дает широкие возможности для ведения логов. Можно фиксировать практически все, что связано с работой сервера. Я сейчас на простых примерах покажу, как это работает.
Первым делом в конфигурации мы задаем канал, куда будут складываться логи по тем или иным событиям. Вот пример подобного канала:
Здесь указано название канала, которые мы придумываем сами - general, указан путь до файла, сказано, что хранить будем 3 версии лога размером не более 5 мегабайт. Параметр severity может принимать следующие значения:
critical | Только критические ошибки. |
---|---|
error | Обычные ошибки и все что выше. |
warning | Предупреждения и все, что выше. |
notice | Уведомления и все, что выше. |
info | Информационные сообщения и все что выше. |
debug | Сообщения уровня debug и все, что выше. Уровни debug регулируются значениями 0, 1, 2, 3. |
dynamic | То же, что и debug, только его уровень регулируется глобальной настройкой сервера. |
Параметр print-time указывает на то, что в лог необходимо записывать время события. Помимо указанных мной настроек, в конфигурации канала могут быть добавлены следующие параметры:
print-severity yes | no - указывает, писать или нет параметр severity в лог
print-category yes | no - указывает писать или нет название категории логов
Я эти параметры не указал, так как по-умолчанию устанавливается значение no, которое лично меня устраивает.
Дальше необходимо указать категорию логов и в какой канал мы будем ее записывать:
Категорий у днс сервера bind достаточно много. Вот мой перевод полного списка с описаниями:
default | Сюда будут попадать события всех категорий из этой таблицы, если они не определены отдельно, за исключением категории queries, которую нужно включать специально. То есть если обозначить только категорию default, то в нее будут сыпаться события всех категорий. |
---|---|
general | Эта категория для всех логов, которые не включены ни в одну из перечисленных категорий. |
database | Сообщения, относящиеся к хранению зон и кэшированию. |
security | Подтверждение и отказ в выполнении запросов. |
config | Все, что относится к чтению и выполнению файла конфигурация. |
resolver | Разрешение имен, включая информацию о рекурсивных запросах, выполняемых от имени клиента кэширующим сервером. |
xfer-in | Информация о получении зон. |
xfer-out | Информация о передаче зон. |
notify | Логирование операций протокола NOTIFY. |
client | Выполнение клиентских запросов. |
unmatched | Сообщения, которые named не смог отнести ни к одному классу или для которых не определено отображение. |
network | Логирование сетевых операций. |
update | Динамические апдейты. |
update-security | Подтверждение или отклонение запросов на апдейт. |
queries | Логирование запросов к ДНС серверу. Для включения этой категории необходимо отдельно задать параметр в конфигурации сервера. Это связано с тем, что эта категория генерирует очень много записей в лог файл, что может сказаться на производительности сервера. |
query-errors | Ошибки запросов к серверу. |
dispatch | Перенаправление входящих пакетов модулям сервера на обработку. |
dnssec | Работа протоколов DNSSEC и TSIG. |
lame-servers | Фиксируются ошибки, которые получает bind при обращении к удаленным серверам в попытке выполнить запрос на разрешение имени. |
delegation-only | Логирование запросов, вернувших NXDOMAIN. |
edns-disabled | Запросы, которые вынуждены использовать plain DNS из-за превышения timeouts. |
RPZ | Все операции, связанные с выполнение Response Policy Zone (RPZ). |
rate-limit | Операции связанные с одним или несколькими rate-limit statements в options или view. |
Таким образом, чтобы вывести все категории логов в отдельные файлы, необходимо в конфиг named добавить следующую конструкцию:
Если мы хотим собирать все логи запросов из категории queries, то в раздел options файла конфигурации необходимо добавить параметр, который это разрешает:
Перезапускаем bind:
Первым делом пойдем в каталог с логами и проверим, что там у нас:
Все файлы журнала созданы и начали наполняться. Можно проверить один из них. Например, посмотрим, как наш сервер centos (192.168.7.246) логирует запросы пользователей. Попробуем с компьютера 192.168.7.254 (windows) выполнить nslookup yandex.ru и посмотрим как это отразится в лог файле:
Теперь выполним ping site1.ru, чтобы проверить, как сервер поддерживает нашу зону:
Смотрим, что в логах:
Таким образом очень удобно отследить, куда лезет компьютер. Например, можно поднять временно dns сервер, включить лог запросов. В клиенте указать единственный днс сервер, который мы настроили. Дальше можно отслеживать, к примеру, куда лезет винда после загрузки без нашего ведома. Или откуда грузится реклама в скайпе. Все запросы будут аккуратно складываться в файл, который потом можно спокойно анализировать, а затем, к примеру, настроить запрет сайтов на маршрутизаторе.
DNS - одна из самых важных служб на сервере. Все ее используют. Она нужна всем, и, в конце концов, вы же не хотите, чтобы ваши машины потерялись в сети, потому что не могут найти друг друга. Эта статья содержит руководство по настройке внутреннего DNS-сервера на Debian с использованием программного обеспечения сервера имён BIND (BIND9).