ZEROLAB
Настройка DNS сервера bind9. Ubuntu/Debian. Пошаговая инструкция

Сегодня мы поговорим о настройке, пожалуй, самого популярного DNS сервера bind9. Следуйте инструкции, и у Вас всё получится, в этом нет ничего сложного. В этом примере Вы увидите как формируются файлы зон и проследите процесс простой настройки, не вдаваясь при этом в подробности. Это лишь небольшое HowTo, призванное помочь Вам понять принцип работы DNS сервера. Если же Вы настраиваете DNS сервер на шлюзе в сегменте Вашей локальной сети, то в конце статьи Вы увидите как сделать Ваш DNS сервер кэширующим, что позволит существенно сократить время повторного запроса к NS серверам, ведь посещённые адреса будут браться из Вашего локального кэша. Ну что ж, приступим.
Если у Вас ещё не установлен bind9, проделаем это:
apt-get install bind9
Отредактируем файл /etc/init.d/sysklogd, он должен выглядеть следующим образом:
# # Top configuration file for syslogd # # # Full documentation of possible arguments are found in the manpage # syslogd(8). # # # For remote UDP logging use SYSLOGD="-r" # SYSLOGD="-u syslog"
Перезапустим демона sysklogd:
/etc/init.d/sysklogd restart
Приступим к настройке файла зоны для нашего домена. В качестве примера будет выступать домен zerolab.net. Создаём файл конфигурации для наших зон myzones.conf в папке /etc/bind, содержимое файла:
zone "zerolab.net" < type master; file "/etc/bind/zerolab.net"; >;
Теперь непосредственно создадим наш файл зоны zerolab.net в той же папке /etc/bind:
$ORIGIN zerolab.net. $TTL 86400 ; 1 day @ IN SOA zerolab.net. root.zerolab.net. ( 2008082859 ; serial 14400 ; refresh (4 h) 3600 ; retry (1 h) 2592000 ; expire (4w2d) 600 ; minimum (10 minute) ) NS ns1.zerolab.net. NS ns2.bla-bla-bla.com. zerolab.net. A 192.168.0.1 *.zerolab.net. CNAME @ zerolab.net. MX 10 mail.zerolab.net. mail.zerolab.net. A 192.168.0.1 ns1 A 192.168.0.1
Где 192.168.0.1 — IP Вашего сервера, MX запись нам нужна если Вы поднимаете на своем сервере почтовый сервер. ns1.zerolab.net — наш DNS сервер. Так как для функционирования DNS сервера требуется помимо master ns сервер и slave, прописываем его — ns2.bla-bla-bla.com. Естественно у Вас он должен быть на стороннем сервере, либо если у Вас есть ещё выделенный IP для Вашего сервера, то задача упрощается. Для сервера, находящегося в локальной сети и выдающего имена только в локальную сеть (к примеру у Вас установлен web-сервер, обслуживающий Вашу сеть и настроены виртуальные хосты), достаточно лишь прописать ns1, т.е. адрес Вашего DNS сервера. 2008082859 — смените на текущую дату.
Выставим нужные права на файл зоны zerolab.net:
chown bind:bind /etc/bind/zerolab.net
Отредактируем файл конфигурации bind /etc/bind/named.conf, включив в него конфигурацию для наших зон, добавим в конец файла:
. //Вырезано для экономии места. include "/etc/bind/myzones.conf";
Ну и обновим конфигурацию bind командой:
rndc reload
Если у Вас DNS сервер установлен на шлюзе в Вашей локальной сети, сделаем его кэширующим. Открываем файл /etc/bind/named.conf.options и раскомментируем следующую строку:
forwarders < . >;
Добавим в неё IP адреса DNS серверов к которым будет обращаться наш сервер, с большой долей вероятности у Вашего провайдера есть свои DNS сервера, укажем их первыми, тем самым экономя трафик:
forwarders < 10.0.0.x; //Первый адрес DNS сервера моего провайдера 10.0.0.x; //Второй адрес DNS сервера моего провайдера x.x.x.x; x.x.x.x; x.x.x.x; >;
Перезапускаем наш DNS сервер:
/etc/init.d/bind9 restart
Ну а далее не забудьте поменять DNS адрес в /etc/resolv.conf на свой.
Вернёмся к особенностям настройки DNS сервера на выделенном сервере, когда нам необходимо прописать два ns адреса. myzones.conf примет немного другой вид:
zone "zerolab.net" < type master; file "/etc/bind/zerolab.net"; allow-trasfer ; //Указываем IP адрес нашего slave ns сервера >;
При настройке на slave сервере myzones.conf примет такой вид:
zone "zerolab.net" < type slave; file "/etc/bind/zerolab.net"; masters < 192.168.0.1; >; allow-notify < address_match_list; >; //allow-notify < список-шаблонов-адресов >; (первичный сервер зоны, от кого наш сервер как вторичный уполномоченный сервер будет принимать извещения об изменениях зоны. Замените address_match_list >;
На этом всё, настройка закончена. 😉 Удачи!
Поднимаем свой DNS
В один «прекрасный момент» Руцентр сделал услугу Управление ДНС платной, что повлекло за собой трудности, например, с настройкой почты для домена от Яндекса. Для себя я решил эту проблему, подняв свой DNS сервер на linux. Настройки будут для Centos 7, но отличие от других систем только в процессе установки пакетов и их именах.
Легенда
- NAME.site — домен, который и нужно припарковать.
- 1.1.1.1 — белый IP сервера, к которому паркуем домен (Сервер, на котором будет работать сайт).
- 2.2.2.2 — белый IP сервера, на котором будет установлен DNS сервер.
- OLD.site — уже существующий и работающий домен которому нужно будет создать пару поддоменов: ns1.OLD.site и
ns2.OLD.site — про это расскажу ниже.
Установка и настройка «bind9» AKA «named»
Сам DNS поднимем на bind9 также известном как named:
yum install -y bind bind-utils
После установки нужно внести в конфиг (/etc/named.conf) пару изменений:
listen-on port 53 < 127.0.0.1;2.2.2.2; >; allow-query < any; >;
Также, в этом же файле, создаем зону:
zone "NAME.site" IN < type master; file "NAME.site.zone"; allow-update < none; >; >;
Настраиваем зону:
Теперь нужно создать конфигурационный файл, для нашего домена: /var/named/NAME.site.zone
$TTL 86400 @ IN SOA ns1.NAME.site. root.NAME.site ( 2014130401 ;Serial 3600 ;Refresh 1800 ;Retry 604800 ;Expire 86400 ;Minimum TTL ) ; Указываем два name сервера IN NS ns1.NAME.site. IN NS ns2.NAME.site. ; Определяем IP адреса name серверов ns1 IN A 2.2.2.2 ns2 IN A 2.2.2.2 ; Define hostname -> IP нашего сервера для этого домена @ IN A 1.1.1.1 www IN A 1.1.1.1
По хорошему, нужно создавать два NS сервера (один мастер, а второй слейв), для отказоустойчивости, но для текущей задачи это не нужно, т.к. данный ДНС будет использоваться только до момента подтверждения прав на домен у Яндекса.
Но если все же решите настроить еще и слейв, то стоит учесть, что число в строчке Serial нужно увеличивать при каждом изменении в файле, иначе slave сервер обновлять данные не будет.
systemctl enable named systemctl start named
Тестирование:
Для проверки нужно выполнить в консоли:
dig @2.2.2.2 NAME.site. axfr
— в ответе должен придти IP адрес 1.1.1.1 (адрес к которому паркуем домен).
Если dig в системе нет, то устанавливаем:
yum -y install bind-utils
Финал:
Руцент не хочет принимать вместо адреса ДНС сервера IP, поэтому нужно будет настроить два поддомена ns1.NAME.site и ns1.NAME.site (Обычные записи типа A), ссылающиеся на 2.2.2.2 (сервер, на котором поднят bind 9)
Помощь
Собственный сервер имен DNS может пригодиться в случае, если ваш провайдер или регистратор не предоставляет DNS сервер, либо предоставляет на платной основе и вам не подходит вариант сторонних бесплатных DNS серверов, например yandex.
В данной инструкции будет рассмотрена установка и первоначальная настройка DNS-сервера bind9, установленного на ОС Linux
Подготовка
Перед выполнением настройки сервера имён предварительно нужно обзавестись дополнительным IP на сервере, так как для настройки DNS-сервера необходимо как минимум 2 IP, привязанных к серверу. Если вы еще не приобрели дополнительный IP или не добавили его на сетевой интерфейс, вам поможет следующая статья о том, как его заказать.
Далее необходимо обновить систему и открыть UDP порт 53 для работы сервера имён.
Для CentOS
Устанавливаем все обновления:
Открываем порт 53 в firewall:
firewall-cmd —permanent —add-port=53/udp
И сохраняем настройки сетевого экрана:
Для Debian и Ubuntu
Обновляем доступный список пакетов для установки:
Если в системе настроен брандмауэр, добавляем правило на разрешение входящих пакетов на 53 UDP-порт:
iptables -I INPUT -p udp —dport 53 -j ACCEPT
* данной командой мы вставляем первое правило на разрешение 53 порта по протоколу UDP.
Установка DNS-сервера
Для CentOS
Устанавливаем DNS-сервер следующей командой:
yum install bind bind-utils -y
systemctl enable named
Запускаем сервис имен:
systemctl start named
И проверяем, что он работает корректно:
systemctl status named
Для Debian и Ubuntu
Устанавливаем DNS-сервер следующей командой:
apt install bind9 bind9-utils -y
Добавляем сервис в автозапуск:
systemctl enable named
Запускаем сервис имен:
systemctl start bind9
И проверяем, что он работает корректно:
systemctl status bind9
Проверяем, что сервис работает:
dig ya.ru @127.0.0.1
Получаем, примерно такой вывод:
dig ya.ru @127.0.0.1 ; > DiG 9.16.1-Ubuntu > ya.ru @127.0.0.1 ;; global options: +cmd ;; Got answer: ;; ->>HEADER* в секции "ANSWER SECTION" видим, что домен YA.ru привязан к IP-адресу 87.250.250.242
Если в секции ANSWER SECTION домену ya.ru не найдено соответствие IP-адресу, значит DNS-сервер работает не верно и требуются дополнительные манипуляции по подготовке к его работе.
Настройка DNS-сервера
Для CentOS
Откроем файл /etc/named.conf
Отредактируем следующие строки:
listen-on port 53 < 127.0.0.1; localhost; 192.168.0.1; 192.168.0.2 >; . allow-query < any; >;*где 192.168.0.1, 192.168.0.2 — это IP ваших NS-адресов
И добавляем информацию о доменной зоне в конец конфигурационного файла:
zone "mydomens.ru" < type master; file "master/mydomens.ru"; allow-transfer < none; >; allow-update < none; >; >;* где mydomens.ru — имя зоны, которую будет обслуживать наш DNS-сервер. Это и есть домен, для которого bind будет хранить записи.
Для Ubuntu/Debian
Откроем файл /etc/bind/named.conf.options
allow-query < any; >;
В файл /etc/bind/named.conf.local добавляем информацию о доменной зоне:zone "mydomens.ru" < type master; file "master/mydomens.ru"; allow-transfer < none; >; allow-update < none; >; >;* где mydomens.ru — имя зоны, которую будет обслуживать наш DNS-сервер. Это и есть домен, для которого bind будет хранить записи.
Описание опций настройки зоны:
Опция
Описание
type
тип зоны (в нашем случае первичная — значит master). Другие варианты — slave, stub, forward.
file
Путь к файлу с записями зоны. В данном примере указан относительный путь — то есть файл находится по пути master/mydomens.ru, который начинается относительно рабочей директории (для CentOS это /var/named/, для Ubuntu/Debian /var/cache/bind/).
allow-transfer
Список других DNS-серверов (вторичных) для передачи им зоны. В нашем случае зонные передачи разрешены серверу 192.168.0.15. Можно указывать подсети.
allow-update
Список хостов, с которых разрешено обновление записей в зоне (для DDNS). Можно указать подсети.
Далее создадим папку master и создадим файл зоны.
CentOS
mkdir /var/named/master touch /var/named/master/mydomens.ruUbuntu/Debian
mkdir /var/cache/bind/master touch /var/cache/bind/master/mydomens.ruОтредактируем созданный файл зоны, добавив в него DNS-записи:
$TTL 14400 mydomens.ru. IN SOA ns1.mydomens.ru. admin.mydomens.ru. ( 2019121812 ;Serial 3600 ;Refresh 3600 ;Retry 604800 ;Expire 86400 ;Negative Cache TTL ) IN NS ns1.mydomens.ru. IN NS ns2.mydomens.ru. IN MX 10 mail @ IN A 192.168.0.1 ns1 IN A 192.168.0.1 ns2 IN A 192.168.0.2 www IN A 192.168.0.1 mail IN A 192.168.0.1Параметр
Описание
$TTL
Время жизни (TTL) представляет собой продолжительность кэширования записи *каждым звеном* цепочки DNS-серверов. Слишком малое значение увеличит нагрузку на сервер, а большое приведет к слишком длительному процессу изменения записи.
SOA-запись
Указание на авторитетность информации, используется для указания на новую зону.
Первой переменной указывается сервер имен, который был оригинальный или первичный источник данных для этой зоны. Т.е. первый сервер в цепочке DNS серверов, на котором лежит всегда актуальная информация о зоне. В нашем случае это ns1.mydomens.ru.
Второй переменной указываем почтовый ящик лица, ответственного за данную зону. Знак @ следует заменить точкой: admin.mydomens.ru.
Serial — порядковый номер изменения. Его необходимо каждый раз менять вручную при редактировании файла. С его помощью вторичный сервер (если такой есть), может определить, что были изменения и начать процесс копирования настроек. Рекомендуемый формат записи: YYYYMMDD##
где ## счетчик изменений в этот день.
Refresh — интервал времени перед тем, как зона должна быть обновлена.
Retry — интервал времени, который должен пройти после неудачной попытки обновления зоны перед повторным обновлением.
Expire — интервал времени, который должен пройти после того, как первичный сервер имен стал недоступен. Если в течение указанного времени первичный сервер не станет доступен, вторичный перестанет отдавать информацию о зоне.
Собственно, доменное имя хоста. Может записываться без домена (как в данном примере) — он будет дописан автоматически. Также может быть записан полностью с доменом — в таком случае необходимо поставить точку на конце, например, mail.mydomens.ru. Если не указывается или обозначается знаком собаки (@), запись создается для имени зоны (в данном случае, mydomens.ru).
Всегда используется IN (Internet). Указывает на тип сети.
Основные типы записей, использующиеся в DNS:
A — сопоставляет имя узла и соответствующий IP-адрес.
NS — указатель на DNS-серверы, которые обслуживают данную зону.
MX — почтовая запись. Указывает на почтовые серверы, которые обслуживают домен. Поддерживает приоритезацию — при указании нескольких записей, клиент будет ориентироваться на значение той, для которой указано меньшее число.
CNAME — alias или псевдоним. Перенаправляет запрос на другую запись.
TXT — произвольная запись. Чаще всего используется для настройки средств повышения качества отправки почтовых сообщений.
Используется IP-адрес, имя узла, текстовая запись.
После выполнения всех настроек необходимо перезапустить сервер имен для применения конфигурации.
systemctl restart named && systemctl restart bind9
Проверка работы
Для выполнения проверки работоспособности с другого компьютера выполним команду dig:
# dig @192.168.0.1 mydomens.ru ; > DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.8 > @192.168.0.1 mydomens.ru ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER* после @ идёт адрес сервера, с которого запрашивается информация о доменном имени.
Если в секции ANSWER SECTION видим свой домен и соответствующий ему IP, настроенный нами в А записи, значит настройка выполнена корректно и DNS-сервер работает.
Как настроить простой DNS-сервер для локальной сети
Если вы впервые столкнулись с необходимостью поднять DNS-сервер для локальной сети под Linux, то эта статья – для вас. Преимущество предлагаемого способа – простота: сервер можно настроить буквально за несколько минут. Но этот способ, скорее всего, не подойдёт для продакшн серверов.
Автор статьи провёл несколько часов в борьбе с ошибками, багами и непонятным поведением системы прежде чем получил стабильный результат.
Далее будем считать, что имеется локальная сеть, состоящая из нескольких хостов. Локальная сеть настроена, сетевой доступ между хостами имеется. На хостах установлен Ubuntu 18.04.4 LTS (для других версий не проверялось).
Шаг 1. Установка необходимых пакетов
Следующие шаги выполняются на хосте, на котором будет устанавливаться DNS-сервер.
Установите Dnsmasq: sudo apt-get install dnsmasq При установке выведутся следующие ошибки:
failed to create listening socket for port 53: Address already in use
FAILED to start up
Failed to start dnsmasq — A lightweight DHCP and caching DNS server.При рестарте системы файл /etc/resolv.conf автоматически пересоздаётся. Поэтому если прописать в него нужный адрес вручную, то изменения окажутся стёртыми после перезапуска. По умолчанию после перезапуска в этот файл прописывается адрес 127.0.0.53 , который используется сервисом systemd-resolve . Этот сервис осуществляет определение IP-адресов доменов для приложений, работающих на том же хосте, на котором запущен сервис. Но мы планируем перестать использовать этот сервис и начать использовать dnsmasq .
Шаг 2. Настройка пакетов
- Отредактируйте файл /etc/dnsmasq.conf :
sudo nano /etc/dnsmasq.conf
- no-resolv Эта настройка выключает загрузку настроек из /etc/resolv.conf . Все настройки будут браться из редактируемого файла /etc/dnsmasq.conf . Это сильно упрощает конфигурацию Dnsmasq'а, поскольку файл /etc/resolv.conf автоматически пересоздаётся при рестарте системы.
- server=8.8.8.8 8.8.8.8 - это адрес DNS-сервера Гугл. Этот адрес можно заменить на любой другой адрес публичного DNS-сервера. Например, на адрес DNS-сервера вашего провайдера или ранее используемого DNS-сервера. Запросы, которые не сможет обработать Dnsmasq будут направлены на этот сервер.
- listen-address=0.0.0.0 Эта настройка позволит осуществлять запросы к Dnsmasq'у с других хостов.
- bind-interfaces Задаёт режим, при котором Dnsmasq не осуществляет привязку к интерфейсам, по которым не должна осуществляться обработка запросов. Без этой настройки в предлагаемом варианте конфигурации сервер не работает.
Шаг 3. Настройка используемых DNS-серверов
Данная настройка выполняется на всех хостах-клиентах, с которых будут отправляться запросы на хост с сервисом Dnsmasq.
Проще всего настроить используемые DNS-сервера в графическом интерфейсе. Укажите адрес хоста, на котором установлен Dnsmasq, первым в списке:
Шаг 4. Локальное тестирование DNS-сервера
Проверку настроек можно и не делать. Но если вам интересно узнать, всё ли работает правильно, то выполните следующие команды на хосте с сервисом Dnsmasq.
- Проверьте, что в файле /etc/resolve.conf прописан адрес 127.0.0.1 : cat /etc/resolve.conf
- Выполните команду: sudo netstat -tulpen Вы должны увидеть, что адрес 0.0.0.0:53 занят Dnsmasq'ом, а адрес 127.0.0.53:53 не фигурирует в списке.
- Выполните команду: dig ya.ru Вы должны получить вывод, в котором присутствует примерно такая строчка. В начале строки не должно быть символов ; . ya.ru. 220 IN A 87.250.250.242
- Выполните команду: dig myserver.tst Вы должны получить вывод, в котором присутствует примерно такая строчка: myserver.tst. 0 IN A 1.2.3.4
Шаг 5. Тестирование DNS-сервера с других хостов
Теперь можно проверить работу DNS-сервера с других хостов.
Выполните пункты 3 и 4 из предыдущего раздела. Вывод в консоль должен быть аналогичен результатам, указанным в предыдущем разделе.
Дополнительная информация
Открыть, если что-то пошло не так
- Следующая команда в режиме реального времени выводит в консоль все запросы, выполняемые на порт 53. Это помогает определить факт выполнения запросов. sudo tcpdump -l port 53 Данную команду логично выполнять в другом терминале – не в том, в который вводятся команды, подлежащие проверке.
- Обратите внимание, что DNS-запросы кэшируются и сервисом systemd-resolved, и сервисом dnsmasq. Для сброса кэша проще всего перезапустить используемый сервис: sudo systemctl restart dnsmasq (на серверном хосте) sudo systemctl restart systemd-resolved (на клиентских хостах)
Заключение
В этой статье мы рассмотрели, как можно сравнительно быстро настроить DNS-сервер для локальной сети под Linux. Если вы знаете какие-то другие фишки по настройке DNS-сервера, напишите об этом в комментариях.
