Короткий ответ
На 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 query | resolved + uplink |
dig @127.0.0.53 | stub |
dig @10.0.0.53 | конкретный DNS |
getent | NSS (nsswitch) |
Возможные причины
- netplan без
nameservers. - resolved stub, но
DNSStubListener=noи пустой resolv.conf. - Search domain не тот, короткое имя не клеится.
- Uplink DNS только публичный, нет split DNS.
- UFW режет 53/tcp к uplink? Обычно UDP/53 исходящий.
- Кто-то заменил symlink файлом с
nameserver 8.8.8.8. DNSOverTLSдо сервера, который его не умеет.- 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.examplenetplan:
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Решение
Сценарий A. Вернуть stub symlink
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.confprecedence, не resolved. - Docker
127.0.0.11vs 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, не за зону компании.