systemd-resolved (Русский)
systemd-resolved — служба systemd, выполняющая разрешение сетевых имён для локальных приложений посредством D-Bus, NSS-службы resolve
(см. nss-resolve(8)) или локальной слушающей DNS-заглушки на адресе 127.0.0.53
. Подробнее об использовании см. systemd-resolved(8).
Установка
systemd-resolved входит в пакет systemd, который установлен по умолчанию.
Настройка
systemd-resolved работает как распознаватель для Системы доменных имён (включая DNSSEC и DNS over TLS), Multicast DNS (mDNS) и Link-Local Multicast Name Resolution (LLMNR).
Настройки распознавателя можно изменить в файле /etc/systemd/resolved.conf
и/или с помощью drop-in-файлов с суффиксом .conf в каталоге /etc/systemd/resolved.conf.d/
. См. resolved.conf(5).
Для запуска systemd-resolved запустите и включите службу systemd-resolved.service
.
DNS
systemd-resolved может выполнять разрешение доменных имён четырьмя различными способами. Все четыре режима работы подробно описаны в руководстве systemd-resolved(8) § /ETC/RESOLV.CONF. Наиболее часто используются следующие два:
- С файлом DNS-заглушки systemd — файл
/run/systemd/resolve/stub-resolv.conf
содержит указание использовать локальную заглушку (local stub) на адресе127.0.0.53
в качестве единственного DNS-сервера, а также список доменов для поиска. Это рекомендуемый режим работы. Файл/etc/resolv.conf
стоит заменить символической ссылкой на файл заглушки, чтобы все процессы использовали последний при разрешения имён:# ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
- С файлом resolv.conf — systemd-resolved работает с файлом
/etc/resolv.conf
как обычный клиент. Этот режим менее разрушителен, поскольку другие программы по-прежнему смогут использовать/etc/resolv.conf
.
/etc/resolv.conf
символической ссылкой на файл заглушки или содержит адреса серверов.Выбор DNS-серверов
resolvectl status
.Автоматически
systemd-resolved работает "из коробки" с сетевыми менеджерами, использующими файл /etc/resolv.conf
. Никаких дополнительных настроек не требуется, поскольку systemd-resolved будет автоматически обнаружен при переходе по символической ссылке /etc/resolv.conf
. Во всяком случае, это работает для systemd-networkd и NetworkManager.
Тем не менее, если какой-то DHCP- или VPN-клиент настраивает сервера имён и домены поиска с помощью resolvconf (список использующих resolvconf программ приведён в статье openresolv#Пользователи), то необходимо дополнительно установить пакет systemd-resolvconf, который предоставляет символическую ссылку /usr/bin/resolvconf
.
- systemd-resolved имеет ограниченный resolvconf-интерфейс и может не работать с некоторыми клиентами, подробнее см. resolvectl(1) § COMPATIBILITY WITH RESOLVCONF(8).
-
systemd-resolvconf работает только при запущенном
systemd-resolved.service
. Если вы не используете systemd-resolved, убедитесь, что пакет systemd-resolvconf удалён, иначе он может создать проблемы с некоторыми сетевыми программами, которые проверяют наличие исполняемого файла/usr/bin/resolvconf
.
Вручную
В режиме локальной DNS-заглушки можно назначить произвольные DNS-серверы, указав их в файле resolved.conf(5):
/etc/systemd/resolved.conf.d/dns_servers.conf
[Resolve] DNS=192.168.35.1 fd7b:d0bd:7a6e::1 Domains=~.
- Если не указать в файле resolved.conf(5) опцию
Domains=~.
, то systemd-resolved может использовать DNS-серверы из настроек отдельных сетевых интерфейсов, если параметрDomains=~.
в них есть. - Данная опция не повлияет на запросы доменных имён, которые совпадают с каким-то более точным поисковым доменом из настроек интерфейса — разрешение таких имён будет выполняться посредством соответствующих "интерфейсных" DNS-серверов.
Подробнее о настройках для сетевых интерфейсов см. systemd-networkd#Файлы network.
Резерв
Если systemd-resolved не получает адреса DNS-серверов от сетевого менеджера и никакие сервера не были настроены вручную, то он использует специальные зарезервированные DNS-адреса. Таким образом, разрешение доменных имён работает всегда.
Изменить адреса можно с помощью параметра FallbackDNS=
в файле resolved.conf(5), например:
/etc/systemd/resolved.conf.d/fallback_dns.conf
[Resolve] FallbackDNS=127.0.0.1 ::1
Чтобы полностью отключить функциональность резервных DNS-серверов, задайте параметр FallbackDNS
без указания адреса:
/etc/systemd/resolved.conf.d/fallback_dns.conf
[Resolve] FallbackDNS=
DNSSEC
Проверка DNSSEC настраивается параметром DNSSEC=
в файле resolved.conf(5).
-
DNSSEC=allow-downgrade
— проверка выполняется только в том случае, если опрашиваемый сервер её поддерживает. -
DNSSEC=true
— проверка выполняется всегда; если сервер не поддерживает DNSSEC, то разрешение доменных имён работать не будет. Пример:
/etc/systemd/resolved.conf.d/dnssec.conf
[Resolve] DNSSEC=true
- Если ваш DNS-сервер не поддерживает DNSSEC и вы испытываете проблемы в стандартном (используется по умолчанию) allow-downgrade-режиме (см. systemd issue 10579), попробуйте полностью отключить DNSSEC в systemd-resolved параметром
DNSSEC=false
. -
systemd-resolved может отключить DNSSEC после нескольких неудачных попыток выполнить проверку. Если задано значение
DNSSEC=true
, то разрешение имён вообще перестанет работать. См. systemd issue 9867.
Проверьте, работает ли DNSSEC, отправив запрос к домену с неправильной подписью:
$ resolvectl query sigfail.verteiltesysteme.net
sigfail.verteiltesysteme.net: resolve call failed: DNSSEC validation failed: invalid
Затем проверьте домен, подпись которого в порядке:
$ resolvectl query sigok.verteiltesysteme.net
sigok.verteiltesysteme.net: 134.91.78.139 -- Information acquired via protocol DNS in 266.3ms. -- Data is authenticated: yes
DNS over TLS
DNS over TLS по умолчанию не работает. Чтобы его включить, задайте параметр DNSOverTLS=
в разделе [Resolve]
файла resolved.conf(5). Чтобы включить проверку сертификата DNS вашего провайдера, добавьте соответствующее имя хоста в параметр DNS=
в формате ip_адрес#имя_хоста
. Например:
/etc/systemd/resolved.conf.d/dns_over_tls.conf
[Resolve] DNS=9.9.9.9#dns.quad9.net DNSOverTLS=yes
С помощью ngrep можно проверить, работает ли DNS over TLS. В этом режиме для DNS-запросов используется порт 853 (вместо стандартного 53). По этой причине при разрешении имени с DoT команда ngrep port 53
не выдаст ничего, а команда ngrep port 853
выведет зашифрованные данные.
Wireshark позволяет более подробно изучить пакеты запросов и ответов DNS over TLS. Установить Wireshark можно с пакетами wireshark-cli и wireshark-qt.
mDNS
systemd-resolved может работать в режиме multicast DNS, причём и как распознаватель (resolver), так и как передатчик (responder).
Распознаватель выполняет разрешение имени хоста по схеме "имя_хоста.local"
mDNS будет работать для конкретного соединения только в том случае, если он включён одновременно и в глобальных настройках systemd-resolved (параметр MulticastDNS=
в resolved.conf(5)), и в настройках сетевого менеджера для данного соединения. systemd-resolved по умолчанию работает как mDNS-передатчик, но systemd-networkd и NetworkManager [1] требуют дополнительных настроек, чтобы включить этот режим для соединений:
- Для systemd-networkd — задайте параметр
MulticastDNS=
в разделе[Network]
, а такжеMulticast=yes
в разделе[Link]
. См. systemd.network(5). - Для NetworkManager — задайте параметр
mdns=
в разделе[connection]
. См. nm-settings(5). Также необходимо включить режим mDNS для каждого сетевого интерфейса, на котором он будет использоваться:systemd-resolve --set-mdns=yes --interface=имя_интерфейса
.
avahi-daemon.service
и avahi-daemon.socket
, чтобы предотвратить конфликты с systemd-resolved./etc/NetworkManager/conf.d/
и задайте параметр connection.mdns=
в разделе [connection]
. См. NetworkManager.conf(5).Если вы планируете использовать mDNS при работающем межсетевом экране, не забудьте открыть UDP-порт 5353
.
LLMNR
Link-Local Multicast Name Resolution — разработанный Microsoft протокол разрешения имён хостов.
LLMNR будет работать для конкретного соединения только в том случае, если он включён одновременно и в глобальных настройках systemd-resolved (параметр LLMNR=
в resolved.conf(5)), и в настройках сетевого менеджера для данного соединения. systemd-resolved по умолчанию работает как LLMNR-передатчик, но systemd-networkd и NetworkManager [2] требуют дополнительных настроек, чтобы включить этот режим для соединений:
- Для systemd-networkd — задайте параметр
LLMNR=
в разделе[Network]
. См. systemd.network(5). - Для NetworkManager — задайте параметр
llmnr=
в разделе[connection]
. См. nm-settings(5).
/etc/NetworkManager/conf.d/
и задайте параметр connection.llmnr=
в разделе [connection]
. См. NetworkManager.conf(5).Если вы планируете использовать LLMNR при работающем межсетевом экране, не забудьте открыть UDP- и TCP-порт 5355
.
Запросы
С помощью утилиты resolvectl можно отправлять запросы к DNS-серверам, а также к mDNS- или LLMNR-хостам.
Например, DNS-запрос выглядит следующим образом:
$ resolvectl query archlinux.org
archlinux.org: 2a01:4f8:172:1d86::1 138.201.81.199 -- Information acquired via protocol DNS in 48.4ms. -- Data is authenticated: no
Решение проблем
systemd-resolved не ищет в локальном домене
Иногда systemd-resolved не может выполнить поиск в локальном домене при передаче ему только имени хоста. При этом возможна ситуация, когда с формальной точки зрения всё в порядке — в соответствующем .network-файле systemd-networkd присутствуют параметры UseDomains=yes
или Domains=[список_доменов]
, в результате чего в файле resolv.conf
, как и положено, появилась строка search [список_доменов]
. Запустите networkctl status
или resolvectl status
, чтобы убедиться, что домены для поиска в самом деле были обнаружены и собраны.
Возможные решения:
- Отключите LLMNR, чтобы systemd-resolved начал присоединять DNS-суффиксы.
- Отредактируйте базу данных
hosts
в файле/etc/nsswitch.conf
(например, удалите опцию[!UNAVAIL=return]
после службыresolve
). - Перейдите на использование полных доменных имён.
- Используйте файл
/etc/hosts
для разрешения имён. - Используйте службу
dns
из библиотеки glibc вместоresolve
из systemd.
systemd-resolved не выполняет разрешение имён без суффикса
Чтобы systemd-resolved выполнял разршение частичных доменных имён, добавьте параметр ResolveUnicastSingleLabel=yes
в /etc/systemd/resolved.conf
.
Судя по всему, это работает только с отключённым LLMNR (LLMNR=no
).
Если вы используете systemd-networkd, то можно использовать в качестве поискового домен, предоставленный DHCP-сервером или IPv6 Router Advertisement. По умолчанию эта возможность отключена; для включения добавьте следующие строки в .network-файл сетевого интерфейса:
[DHCPv4] UseDomains=true [IPv6AcceptRA] UseDomains=yes
Проверить домены для всех интерфейсов можно командой:
$ resolvectl domain
Смотрите также
- Francisco Ros о разрешении доменных имён с systemd-resolved
- Больше примеров в руководстве resolvectl(1) § EXAMPLES