Короткий ответ

На Ubuntu 22.04/24.04 Server /etc/resolv.conf почти всегда symlink на ../run/systemd/resolve/stub-resolv.conf с nameserver 127.0.0.53. Это stub systemd-resolved, не «сломали DNS». Правка файла руками переживёт reboot плохо. Смотрите resolvectl status, uplink DNS из netplan, не ping 8.8.8.8 как доказательство резолва. Внутренние зоны должны идти на внутренний резолвер; публичный 8.8.8.8 не знает host.example.

Адрес узла 10.0.20.10.

Симптомы и как отличить

  • curl https://archive.ubuntu.com падает, curl --resolve работает;
  • getent hosts host.example пусто;
  • SSH по имени не идёт, по IP идёт — SSH может быть вторичным;
  • NTP имя не резолвится — время.
ИнструментЧто проверяет
resolvectl queryresolved + uplink
dig @127.0.0.53stub
dig @10.0.0.53конкретный DNS
getentNSS (nsswitch)

Возможные причины

  1. netplan без nameservers.
  2. resolved stub, но DNSStubListener=no и пустой resolv.conf.
  3. Search domain не тот, короткое имя не клеится.
  4. Uplink DNS только публичный, нет split DNS.
  5. UFW режет 53/tcp к uplink? Обычно UDP/53 исходящий.
  6. Кто-то заменил symlink файлом с nameserver 8.8.8.8.
  7. DNSOverTLS до сервера, который его не умеет.
  8. corrupted /run/systemd/resolve.

Диагностика

ls -l /etc/resolv.conf
cat /etc/resolv.conf
systemctl status systemd-resolved --no-pager
resolvectl status
resolvectl query archive.ubuntu.com
resolvectl query host.example

netplan:

sudo netplan get
ls /etc/netplan/

Не применяйте netplan apply пока не прочитали YAML — можно сбросить IP SSH.

NSS:

grep hosts /etc/nsswitch.conf
getent ahosts host.example

Прямой опрос корпоративного DNS (подставьте свой, не выдумывайте):

resolvectl dns
dig @$(resolvectl dns | awk 'NR==1{print $NF}') host.example

Порт 53:

ss -ulnp | grep 53
sudo ufw status | grep 53

Журнал:

journalctl -u systemd-resolved -b --no-pager | tail -n 50

Решение

ls -l /etc/resolv.conf
sudo ln -sf ../run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
sudo systemctl restart systemd-resolved

Не оставляйте статический файл «чтобы было просто», если не отключаете resolved целиком по стандарту площадки.

Сценарий B. Прописать DNS в netplan

Пример /etc/netplan/00-installer-config.yaml (имена интерфейсов свои):

network:
  version: 2
  ethernets:
    ens3:
      dhcp4: false
      addresses: [10.0.20.10/24]
      routes:
        - to: default
          via: 10.0.20.1
      nameservers:
        addresses: [10.0.20.53, 10.0.20.54]
        search: [example]
sudo netplan generate
sudo netplan apply
resolvectl status

Сценарий C. Split DNS / домен на конкретный интерфейс

sudo resolvectl dns ens3 10.0.20.53
sudo resolvectl domain ens3 example

Постоянно — через netplan nameservers.search / routing policy, не разовые resolvectl без документации (сбросятся).

Сценарий D. Отключить stub (редко)

DNSStubListener=no + resolv.conf/run/systemd/resolve/resolv.conf (uplink nameserver напрямую). Нужно, если приложение не умеет 127.0.0.53. Не смешивайте с NetworkManager без плана.

Сценарий E. Firewall

Разрешите исходящий UDP/53 (и TCP/53 для длинных) к резолверам. Не открывайте inbound 53 на сервере, который не DNS.

netplan apply, DHCP option 6 и split DNS

Если ens3 на DHCP, nameserver из option 6 перезапишет статический DNS при renew. Для сервера 10.0.20.10 лучше static addresses + явные nameservers. Проверка: resolvectl status после dhcpcd/networkd renew.

DNSSEC=yes в resolved при внутреннем DNS без DNSSEC даёт SERVFAIL на корпоративные зоны. Для AD-зон часто DNSSEC=allow-downgrade или no на uplink, не «отключить resolved».

resolvectl dnssec
grep -v '^#' /etc/systemd/resolved.conf

Файл /etc/hosts перекрывает DNS для точных имён. Ошибочная строка 10.0.20.10 host.example на старый IP живёт годами. getent ahosts покажет hosts раньше DNS (nsswitch: files dns).

systemd-resolved слушает 127.0.0.53:53. Если ss -ulnp не показывает его — unit не запущен, stub /etc/resolv.conf бесполезен. systemctl start systemd-resolved.

Не используйте 8.8.8.8 единственным сервером на машине, которой нужен host.example из RFC1918-зоны.

resolvectl flush-caches не аналог Windows ipconfig /flushdns «от всех бед», но полезен после смены uplink. Проверка отрицательного кэша NXDOMAIN:

resolvectl query nosuch.host.example
resolvectl show-cache | head

Долгий NXDOMAIN на опечатку потом мешает, когда имя завели на DNS. Flush после создания записи.

LLMNR=yes на серверной VLAN с Windows-станциями даёт странные ответы на короткие имена. На Ubuntu Server в /etc/systemd/resolved.conf часто LLMNR=no MulticastDNS=no.

Если /etc/resolv.conf указывает на 127.0.0.1 (не .53), кто-то поставил dnsmasq/bind локально. Тогда диагностика resolved не достаточна: смотрите ss -ulnp | grep ':53' и конфиг того демона. Два локальных DNS на 53 — типичный refused.

nsswitch порядок files resolve dns на 24.04 может отличаться от 22.04 (resolve [!UNAVAIL=return] dns). Если systemd-resolved мёртв, [!UNAVAIL=return] не даст упасть на dns. Проверьте man nss-resolve. Симптом: без resolved нет резолва совсем vs fallback на /etc/resolv.conf nameserver.

Для split DNS AD: resolvectl domain ens3 contoso.example и DNS=DC. Публичный uplink на другом интерфейсе не должен быть default для этой зоны. resolvectl query host.contoso.example покажет, с какого интерфейса ушёл запрос.

Не пишите nameserver 127.0.0.53 в netplan — получите петлю. netplan addresses — uplink резолверы, stub создаёт resolved сам.

Как проверить, что проблема устранена

resolvectl query host.example
resolvectl query archive.ubuntu.com
getent hosts host.example
ping -c 1 host.example
sudo apt-get update

Внутреннее и внешнее имя резолвятся ожидаемыми IP. resolv.conf снова stub, если такова политика.

Если не помогло

  • Только IPv6 AAAA ломает: gai.conf precedence, не resolved.
  • Docker 127.0.0.11 vs host resolved — DNS контейнера отдельно.
  • NXDOMAIN для AD SRV — резолвер не тот, как в Windows-статьях, здесь Linux-клиент.

Профилактика

  • DNS только в netplan/NM, не в cron echo.
  • Мониторинг resolvectl query критичных имён.
  • Два внутренних резолвера в netplan.
  • Не давать DHCP option 6 от гостевой Wi‑Fi сети серверам.

FAQ

Почему 127.0.0.53, а не 127.0.0.1?

Так устроен stub listener resolved. Это не loopback-дыра «случайный unbound».

systemd-resolve vs resolvectl?

resolvectl — актуальное имя. Старое ещё работает как symlink.

Можно ли chattr +i resolv.conf?

Ломает обновления. Нет.

MDNS/LLMNR мешает?

На сервере часто отключают LLMNR в resolved.conf. Не путать с unicast DNS.

nss-myhostname отвечает за host.example?

Он отвечает за hostname машины и localhost, не за зону компании.