Вопрос или проблема
Я хочу, чтобы 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
Чтобы реализовать такую конфигурацию, необходимо выполнить несколько шагов:
-
Отключение встроенного слушателя
systemd-resolved
:
Для начала нужно отключить стандартный слушатель, который слушает на порту53
. Это можно сделать, изменив файл конфигурацииresolved.conf
. Вам нужно создать или отредактировать файл/etc/systemd/resolved.conf.d/dnsmasqcompatibility.conf
и добавить следующие строки:[Resolve] DNSStubListener=no DNSStubListenerExtra=127.0.0.1:5053
Здесь мы отключаем стандартный слушатель
DNSStubListener
и добавляем конечный точку, которая будет использоватьсяdnsmasq
. -
Настройка
dnsmasq
:
В конфигурационном файлеdnsmasq
, который обычно находится по адресу/etc/dnsmasq.conf
, также нужно указать сервер, к которому будут перенаправляться запросы. Добавьте следующую строку:server=127.0.0.1#5053
Это указывает
dnsmasq
на то, что если он не может разрешить запрос, он должен обращается кsystemd-resolved
, который теперь слушает на порту5053
. -
Установка
/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-запросами.