После установки сетевого клиента на сервере пропало разрешение имён: за resolv.conf борются сразу три службы, и нужно оставить одну

Что было. На Linux-машине после установки клиента оверлейной сети DNS начал работать через раз: то резолвит, то нет. Виновником оказался не сам клиент, а то, что /etc/resolv.conf одновременно переписывали dhcpcd, NetworkManager и systemd-resolved, а клиент добавил четвёртого участника.

Как устроено разрешение имён на современном Linux. Программы читают /etc/resolv.conf. Кто его пишет, зависит от дистрибутива и установленных служб:

  • systemd-resolved держит локальный резолвер на 127.0.0.53 и делает /etc/resolv.conf символической ссылкой на свой файл (stub-resolv.conf); настоящие серверы видны через resolvectl status.
  • NetworkManager по умолчанию отдаёт серверы в systemd-resolved, но может писать resolv.conf сам.
  • DHCP-клиенты (dhcpcd, dhclient) при получении адреса тоже переписывают файл, если не запрещено.
  • Клиенты оверлейных сетей и контейнерные движки добавляют свои серверы или правила.
    Если пишущих больше одного, файл меняется непредсказуемо: одна служба ставит внутренние серверы, другая через минуту возвращает публичные.

Решение автора (подтверждено). Оставить одну службу управляющей:

  • dhcpcd: в /etc/dhcpcd.conf строка nohook resolv.conf.
  • NetworkManager: в /etc/NetworkManager/conf.d/dns.conf [main] dns=systemd-resolved (или dns=none, если DNS задаётся руками).
  • systemd-resolved включён и является единственным владельцем /etc/resolv.conf (ссылка на /run/systemd/resolve/stub-resolv.conf).
    Плюс справедливый вопрос участника: зачем на одной машине и NetworkManager, и dhcpcd, если первый уже умеет всё сам.

Как найти, кто пишет файл.

ls -l /etc/resolv.conf          # ссылка или обычный файл, куда ведёт
resolvectl status               # что думает resolved
grep -r resolv /etc/dhcpcd.conf /etc/NetworkManager/ 2>/dev/null
systemctl list-units --type=service | grep -Ei 'resolved|NetworkManager|dhcpcd|dhclient'

Если файл обычный и его кто-то регулярно переписывает, inotifywait -m /etc/resolv.conf покажет момент изменения, а journalctl --since вокруг этого момента виновника.

Для сервера на Ubuntu рецепт короткий: netplan → systemd-networkd → systemd-resolved, DNS-серверы задаются в netplan (nameservers:), resolv.conf не трогать руками, NetworkManager и dhcpcd не ставить. Для контейнеров и оверлейных клиентов настраивать интеграцию через resolvectl dns <iface> и домены маршрутизации (resolvectl domain), а не правку файла.

Служба описана в документации systemd.