Если вы впервые столкнулись с необходимостью поднять 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.Это нормально! Мы ещё не настроили сервер – ошибка происходит из-за этого.
Установите resolvconf:
sudo apt-get install resolvconfПри установке ошибки о невозможности запуска Dnsmasq отобразятся ещё раз. Это нормально.
Пакет resolvconf устанавливается для того, чтобы в файл
/etc/resolv.confпри перезапуске компьютера автоматически записывалась строчкаnameserver 127.0.0.1. Эта строчка показывает, по какому адресу необходимо выполнить DNS-запросы для определения IP адресов доменов.Почему просто не прописать нужный адрес вручную
При рестарте системы файл
/etc/resolv.confавтоматически пересоздаётся. Поэтому если прописать в него нужный адрес вручную, то изменения окажутся стёртыми после перезапуска.По умолчанию после перезапуска в этот файл прописывается адрес
127.0.0.53, который используется сервисомsystemd-resolve. Этот сервис осуществляет определение IP-адресов доменов для приложений, работающих на том же хосте, на котором запущен сервис. Но мы планируем перестать использовать этот сервис и начать использоватьdnsmasq.Необязательный шаг. Установите net-tools:
sudo apt-get install net-toolsЭта команда устанавливает набор инструментов, которые пригодятся при тестировании.
Шаг 2. Настройка пакетов
Отредактируйте файл
/etc/dnsmasq.conf:sudo nano /etc/dnsmasq.conf
По умолчанию все настройки в этом файле закомментированы. Если какие-то настройки в этом файле у вас заданы, то закомментируйте их обра��но и оставьте только те, которые перечислены ниже. Добавлять и менять настройки рекомендуется после проверки исправной работы DNS-сервера.no-resolvЭта настройка выключает загрузку настроек из
/etc/resolv.conf. Все настройки будут браться из редактируемого файла/etc/dnsmasq.conf. Это сильно упрощает конфигурацию Dnsmasq'а, поскольку файл/etc/resolv.confавтоматически пересоздаётся при рестарте системы.server=8.8.8.88.8.8.8- это адрес DNS-сервера Гугл. Этот адрес можно заменить на любой другой адрес публичного DNS-сервера. Например, на адрес DNS-сервера вашего провайдера или ранее используемого DNS-сервера.Запросы, которые не сможет обработать Dnsmasq будут направлены на этот сервер.
listen-address=0.0.0.0Эта настройка позволит осуществлять запросы к Dnsmasq'у с других хостов.
bind-interfacesЗадаёт режим, при котором Dnsmasq не осуществляет привязку к интерфейсам, по которым не должна осуществляться обработка запросов. Без этой настройки в предлагаемом варианте конфигурации сервер не работает.
Добавьте в файл
/etc/hostsнеобходимые домены и их IP адреса.sudo nano /etc/hostsНапример:
1.2.3.4 myserver.tstОбратите внимание, что доменные имена, состоящие из одного имени без точки (например,
myserver), по умолчанию не передаются в DNS-сервер. Запросы по таким именам по умолчанию обрабатываются только через локальный файл/etc/hosts. Поэтому если в файле/etc/hostsна хосте с сервисом Dnsmasq прописать следующую строку:2.3.4.5 myserver, то IP-адрес доменаmyserverбудет определяться только на хосте с сервисом Dnsmasq. На других хостах IP-адрес данного домена определяться не будет, поскольку запросы на хост с Dnsmasq'ом отправляться не будут.Опциональный шаг. Если вы не хотите, чтобы
systemd-resolveслушал адрес127.0.0.53:53, то выполните команду:sudo nano /etc/systemd/resolved.confВ открывшемся файле пропишите строчку:
DNSStubListener=noАдрес
127.0.0.53:53в предлагаемом варианте конфигурации не используется и его можно выключить.Перезапустите машину:
shutdown -r now
Шаг 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-сервера, напишите об этом в комментариях.
