Безопасность и администрирование 13 мин чтения 2026-09-30

Ошибка «Temporary failure in name resolution» на VDS: почему Linux и Docker теряют интернет и как починить резолвинг DNS

Практическая инструкция по диагностике и устранению сбоев преобразования доменных имен на серверах Ubuntu и Debian: восстановление симлинка resolv.conf, настройка службы systemd-resolved, устранение конфликтов со встроенным резолвером Docker 127.0.0.11 и проверка сетевых портов.

Инженерная редакция SysKit Проверено инженерами SysKit.ru

Ситуация, знакомая каждому администратору и разработчику: сервер внезапно теряет возможность обращаться к внешним ресурсам. Команды apt update, curl, git clone или docker pull прерываются с сообщением Could not resolve host или критической ошибкой «Temporary failure in name resolution». При этом сетевое соединение живо: прямые пинги до публичных IP-адресов (например, ping 77.88.8.8 или ping 1.1.1.1) проходят без единой потери пакетов.

Причина кроется в сбое подсистемы преобразования доменных имен (DNS-резолвинга). В современных дистрибутивах Linux (Ubuntu 22.04 / 24.04 LTS, Debian 12) архитектура управления DNS претерпела серьезные изменения по сравнению со старыми выпусками: за разрешение имен отвечает демон systemd-resolved через локальный сокет-заглушку, а Docker использует собственную изолированную логику трансляции запросов. В этой практической инструкции мы разберем анатомию сбоя, проведем экспресс-диагностику и устраним все типовые источники проблемы.

1. Симптомы сбоя: почему пинг по IP работает, а доменные имена недоступны

Сетевой стек операционной системы разделяет транспортную доставку пакетов (уровень IP-маршрутизации L3) и прикладной уровень разрешения символических имен в сетевые адреса. Системные вызовы getaddrinfo() и gethostbyname() обращаются к локальным резолверам через библиотеку glibc (файл /etc/nsswitch.conf), прежде чем приложение вообще попытается открыть TCP/UDP-сокет.

Характерные проявления сбоя

При отказе резолвера транспортная маршрутизация функционирует безупречно, однако любое приложение, использующее доменные имена, завершает работу с аварийным кодом: утилита curl https://api.telegram.org возвращает ошибку curl: (6) Could not resolve host, менеджер пакетов apt не может обновить репозитории, а скрипты на Python, Node.js или PHP падают с фатальными исключениями сетевого ввода-вывода.

Для быстрой проверки гипотезы выполните два встречных теста в консоли сервера:

# Тест 1: Проверка прямого IP-канала (L3)
ping -c 3 77.88.8.8

# Тест 2: Проверка символьного резолвинга
ping -c 3 syskit.ru

Если тест по IP проходит успешно (0% packet loss), а тест по доменному имени моментально возвращает ping: syskit.ru: Temporary failure in name resolution — физический линк и таблица маршрутизации шлюза исправны. Сбой локализован строго в цепочке DNS-резолвинга.

2. Архитектура DNS в современных дистрибутивах: systemd-resolved, stub-listener 127.0.0.53 и resolv.conf

Чтобы осознанно починить систему, а не просто применить случайную команду из интернета, важно понимать актуальную цепочку обработки DNS-запроса в Ubuntu и Debian:

Звено цепочки Роль в операционной системе Файл или адрес
/etc/nsswitch.conf Определяет приоритет источников. По умолчанию строка: hosts: files resolve [!UNAVAIL=return] dns. /etc/nsswitch.conf
Символическая ссылка Указывает системным библиотекам адрес локального заглушечного резолвера (stub listener). /etc/resolv.conf
Локальный stub Служба systemd-resolved слушает этот адрес на 53 порту, кэширует ответы и пересылает запросы на внешние DNS. 127.0.0.53:53
Внешние апстримы Авторитетные рекурсивные DNS-серверы провайдера, Яндекса, Cloudflare или Google. 77.88.8.8, 1.1.1.1

Ключевая точка уязвимости — файл /etc/resolv.conf. Исторически это был статичный конфигурационный файл. В современных системах под управлением systemd он обязан быть символической ссылкой на /run/systemd/resolve/stub-resolv.conf. Если старый скрипт, панель управления или утилита NetworkManager заменили эту ссылку обычным файлом со статическим содержимым, то при смене сети или падении указанного там IP-адреса вся сетевая подсистема прекращает резолвинг.

3. Экспресс-диагностика VDS за 2 минуты: команды для поиска узкого места

Для локализации проблемы выполните последовательно четыре команды. Они покажут, на каком именно этапе рвется цепочка преобразования имен.

# Шаг 1: Проверка статуса службы systemd-resolved
sudo systemctl status systemd-resolved

# Шаг 2: Просмотр активных DNS-серверов и привязок к интерфейсам
resolvectl status

# Шаг 3: Проверка типа файла /etc/resolv.conf (симлинк или обычный файл)
ls -la /etc/resolv.conf

# Шаг 4: Тестовый запрос напрямую к локальному stub-резолверу
dig @127.0.0.53 syskit.ru +short

При нормальной работе системы утилита ls -la /etc/resolv.conf обязана показать стрелку символической ссылки:

lrwxrwxrwx 1 root root 39 Feb 15 10:20 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf

Если команда resolvectl status выводит пустые списки в графе DNS Servers, служба systemd-resolved находится в состоянии inactive (dead) или запрос через dig @127.0.0.53 зависает по таймауту — переходим к устранению конкретной неисправности.

Проверка резолвинга онлайн

Для проверки того, как ваш домен резолвится публичными мировыми серверами независимо от состояния VDS, используйте бесплатный чекер DNS:

Самая распространенная причина ошибки после ручной настройки VPN, установки пакетов resolvconf или переноса сервера — превращение /etc/resolv.conf в обычный статичный файл с неактуальными записями.

# Проверяем содержимое файла
cat /etc/resolv.conf

Если вы видите строки вроде nameserver 10.0.0.1 или nameserver 127.0.0.1, при этом файл не является ссылкой, восстановите эталонную конфигурацию systemd:

# Удаляем поврежденный статичный файл или битый симлинк
sudo rm -f /etc/resolv.conf

# Создаем корректную символическую ссылку на stub-resolv.conf
sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

# Перезапускаем службу резолвинга
sudo systemctl restart systemd-resolved

# Проверяем результат
ping -c 2 syskit.ru

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

5. Причина 2: Сбой службы systemd-resolved и настройка надежных upstream DNS

Иногда сервер получает сетевые настройки по DHCP от виртуального шлюза провайдера, но предоставленные провайдером DNS-серверы начинают терять пакеты, попадают под блокировки или зависают. В этом случае локальный stub 127.0.0.53 не получает ответов и возвращает приложению ошибку Temporary failure in name resolution.

Настроим независимые, отказоустойчивые внешние апстримы напрямую в конфигурационном файле /etc/systemd/resolved.conf.

# Открываем файл конфигурации
sudo nano /etc/systemd/resolved.conf

Приведите блок [Resolve] к следующему эталонному виду (раскомментируйте и заполните директивы):

[Resolve]
DNS=77.88.8.8 1.1.1.1 8.8.8.8
FallbackDNS=77.88.8.1 1.0.0.1 8.8.4.4
Domains=~.
DNSSEC=allow-downgrade
DNSOverTLS=opportunistic
MulticastDNS=no
LLMNR=no
Cache=yes

Значение ключевых директив

Директива Domains=~. сообщает системе, что указанные DNS-серверы являются глобальными маршрутизаторами для абсолютно всех зон (символ ~. означает корневую зону). Режим DNSSEC=allow-downgrade защищает от сбоев резолвинга, если домен настроен криво и не поддерживает валидацию подписей. Опция DNSOverTLS=opportunistic включает шифрование DNS-трафика при доступности со стороны апстрима без риска заблокировать подключение.

Примените настройки и сбросьте накопившийся кэш DNS-ответов:

# Перезапуск службы
sudo systemctl restart systemd-resolved

# Сброс локального DNS-кэша
sudo resolvectl flush-caches

# Проверка активного статуса
resolvectl status

В выводе команды вы должны увидеть список указанных DNS-серверов в секции Global. Проверьте запрос через утилиту resolvectl:

resolvectl query syskit.ru

Команда должна вывести актуальные IP-адреса и подтверждение разрешения имени через выбранный апстрим.

Рекомендуемые VDS-провайдеры

Отказоустойчивые сервера с быстрыми NVMe и каналом до 1 Гбит/с

Выбор редакции
⚡

Timeweb Cloud — Быстрые NVMe VDS

Высокоскоростная сетевая инфраструктура со встроенными Anycast DNS-серверами, каналом до 1 Гбит/с и защитой от сетевых аномалий.

Конфигурация
1 vCPU 3.3 ГГц • 1 ГБ RAM • 15 ГБ NVMe • Трафик без лимита
Премиум Tier III
🔷

Selectel — Надежные облачные серверы

Корпоративные дата-центры уровня Tier III, резервированные аплинки, приватные подсети и отказоустойчивые рекурсивные DNS-резолверы.

Конфигурация
1 vCPU • 2 ГБ RAM • 30 ГБ NVMe • Резервирование каналов
Быстрый старт
🟠

Beget — Простота и стабильность

Удобная панель управления сервером, автоматическая сетевая конфигурация из коробки и мгновенное развертывание дистрибутивов.

Конфигурация
1 vCPU 3.0 ГГц • 1 ГБ RAM • 15 ГБ NVMe • Быстрый старт

7. Причина 3: Специфика Docker — почему хост видит сеть, а контейнеры выдают ошибку DNS

Классическая ловушка для DevOps-инженеров и сисадминов: на самом сервере VDS команды curl и ping выполняются моментально, но внутри Docker-контейнеров сборка образов (RUN apt-get update) или запуск приложений завершается ошибкой Temporary failure in name resolution.

Почему Docker не может использовать 127.0.0.53 хоста

Каждый контейнер Docker функционирует в изолированном пространстве имен сети (network namespace). Внутри контейнера петлевой IP 127.0.0.53 указывает на собственный виртуальный loopback-интерфейс контейнера, где никакой службы systemd-resolved нет и быть не может.

По этой причине демон Docker при чтении хостового /etc/resolv.conf игнорирует локальный адрес 127.0.0.53 и по умолчанию подставляет в контейнеры публичные DNS Google (8.8.8.8 и 8.8.4.4). Если провайдер хостинга или сетевые правила фильтруют прямые UDP-запросы на 8.8.8.8, контейнеры полностью слепнут.

Чтобы раз и навсегда решить эту проблему на уровне всего хоста, задайте глобальные DNS-серверы в конфигурации демона /etc/docker/daemon.json:

{
  "dns": [
    "77.88.8.8",
    "1.1.1.1"
  ],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "20m",
    "max-file": "3"
  }
}

Примените настройки перезапуском Docker:

sudo systemctl restart docker

Проверьте работоспособность резолвинга внутри свежего изолированного контейнера:

docker run --rm alpine nslookup syskit.ru

Если вывод возвращает адресное соответствие без задержек — подсистема DNS в Docker работает стабильно.

8. Причина 4: Блокировки фаервола UFW, проблемы с DNSSEC и таймауты

Если адресные серверы прописаны корректно, но запросы продолжают зависать по таймауту, проверьте сетевой экран сервера. DNS работает преимущественно по протоколу UDP на 53 порту, однако при получении ответов размером более 512 байт (например, при ответах с ключами DNSSEC или объемными TXT-записями) протокол автоматически переключается на TCP порт 53.

Проверка сетевого порта онлайн

Убедиться в доступности и открытости необходимых сетевых портов на сервере можно с помощью сканера портов SysKit:

Если на сервере включен межсетевой экран UFW с политикой блокировки исходящих соединений по умолчанию (default deny outgoing), обязательно откройте 53 порт для обоих протоколов:

# Разрешаем исходящий DNS-трафик по UDP и TCP
sudo ufw allow out 53/udp
sudo ufw allow out 53/tcp

# Перезагружаем правила UFW
sudo ufw reload

Протестировать доступность удаленного DNS-сервера по TCP можно с помощью встроенной утилиты Netcat:

# Проверка TCP-порта 53 на сервере Яндекса
nc -zvw3 77.88.8.8 53

Ответ Connection to 77.88.8.8 53 port [tcp/domain] succeeded! подтверждает, что фаервол и канал хостинг-провайдера не блокируют DNS-трафик.

9. Итоговый чек-лист сетевой устойчивости сервера

Для закрепления результата и предотвращения повторных сбоев пройдите по контрольному чек-листу настройки сетевого стека:

  1. Проверка симлинка: Файл /etc/resolv.conf является символической ссылкой на ../run/systemd/resolve/stub-resolv.conf.
  2. Апстримы в resolved: В /etc/systemd/resolved.conf явно указаны DNS=77.88.8.8 1.1.1.1 и Domains=~., исключающие зависимость от сбоев шлюза провайдера.
  3. Режим DNSSEC: Установлен флаг DNSSEC=allow-downgrade, предотвращающий падение резолвинга зон с ошибками криптографических подписей.
  4. Глобальный DNS в Docker: В /etc/docker/daemon.json прописан внешний массив "dns": ["77.88.8.8", "1.1.1.1"].
  5. Исходящие порты: Фаервол UFW пропускает исходящий трафик на 53 порт по протоколам UDP и TCP.

Комплексная диагностика сетевой инфраструктуры

Регулярно тестируйте связность серверов, проверяйте DNS-записи доменов и сетевые порты с помощью бесплатных инженерных инструментов SysKit.ru. Быстрая проверка внешнего адреса сервера доступна в чекерe IP.

Инструменты SysKit по теме статьи

Бесплатные утилиты для проверки и диагностики вашего сервера

Вопросы и ответы (FAQ)

Популярные вопросы вебмастеров и сисадминов по данной теме

Почему нельзя просто вписать nameserver 8.8.8.8 в /etc/resolv.conf вручную?
В современных дистрибутивах (Ubuntu 20.04/22.04/24.04, Debian) файл /etc/resolv.conf управляется сетевыми демонами (systemd-resolved или NetworkManager) и является символической ссылкой. Если отредактировать его напрямую, файл превратится в статический, а при следующей перезагрузке сервера, обновлении сетевого интерфейса по DHCP или переподключении VPN файл будет затерт или перезаписан. Корректный подход — задавать адреса DNS через конфигурацию /etc/systemd/resolved.conf или Netplan.
Почему Docker-контейнеры не используют адрес 127.0.0.53 с хоста?
Каждый контейнер Docker работает в собственном изолированном сетевом пространстве имен (network namespace). Локальный адрес 127.0.0.53 внутри контейнера указывает на его собственный loopback-интерфейс, где служба systemd-resolved не запущена. Поэтому демон Docker отбрасывает петлевые адреса хоста и переключается на встроенный резолвер 127.0.0.11, которому требуются внешние upstream DNS (задаваемые в /etc/docker/daemon.json).
Что делать, если ошибка появляется только при обращении к определенным доменам?
Это указывает на проблему с валидацией DNSSEC у конкретной зоны или сброс пакетов большого размера по UDP. При включенном строгом DNSSEC (DNSSEC=yes) любой просроченный ключ или некорректная подпись авторитетного сервера приведут к блокировке ответа. Решением является перевод параметра в режим DNSSEC=allow-downgrade в /etc/systemd/resolved.conf, а также проверка открытости порта 53 по протоколу TCP.

Читайте также в блоге SysKit

Смежные руководства и полезные технические статьи