Можно ли использовать dnsmasq в качестве локального DNS-сервера и настраивать dnsmasq для перенаправления запросов на локальный сервис systemd-resolved?

Вопрос или проблема

Я хочу, чтобы dnsmasq обрабатывал входящие DNS-запросы сначала, и только потом перенаправлял вопрос на systemd-resolved, если у dnsmasq нет ответа.

Чтобы было совершенно ясно: я знаю, как отключить “DNSStubListener” в systemd-resolved, чтобы dnsmasq был единственным DNS-сервером, работающим на моей системе, но это не то, о чем я спрашиваю.

Насколько я понял, это значит, что мне нужно, чтобы заглушка systemd-resolved работала, но я также должен убедиться, что systemd-resolved не отвечает на входящий DNS-запрос до того, как это сделает dnsmasq. Но как?

(Что касается причины: я хочу использовать DNS-сервер, указанный DHCP, для “нормального” интернет-трафика, что значит, что я не могу жестко задавать верхние DNS-серверы в файле конфигурации dnsmasq. Но я также хочу, чтобы dnsmasq обрабатывал блокировку DNS, специальные имена хостов для локально работающих ВМ, маршрутизацию некоторого, но не всего трафика через VPN-соединение или подобные ситуации.)

Могу ли я использовать опцию “DNSStubListener=no” для systemd-resolved, но также определить “DNSStubListenerExtra=….”, с localhost в качестве IP-адреса, но нестандартным номером порта, и использовать этот адрес в качестве основного верхнего DNS-сервера для dnsmasq? Будет ли такая настройка стабильной?

Пусть systemd-resolved обрабатывает DHCP-серверы и используйте server=127.0.0.53 в Dnsmasq. Пусть /etc/resolv.conf указывает на 127.0.0.1, где слушает Dnsmasq. Но вы столкнетесь с проблемами systemd-resolved, например, с проблемной проверкой DNSSec. Вы предупреждены.

Да, похоже, что это сработало.

То есть, я сделал следующее:

В /etc/systemd/resolved.conf.d/dnsmasqcompatibility.conf:

[Resolve]
DNSStubListener=no
DNSStubListenerExtra=127.0.0.1:5053

А в /etc/dnsmasq.conf:

server=127.0.0.1#5053

Введя это в терминале host www.google.com 127.0.0.1, я получил следующее:

Используя сервер домена:
Имя: 127.0.0.1
Адрес: 127.0.0.1#53
Псевдонимы: 

www.google.com имеет адрес .......
www.google.com имеет адрес IPv6 ......

А это было в /var/log/dnsmasq.log:

 запрос[A] www.google.com от 127.0.0.1
 переслан www.google.com на 127.0.0.1#5053
 ответ www.google.com это .....

(и так далее)

Я также смог подтвердить, что, остановив сервис systemd-resolved, DNS-запросы перешли в режим ожидания.

Я, вероятно, также должен добавить no-resolv в /etc/dnsmasq.conf, чтобы принудить все запросы направлять на порт 5053, но не знаю, изменит ли это что-либо, так как все равно будут использоваться DNS-серверы, известные systemd-resolved, независимо от того, были ли IP-адреса взяты из файла или из второго DNS-сервера (через пересланный запрос).

Ответ или решение

Да, dnsmasq можно использовать в качестве локального DNS-сервера и настроить его так, чтобы он перенаправлял запросы к службе systemd-resolved, если не может обработать их самостоятельно. Этот подход позволяет вам использовать функциональные возможности обеих служб, а также вести себя гибко в условиях динамически меняющейся конфигурации сетевых адресов, например, получая DNS-серверы через DHCP.

Настройка dnsmasq и systemd-resolved

Чтобы реализовать такую конфигурацию, необходимо выполнить несколько шагов:

  1. Отключение встроенного слушателя systemd-resolved:
    Для начала нужно отключить стандартный слушатель, который слушает на порту 53. Это можно сделать, изменив файл конфигурации resolved.conf. Вам нужно создать или отредактировать файл /etc/systemd/resolved.conf.d/dnsmasqcompatibility.conf и добавить следующие строки:

    [Resolve]
    DNSStubListener=no
    DNSStubListenerExtra=127.0.0.1:5053

    Здесь мы отключаем стандартный слушатель DNSStubListener и добавляем конечный точку, которая будет использоваться dnsmasq.

  2. Настройка dnsmasq:
    В конфигурационном файле dnsmasq, который обычно находится по адресу /etc/dnsmasq.conf, также нужно указать сервер, к которому будут перенаправляться запросы. Добавьте следующую строку:

    server=127.0.0.1#5053

    Это указывает dnsmasq на то, что если он не может разрешить запрос, он должен обращается к systemd-resolved, который теперь слушает на порту 5053.

  3. Установка /etc/resolv.conf:
    Убедитесь, что файл /etc/resolv.conf указывает на 127.0.0.1, то есть на dnsmasq, как на первичный DNS-сервер:

    nameserver 127.0.0.1

Проверка работоспособности конфигурации

Вы можете протестировать настройку, используя команду host или dig, проверки работоспособности DNS-запроса. Например, вы можете выполнить следующую команду:

host www.google.com 127.0.0.1

Если всё настроено правильно, вы должны увидеть ответ, указывающий IP-адреса для www.google.com. В логах dnsmasq также будет отображаться информация о перенаправленных запросах, которая поможет вам убедиться, что работает всё так, как задумано:

query[A] www.google.com from 127.0.0.1
forwarded www.google.com to 127.0.0.1#5053
reply www.google.com is ...

Дополнительные рекомендации

Настоятельно рекомендуется добавить параметр no-resolv в файл конфигурации dnsmasq. Это предотвратит использование локальных файлов, таких как /etc/resolv.conf для определения DNS-серверов:

no-resolv

Тем не менее, учтите, что если вы используете DHCP для получения DNS-серверов, системы будут продолжать получать актуальные DNS-адреса от systemd-resolved. Это важно, так как это позволит вам получать изменения автоматически.

Заключение

Указанный подход является стабильным и эффективным для организации локального DNS с использованием dnsmasq, который также учитывает динамически меняющиеся настройки сети через DHCP. Следуя этим шагам, вы сможете использовать преимущества обеих сервисов, оставаясь гибкими и минимизируя проблемы, связанные с управлением DNS-запросами.

Оцените материал
Добавить комментарий

Капча загружается...