Если вы впервые столкнулись с необходимостью поднять DNS-сервер для локальной сети под Linux, то эта статья – для вас. Преимущество предлагаемого способа – простота: сервер можно настроить буквально за несколько минут. Но этот способ, скорее всего, не подойдёт для продакшн серверов.

Автор статьи провёл несколько часов в борьбе с ошибками, багами и непонятным поведением системы прежде чем получил стабильный результат.

Далее будем считать, что имеется локальная сеть, состоящая из нескольких хостов. Локальная сеть настроена, сетевой доступ между хостами имеется. На хостах установлен Ubuntu 18.04.4 LTS (для других версий не проверялось).

Шаг 1. Установка необходимых пакетов

Следующие шаги выполняются на хосте, на котором будет устанавливаться DNS-сервер.

  1. Установите 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.

    Это нормально! Мы ещё не настроили сервер – ошибка происходит из-за этого.

  2. Установите 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.

  3. Необязательный шаг. Установите net-tools:

    sudo apt-get install net-tools

    Эта команда устанавливает набор инструментов, которые пригодятся при тестировании.

Шаг 2. Настройка пакетов

  1. Отредактируйте файл /etc/dnsmasq.conf:

    sudo nano /etc/dnsmasq.conf

    По умолчанию все настройки в этом файле закомментированы. Если какие-то настройки в этом файле у вас заданы, то закомментируйте их обратно и оставьте только те, которые перечислены ниже. Добавлять и менять настройки рекомендуется после проверки исправной работы DNS-сервера.

    1. no-resolv

      Эта настройка выключает загрузку настроек из /etc/resolv.conf. Все настройки будут браться из редактируемого файла /etc/dnsmasq.conf . Это сильно упрощает конфигурацию Dnsmasq'а, поскольку файл /etc/resolv.conf автоматически пересоздаётся при рестарте системы.

    2. server=8.8.8.8 

      8.8.8.8 - это адрес DNS-сервера Гугл. Этот адрес можно заменить на любой другой адрес публичного DNS-сервера. Например, на адрес DNS-сервера вашего провайдера или ранее используемого DNS-сервера.

      Запросы, которые не сможет обработать Dnsmasq будут направлены на этот сервер.

    3. listen-address=0.0.0.0

      Эта настройка позволит осуществлять запросы к Dnsmasq'у с других хостов.

    4. bind-interfaces

      Задаёт режим, при котором Dnsmasq не осуществляет привязку к интерфейсам, по которым не должна осуществляться обработка запросов. Без этой настройки в предлагаемом варианте конфигурации сервер не работает.

  2. Добавьте в файл /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'ом отправляться не будут.

  3. Опциональный шаг. Если вы не хотите, чтобы systemd-resolve слушал адрес 127.0.0.53:53, то выполните команду:

    sudo nano /etc/systemd/resolved.conf

    В открывшемся файле пропишите строчку:

    DNSStubListener=no

    Адрес 127.0.0.53:53 в предлагаемом варианте конфигурации не используется и его можно выключить.

  4. Перезапустите машину:

    shutdown -r now

Шаг 3. Настройка используемых DNS-серверов

Данная настройка выполняется на всех хостах-клиентах, с которых будут отправляться запросы на хост с сервисом Dnsmasq.

Проще всего настроить используемые DNS-сервера в графическом интерфейсе. Укажите адрес хоста, на котором установлен Dnsmasq, первым в списке:

Шаг 4. Локальное тестирование DNS-сервера

Проверку настроек можно и не делать. Но если вам интересно узнать, всё ли работает правильно, то выполните следующие команды на хосте с сервисом Dnsmasq.

  1. Проверьте, что в файле /etc/resolve.conf прописан адрес 127.0.0.1:

    cat /etc/resolve.conf

  2. Выполните команду:

    sudo netstat -tulpen

    Вы должны увидеть, что адрес 0.0.0.0:53 занят Dnsmasq'ом, а адрес 127.0.0.53:53 не фигурирует в списке.

  3. Выполните команду:

    dig ya.ru

    Вы должны получить вывод, в котором присутствует примерно такая строчка. В начале строки не должно быть символов ;.

    ya.ru. 220 IN A 87.250.250.242

  4. Выполните команду:

    dig myserver.tst

    Вы должны получить вывод, в котором присутствует примерно такая строчка:

    myserver.tst. 0 IN A 1.2.3.4

Шаг 5. Тестирование DNS-сервера с других хостов

Теперь можно проверить работу DNS-сервера с других хостов.

Выполните пункты 3 и 4 из предыдущего раздела. Вывод в консоль должен быть аналогичен результатам, указанным в предыдущем разделе.

Дополнительная информация

Открыть, если что-то пошло не так
  1. Следующая команда в режиме реального времени выводит в консоль все запросы, выполняемые на порт 53. Это помогает определить факт выполнения запросов.

    sudo tcpdump -l port 53

    Данную команду логично выполнять в другом терминале – не в том, в который вводятся команды, подлежащие проверке.

  2. Обратите внимание, что DNS-запросы кэшируются и сервисом systemd-resolved, и сервисом dnsmasq. Для сброса кэша проще всего перезапустить используемый сервис:

    sudo systemctl restart dnsmasq (на серверном хосте)

    sudo systemctl restart systemd-resolved(на клиентских хостах)

Заключение

В этой статье мы рассмотрели, как можно сравнительно быстро настроить DNS-сервер для локальной сети под Linux. Если вы знаете какие-то другие фишки по настройке DNS-сервера, напишите об этом в комментариях.

Комментарии (10)


  1. Sazonov
    27.01.2023 05:12
    +4

    Добавьте, пожалуйста, пункт 0) с ответом на вопрос зачем это в принципе может быть нужно.


  1. aik
    27.01.2023 05:32
    +3

    Для дома для семьи проще како-нибудь pihole взять.
    Простая установка, управление через вебинтерфейс.
    Заодно рекламу порежете.


  1. splix
    27.01.2023 06:39
    +5

    А Шаг 3 точно имеет смысл делать на каждой машине? Может это можно на роутере это настроить один раз для всех?


    1. Nazar_Kam
      27.01.2023 10:59

      Согласен. Этим реально проще маршрутизатор озадачить, прописав в настройки DHCP необходимый сервер (сервера).

      Но я считаю, что с функционалом данного локального сервера прекрасно справится маршрутизатор. Например, в домашнем Mikrotik я спокойно могу задать IP адреса локальным серверам через IP → DNS → Static.


  1. NikaLapka
    27.01.2023 06:46
    +2

    Во-первых,

    Пакет resolvconf устанавливается для того, чтобы в файл /etc/resolv.conf при перезапуске компьютера автоматически записывалась строчка nameserver 127.0.0.1

    Возможно вы получаете настройки сети по DHCP, поэтому и перезаписывается resolv.conf или используете какой-то сторонний нетворк мэнеджер. Потому, что например с дефолтным

    /etc/network/interfaces

    allow-hotplug eth0
    iface eth0 inet static
    address 192.168.1.2
    netmask 255.255.255.0
    gateway 192.168.1.1

    Файл resolv.conf самостоятельно не изменяется.

    Во-вторых,

    failed to create listening socket for port 53: Address already in use

    По умолчанию после установки Debian в минимальной конфигурации, никакие сервисы не прослушивают 53 порт. Возможно вам стоит уточнить, что такое у вас установленно и откуда, что данный порт занят.

    По крайне мере, всё выше перечисленное, действительно для текущего latest Debian 11.6.

    Послесловие, я не совсем понимаю, почему вы используете Ubuntu 18.04.4 LTS ведь это Old Releases. Единственная причина - это VPS от какого-то хостинг провайдера, но тогда бегите от него. К любому нормальному хостеру где у вас будет возможность самостоятельно установить систему с ISO, "обычный" дебиан\убунту. А то это всё равно, что купить старый, латанный автоваз, с дикими и непонятными изменениями от прошлых хозяев, и заниматься на нём тюнингом.


  1. garwall
    27.01.2023 11:30

    Добавьте в файл /etc/hosts необходимые домены и их IP адреса.

    Но зачем, Бэрримор? address=/your.domain.name/11.22.33.44 в том же dnsmasq.conf


  1. Lazhu
    27.01.2023 12:13

    В этих ваших линухах нет даже DNS сервера из коробки?

    echo 'local-data: "blah.blah.blah. IN A 192.168.x.y"' >> /var/unbound/unbound.conf

    все необходимое и достаточное для домашнего DNS


    1. skymal4ik
      27.01.2023 13:04

      В этих ваших линухах нет даже DNS сервера из коробки?

      Всё есть в репах, просто по умолчанию не везде ставится - зависит от дистра и выбора пакетов при установке.

      А в этих ваших виндах он сразу ставится и работает после установки, и на серверах, и на рабочих станциях? </sarcasm>


      1. Lazhu
        27.01.2023 13:31

        Где вы в винде видели unbound?

        В *BSD, Solaris и их деривативах (eg TrueNas) является частью системы. Одной командой добавить в загрузку, второй добавить DNS запись.


  1. Johan_Palych
    27.01.2023 14:32
    +2

    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.
    Это нормально! Мы ещё не настроили сервер – ошибка происходит из-за этого

    В Ubuntu 18.04.6 LTS по умолчанию установлен легковесный кэширующий DNS-сервер systemd-resolve(слушает 127.0.0.53)

    sudo systemctl disable systemd-resolved --now
    sudo systemctl enable --now dnsmasq

    Пора начинать думать об апгрейде или подключаться к Extended Security Maintenance (ESM):
    Free for personal use - Anyone can use Ubuntu Pro for free on up to 5 machines, or 50 if you are an official Ubuntu Community member.
    Ubuntu 18.04.6 LTS - End of Standard Support: April 2023
    Ubuntu 18.04.6 ESM - Start of ESM: April 2023 End of Life: April 2028