Что было. На 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.