Имена разрешаются не через ту подсистему
Разрешение имён идёт по списку источников, и порядок в нём определяет ответ. Разные средства могут использовать разные источники: одно берёт ответ из файла узлов, другое обращается к службе. Из-за этого проверка вручную удаётся, а служба узел не находит.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Источники перечислены в неожидаемом порядке
Первый источник, давший ответ, побеждает. Запись в файле узлов перекрывает службу разрешения имён и наоборот.
-
Средства проверки не используют тот же путь
Часть инструментов обращается к серверу напрямую, минуя список источников. Их ответ ничего не говорит о поведении службы.
-
Служба кеширует ответ и держит устаревший
Часть программ разрешает имя один раз при старте. Изменение записи не влияет на работающую службу.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Порядок источников разрешения имён.
grep -E "^hosts:" /etc/nsswitch.confОтвет тем же путём, каким его получает служба.
getent hosts ваш.узелОтвет через службу разрешения имён с подробностями.
resolvectl query ваш.узел 2>/dev/nullРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Первый источник, давший ответ, побеждает. Запись в файле узлов перекрывает службу разрешения имён и наоборот.
- Как проверить
-
Посмотрите порядок источников и итоговые ответы.
grep -E "^hosts:" /etc/nsswitch.conf getent hosts ваш.узел; resolvectl query ваш.узел 2>/dev/null | head -5
- Как исправить
- Приведите порядок источников в соответствие с задачей. Разница между проверкой средством разрешения имён и обращением через стандартные функции возникает именно здесь.
- Почему происходит
- Часть инструментов обращается к серверу напрямую, минуя список источников. Их ответ ничего не говорит о поведении службы.
- Как проверить
-
Сравните ответы разными путями.
getent hosts ваш.узел || echo не разрешается dig +short ваш.узел 2>/dev/null | head -3
- Как исправить
- Проверяйте разрешение имён тем же путём, каким это делает служба. Прямой запрос к серверу — отдельная проверка, а не замена.
- Почему происходит
- Часть программ разрешает имя один раз при старте. Изменение записи не влияет на работающую службу.
- Как проверить
-
Посмотрите, когда служба запускалась, и текущий ответ.
systemctl show myapp.service -p ExecMainStartTimestamp getent hosts ваш.узел
- Как исправить
- Перезапустите службу после изменения записей имён. Для служб с долгим временем работы это обязательный шаг при переносе адресов.
Пример вывода
Запись в файле узлов перекрывает ответ службы. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ grep ^hosts: /etc/nsswitch.conf
hosts: files dns
$ getent hosts db.internal
10.0.0.99 db.internal
$ resolvectl query db.internal
db.internal: 10.0.0.5
myapp[10900]: error: dial tcp 10.0.0.99:5432: connect: connection refused
Связанные ошибки
- Temporary failure in name resolution в журнале службы Служба не может разрешить имя: не готова сеть, нет сервера имён, мешает изоляция. Разбор при загрузке и в работе.
- systemd-resolved: resolv.conf заменён обычным файлом Разрешение имён работает частично: поиск по домену и разные серверы по интерфейсам перестают действовать.
- Docker: unable to configure the Docker daemon — конфликт -H и hosts Адрес прослушивания задан дважды: ключом -H в unit-файле и параметром hosts в daemon.json. Демон отказывается стартовать.
- Node-служба не видит переменные окружения Приложение падает из-за отсутствующих переменных: файл .env не читается службой, окружение задаётся иначе.
- dnsmasq: failed to create listening socket for port 53 Порт 53 занят встроенной службой разрешения имён. Как развести dnsmasq и systemd-resolved.
- systemd-resolved: DNSSEC validation failed, имена не разрешаются Часть имён не разрешается при работающей службе: проверка подписей отвергает ответы промежуточного сервера.
- unbound: проверка подписей не проходит, имена не разрешаются Служба работает, но все ответы отбрасываются: неверное время, устаревший корневой ключ или права на его файл.
- В терминале работает, а под systemd нет Самая частая жалоба: программа запускается руками, но не как служба. Полный разбор отличий окружения.
Где встречается чаще всего
Источники
-
nsswitch.conf(5)
Порядок источников разрешения имён. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено записью в файле узлов, отличной от ответа службы.