systemd-resolved: имена не разрешаются
systemd-resolved отвечает за разрешение имён и слушает порт 53 на адресе 127.0.0.53. Проблемы с ним делятся на две группы: конфликт за порт с локальным DNS-сервером и неверная настройка /etc/resolv.conf, из-за которой программы обращаются не туда.
О службе
Правильная схема выглядит так: /etc/resolv.conf — это ссылка на /run/systemd/resolve/stub-resolv.conf, в котором указан один сервер 127.0.0.53. Если файл заменили обычным с внешними серверами, часть механизмов resolved (поиск по доменам, разные серверы для разных интерфейсов) перестаёт работать, хотя имена разрешаются.
Диагностика делается двумя разными командами, и это важно. resolvectl query имя спрашивает через resolved и показывает, какой сервер ответил. Обычный dig имя идёт напрямую и может работать, когда resolved сломан — или наоборот. Разница в результатах сразу указывает, где проблема.
В контейнерах resolved часто не нужен вовсе: разрешение имён обеспечивает среда исполнения. Включённая служба там конфликтует с настройками контейнера и приводит к странному поведению имён.
Как устроена
| Адрес и порт | 127.0.0.53:53 — заглушка, через которую идут запросы программ |
|---|---|
| Правильный resolv.conf | ссылка на /run/systemd/resolve/stub-resolv.conf |
| Диагностика | resolvectl status и resolvectl query имя |
| Кеш | сбрасывается командой resolvectl flush-caches |
| Конфликт | с BIND, dnsmasq и другими локальными DNS-серверами за порт 53 |
Частые ошибки
12 записей базы отмечены за этой службой.
Сообщения журнала
- Address already in use при запуске службыПорт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Connection refused в журнале службыСоединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Cannot assign requested address при привязкеОшибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Temporary failure in name resolution в журнале службыСлужба не может разрешить имя: не готова сеть, нет сервера имён, мешает изоляция. Разбор при загрузке и в работе.
- Имена разрешаются не через ту подсистемуСлужба не находит узел, который виден другим средствам: порядок источников разрешения имён задан иначе.
- Интерфейс не настроен: systemd-networkd не применил описаниеСеть не поднимается: файл описания не подхвачен, интерфейс под управлением другой службы, неверное совпадение по имени.
Коды выхода
- status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.
Ошибки служб
- BIND: порт 53 занят systemd-resolvednamed не может занять порт 53: его держит локальный разрешатель имён. Как развести их по адресам.
- Docker: имена не разрешаются внутри контейнераКонтейнеры не разрешают имена: конфликт с локальным разрешателем, неверные серверы в daemon.json, отключённый проброс.
- dnsmasq: failed to create listening socket for port 53Порт 53 занят встроенной службой разрешения имён. Как развести dnsmasq и systemd-resolved.
- systemd-resolved: resolv.conf заменён обычным файломРазрешение имён работает частично: поиск по домену и разные серверы по интерфейсам перестают действовать.
- unbound: проверка подписей не проходит, имена не разрешаютсяСлужба работает, но все ответы отбрасываются: неверное время, устаревший корневой ключ или права на его файл.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
| status | Что означает у этой службы | Куда смотреть |
|---|---|---|
1/FAILURE |
ошибка в настройках resolved или невозможность занять адрес заглушки. | разбор |
Диагностика
Настройки по интерфейсам: какие серверы используются и что настроено.
resolvectl statusЗапрос через resolved с указанием сервера, который ответил.
resolvectl query example.orgСсылка это или обычный файл: от этого зависит, работает ли схема целиком.
ls -l /etc/resolv.confКто занимает порт 53: при конфликте здесь будет два процесса.
sudo ss -ulnp | grep :53Параметры unit, которые тут важны
Источники
- systemd-resolved.service(8)
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)