Как настроить systemd-resolved и systemd-networkd для использования локального DNS-сервера для разрешения локальных доменов и удаленного DNS-сервера для удаленных доменов?

26

Я подключен к локальной сети с выходом в интернет через шлюз. В локальной сети есть DNS-сервер, который может разрешать имена компьютеров из локальной сети.

Я хотел бы настроить systemd-resolved и systemd-networkd так, чтобы запросы поиска для локальных имен хостов направлялись (маршрутизировались) исключительно на локальный DNS-сервер, а запросы поиска для всех других имен хостов направлялись исключительно на другой, удаленный DNS-сервер.

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

Петр Доброгост
источник

Ответы:

28

В файле конфигурации для локального сетевого интерфейса мы должны указать, что мы хотим получить адрес локального DNS-сервера от DHCP-сервера, используя DHCP=опцию :

[Network]
DHCP=yes

или укажите его адрес явно, используя DNS=опцию :

[Network]
DNS=10.0.0.1

Кроме того, нам нужно указать (в том же разделе) локальные домены, используя Domains=опцию

Domains=domainA.example domainB.example ~example

Мы указываем локальные домены, domainA.example domainB.exampleчтобы получить следующее поведение (из systemd-resolved.service, mand- страницы systemd-resolved ):

Поиск имени хоста, оканчивающегося в одном из доменов для интерфейса, направляется исключительно на соответствующие интерфейсы.

Этот способ hostX.domainA.exampleбудет решаться исключительно нашим локальным DNS-сервером.

Мы указываем, ~exampleчто все домены, оканчивающиеся на example, должны рассматриваться как домены только для маршрутов, чтобы получить следующее поведение (из описания этого коммита):

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

Этот путь hostY.on.the.internetбудет решен исключительно нашим глобальным, удаленным DNS-сервером.

Заметка

В идеале при использовании протокола DHCP локальные доменные имена должны быть получены с DHCP-сервера, а не указываться явно в конфигурационном файле сетевого интерфейса выше. Смотрите UseDomains=вариант . Однако с этой функцией все еще остаются нерешенные проблемы - см. Проблему с опцией systemd-networkd DHCP search domains .

Нам необходимо указать удаленный DNS-сервер в качестве глобального общесистемного DNS-сервера. Мы можем сделать это в /etc/systemd/resolved.confфайле:

[Resolve]
DNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844

Не забудьте перезагрузить конфигурацию и перезапустить сервисы:

$ sudo systemctl daemon-reload
$ sudo systemctl restart systemd-networkd
$ sudo systemctl restart systemd-resolved

Внимание!

Вышеуказанные гарантии применяются только тогда, когда имена разрешаются с помощью systemd-resolved - см. Справочную страницу для nss-resol, libnss_resolve.so.2 и справочную страницу для systemd-resolved.service, systemd-resolved .

Смотрите также:

Ссылки:

Петр Доброгост
источник
6
Рассматривали ли вы не использовать .localв этом примере? Конечно, с avahi это должно было быть зарезервировано для MDNS, и злоупотребление им было большим нет-нет. Мне было бы понятнее использовать example.comили .example .
sourcejedi
1
@sourcejedi Для справки .localопределен как специальный домен в RFC 6762 - Multicast DNS в разделе Multicast DNS Names . Спасибо, исправлено.
Петр Доброгост
Несвязанное примечание: вы также можете самостоятельно принимать ответы.
intelfx
2
Я думаю, что было бы полезно добавить расположение файла конфигурации для локального сетевого интерфейса . Не уверен, что прав /etc/systemd/network/*.network? Нашел здесь superuser.com/a/1365864
Пьер Кордье
1
Я заметил, что этот ответ «В файле конфигурации ...» не отвечает ОП «Давайте предположим, что я не знаю, где находятся файлы конфигурации ...» Как кто-то, кто прибыл сюда в том же состоянии незнания о Расположение конкретных файлов конфигурации, этот ответ является неполным.
Эрик Тауэрс
1

Просто чтобы расширить превосходный ответ @piotrDobrogost, не забудьте настроить его /etc/nsswitch.confдля использования systemd-resolvedв качестве источника разрешения DNS. Ваша hostsдиректива должна выглядеть следующим образом для вашего конкретного случая использования:

/etc/nsswitch.conf

hosts:  files resolve dns

Поэтому, если вы ограничите разрешение только теми доменами, которые указаны в Domainsдирективе, /etc/systemd/resolved.confкак указано выше в разделе « Петр», далее следует обратиться к DNS в порядке источников разрешения имен, указанных, /etc/nsswitch.confкогда домены НЕ найдены в Domainsдирективе:

Следующие ссылки пройдите по ссылке требования указать решительность в /etc/nsswitch.confтак systemd-resolvedконсультируются при разрешении имен:

https://github.com/systemd/systemd/issues/940

Документация по SystemD, которую я нашел ужасной. Мне пришлось собрать воедино понимание из нескольких ссылок, включая ответ Петра выше ;-)

F1Linux
источник
При использовании рекомендованного режима работы systemd-resolved, где /etc/resolve.confесть символическая ссылка на /run/systemd/resolve/stub-resolv.confфайл, который, в свою очередь, содержит адрес преобразователя заглушки DNS systemd- resol, нет необходимости помещать resolveдирективу в /etc/nsswitch.confфайл, поскольку запросы DNS будут направлены (из-за стандартной nss-dnsдирективы) на преобразователь заглушки, который действует в соответствии с правилами systemd-resolved .
Петр Доброгост
@PiotrDobrogost Как вы можете управлять порядком обращения к источникам разрешения DNS, не используя /etc/nsswitch.conf``? In the specimen config above, / etc / hosts` (" файлы "), будет проверяться на статические сопоставления IP: имя, и если ничего не найдено, то разрешается заглушка с разрешением systemd, а затем - , Я не вижу, как можно было бы поэтому установить источники разрешения DNS без использования /etc/nsswitch.conf. Я пропустил трюк здесь?
F1Linux
Я не говорю, что /etc/nsswitch.confэто не нужно. Я говорю, что когда кто-то использует заглушку DNS-преобразователя systemd-resolved, достаточно указать dnsдирективу в hosts:строке (предположительно, после fileдирективы). Там нет необходимости для resolveдирективы там , как это незавершенная распознаватель , который является точкой входа в годов Systemd-разрешенная логики , а не на nss-resolveподключаемый модуль ...
Петр Dobrogost
... Другими словами, вы можете получить доступ к логике systemd-resolved с помощью resolveдирективы ➟ nss-resolution NSS plug-in module ➟ systemd-resolved или с помощью dnsдирективы ➟ nss-dns NSS plug-in module ➟ systemd-resolved's 'stub DNS resolver ver systemd -решен
Петр Доброгост
@PiotrDobrogost Я думаю, что я пришел к filesтому resolveмоменту /etc/nsswitch.confиз 2-й части вашего вопроса. Перечитывая его, похоже, вы только что говорили о проверке локального кэша на предмет IP: сопоставление имен, а затем обращение к серверу пересылки, если он не найден. Я обычно устанавливаю filesпервый источник разрешения DNS, чтобы обойти DNS, чтобы я мог тестировать и не попадать на рабочие хосты
F1Linux