- Как настроить простой DNS-сервер для локальной сети
- Шаг 1. Установка необходимых пакетов
- Шаг 2. Настройка пакетов
- Шаг 3. Настройка используемых DNS-серверов
- Шаг 4. Локальное тестирование DNS-сервера
- Шаг 5. Тестирование DNS-сервера с других хостов
- Дополнительная информация
- Заключение
- Помощь
- Подготовка
- Установка DNS-сервера
- Настройка 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 :
- 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-сервера, напишите об этом в комментариях.
Помощь
Собственный сервер имен DNS может пригодиться в случае, если ваш провайдер или регистратор не предоставляет DNS сервер, либо предоставляет на платной основе и вам не подходит вариант сторонних бесплатных DNS серверов, например yandex.
В данной инструкции будет рассмотрена установка и первоначальная настройка DNS-сервера bind9, установленного на ОС Linux
Подготовка
Перед выполнением настройки сервера имён предварительно нужно обзавестись дополнительным IP на сервере, так как для настройки DNS-сервера необходимо как минимум 2 IP, привязанных к серверу. Если вы еще не приобрели дополнительный IP или не добавили его на сетевой интерфейс, вам поможет следующая статья о том, как его заказать.
Далее необходимо обновить систему и открыть UDP порт 53 для работы сервера имён.
Устанавливаем все обновления:
Открываем порт 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-сервера
Устанавливаем DNS-сервер следующей командой:
yum install bind bind-utils -y
И проверяем, что он работает корректно:
Для Debian и Ubuntu
Устанавливаем DNS-сервер следующей командой:
apt install bind9 bind9-utils -y
Добавляем сервис в автозапуск:
И проверяем, что он работает корректно:
Проверяем, что сервис работает:
Получаем, примерно такой вывод:
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-сервера
Откроем файл /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
zone "mydomens.ru" < type master; file "master/mydomens.ru"; allow-transfer < none; >; allow-update < none; >; >;* где mydomens.ru — имя зоны, которую будет обслуживать наш DNS-сервер. Это и есть домен, для которого bind будет хранить записи.
Описание опций настройки зоны:
тип зоны (в нашем случае первичная — значит master). Другие варианты — slave, stub, forward.
Путь к файлу с записями зоны. В данном примере указан относительный путь — то есть файл находится по пути master/mydomens.ru, который начинается относительно рабочей директории (для CentOS это /var/named/, для Ubuntu/Debian /var/cache/bind/).
allow-transfer
Список других DNS-серверов (вторичных) для передачи им зоны. В нашем случае зонные передачи разрешены серверу 192.168.0.15. Можно указывать подсети.
allow-update
Список хостов, с которых разрешено обновление записей в зоне (для DDNS). Можно указать подсети.
Далее создадим папку master и создадим файл зоны.
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) представляет собой продолжительность кэширования записи *каждым звеном* цепочки DNS-серверов. Слишком малое значение увеличит нагрузку на сервер, а большое приведет к слишком длительному процессу изменения записи.
Указание на авторитетность информации, используется для указания на новую зону.
Первой переменной указывается сервер имен, который был оригинальный или первичный источник данных для этой зоны. Т.е. первый сервер в цепочке 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-сервер работает.