LinuxRuLinux без лишней теории
Сеть и DNS

DNS в Linux: как сменить сервер, включить DNS over TLS и очистить кэш

Редакция LinuxRu7 мин чтенияИнструкции

Чтобы сменить DNS в Linux, сначала выясните, кто управляет /etc/resolv.conf: в Ubuntu и Fedora это systemd-resolved вместе с NetworkManager, поэтому серверы задают в свойствах подключения или в resolved.conf, а не правкой файла. Ниже команды для nmcli, netplan и resolvectl, настройка DNS over TLS и очистка кэша командой resolvectl flush-caches.

DNS в Linux: как сменить сервер, включить DNS over TLS и очистить кэш
Фото: No machine-readable author provided. SolarKennedy~commonswiki assumed , Public domain, Wikimedia Commons
Содержание
  1. Кто резолвит
  2. resolvectl
  3. Сменить DNS
  4. Глобальный DNS
  5. DNS over TLS
  6. Очистка кэша
  7. Диагностика
  8. Частые вопросы

Кто отвечает за DNS в вашей системе

Прежде чем менять DNS-сервер, выясните, кто в системе управляет разрешением имён. Иначе получится классика: вы правите /etc/resolv.conf, а через десять минут NetworkManager молча перезаписывает файл. Цепочка обычно такая: программа спрашивает имя у системной библиотеки, библиотека смотрит в /etc/nsswitch.conf и /etc/resolv.conf, а там указан либо внешний сервер, либо локальный резолвер вроде systemd-resolved.

Две команды отвечают на вопрос почти всегда:

ls -l /etc/resolv.conf
systemctl is-active systemd-resolved

Если resolv.conf оказался символической ссылкой на /run/systemd/resolve/stub-resolv.conf, а служба активна, у вас systemd-resolved: в файле будет nameserver 127.0.0.53, это локальная заглушка, а реальные серверы спрятаны глубже. Обычный файл с комментарием Generated by NetworkManager означает, что его пишет NetworkManager напрямую.

СистемаРезолвер по умолчаниюГде менять DNS
Ubuntu 26.04 Desktop, Linux Mintsystemd-resolved + NetworkManagerнастройки сети, nmcli
Ubuntu Serversystemd-resolved + netplan / networkdфайл netplan
Fedora 44systemd-resolved + NetworkManagernmcli, resolved.conf
Debian 13обычно NetworkManager или ifupdown, resolved не установленnmcli или /etc/resolv.conf
Arch Linuxчто настроите самизависит от выбора

systemd-resolved: смотрим текущие серверы

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

resolvectl status
resolvectl dns
resolvectl query linuxru.link

В выводе status ищите блок Global (серверы из конфигурационного файла) и блоки по интерфейсам (Link 2 (enp3s0), wlan0), туда попадают адреса, выданные роутером по DHCP. Строка Current DNS Server показывает, к кому служба обращается прямо сейчас. Команда query выполняет запрос через resolved и сообщает, с какого интерфейса пришёл ответ и был ли он из кэша.

Если resolved выключен, а вы хотите его использовать, включите службу и переведите resolv.conf на заглушку. В Debian сначала поставьте отдельный пакет systemd-resolved, в Arch он уже входит в systemd:

sudo systemctl enable --now systemd-resolved
sudo ln -sf ../run/systemd/resolve/stub-resolv.conf /etc/resolv.conf

Управление службами подробно описано в статье про systemctl.

Как сменить DNS в Linux через NetworkManager

На десктопе правильнее всего менять DNS в свойствах подключения. Тогда настройка привязана к конкретной сети: дома один сервер, в офисе DNS компании, и ничего не перезапишется. В GNOME это Настройки, Сеть, шестерёнка у подключения, вкладка IPv4: выключите автоматический DNS и впишите адреса через запятую. В KDE Plasma то же самое в разделе Подключения.

Из терминала, через nmcli. Сначала узнайте имя подключения, потом задайте серверы и запретите брать DNS от роутера:

nmcli connection show
sudo nmcli connection modify "Wired connection 1" ipv4.dns "9.9.9.9 1.1.1.1" ipv4.ignore-auto-dns yes
sudo nmcli connection modify "Wired connection 1" ipv6.dns "2620:fe::fe" ipv6.ignore-auto-dns yes
sudo nmcli connection up "Wired connection 1"

Без ignore-auto-dns ваши адреса добавятся к адресам роутера, и система будет спрашивать то один сервер, то другой. Проверьте результат через resolvectl dns или, если resolved нет, через cat /etc/resolv.conf. Остальные параметры подключения (IP-адрес, шлюз, маршруты) разобраны в статье настройка сети через nmcli.

Ubuntu Server и netplan

На сервере без NetworkManager DNS прописывают в YAML-файле в /etc/netplan/, в блоке нужного интерфейса:

network:
  version: 2
  ethernets:
    enp3s0:
      dhcp4: true
      dhcp4-overrides:
        use-dns: false
      nameservers:
        addresses: [9.9.9.9, 1.1.1.1]

Применяйте через sudo netplan try: если связь пропадёт, настройки откатятся сами через 120 секунд.

Глобальные серверы в resolved.conf

Если нужно задать DNS для всей системы, независимо от сети, используйте конфигурацию самого resolved. Основной файл /etc/systemd/resolved.conf лучше не трогать: создайте свой фрагмент в каталоге resolved.conf.d, его не затрёт обновление пакета.

sudo mkdir -p /etc/systemd/resolved.conf.d
sudo nano /etc/systemd/resolved.conf.d/dns.conf
[Resolve]
DNS=9.9.9.9 1.1.1.1
FallbackDNS=
Domains=~.

DNS= задаёт глобальные серверы. Пустой FallbackDNS= отключает встроенный запасной список, который resolved использует, когда других серверов не знает: полезно, если вы не хотите, чтобы запросы внезапно ушли к Google или Cloudflare. Domains=~. делает глобальные серверы маршрутом по умолчанию для всех доменов. Применение:

sudo systemctl restart systemd-resolved
resolvectl status

Учтите, что серверы, полученные по DHCP для интерфейса, никуда не денутся. Если они не нужны, отключите их в NetworkManager через ignore-auto-dns, как описано выше. Для временного эксперимента без правки файлов подойдёт sudo resolvectl dns enp3s0 9.9.9.9: настройка живёт до перезагрузки или переподключения, вернуть исходное можно через sudo resolvectl revert enp3s0.

DNS over TLS в systemd-resolved

Обычные DNS-запросы идут открытым текстом по UDP, и провайдер видит, какие сайты вы открываете. DNS over TLS шифрует их по порту 853. В systemd-resolved это включается одной опцией, но у сервера нужно указать имя для проверки сертификата, через решётку после адреса:

[Resolve]
DNS=9.9.9.9#dns.quad9.net 1.1.1.1#cloudflare-dns.com
DNSOverTLS=yes
Domains=~.

Значения опции:

  • no - шифрование выключено, это значение по умолчанию;
  • opportunistic - пробовать TLS, а если сервер не умеет, откатываться на открытый DNS. Работает почти везде, но от активного вмешательства не защищает;
  • yes - только TLS, без отката. Если сервер не отвечает по 853, имена перестают разрешаться.

Глобальная настройка DNSOverTLS распространяется и на серверы интерфейсов. Роутер, который раздал свой адрес по DHCP, почти никогда не поддерживает TLS, поэтому с yes обязательно отключите DNS от роутера, иначе часть запросов будет падать. Проверка после перезапуска службы:

resolvectl status | grep -i -E 'dnsovertls|current dns'
resolvectl query example.org

В строке протоколов должно появиться +DNSOverTLS. Подробный разбор всех опций есть в man-странице resolved.conf.

Пользуетесь VPN? WireGuard и другие клиенты обычно назначают свой DNS для туннельного интерфейса, и resolved отправляет запросы туда. Если после включения VPN сайты открываются, а имена внутренней сети нет, смотрите resolvectl status по интерфейсу туннеля. Как настроить DNS для туннеля, описано в статье домашний VPN на WireGuard.

Как очистить кэш DNS в Linux

Кэш DNS сбрасывают, когда у сайта поменялся адрес, а компьютер упорно ходит на старый. В системах с systemd-resolved это одна команда:

sudo resolvectl flush-caches
resolvectl statistics

Во втором выводе счётчик Current Cache Size после очистки будет нулевым. Старая форма systemd-resolve --flush-caches встречается в инструкциях прошлых лет, в актуальных версиях systemd используйте resolvectl.

Если resolved не используется, кэша на уровне системы может не быть вовсе: glibc сама ответы не запоминает. Тогда кэширует кто-то другой:

# nscd
sudo nscd -i hosts
# dnsmasq
sudo systemctl restart dnsmasq

Ещё один слой кэша есть у браузера. В Chrome и Chromium откройте chrome://net-internals/#dns и нажмите очистку кэша хоста, в Firefox страница about:networking#dns с кнопкой очистки. И помните про TTL: если сменился адрес у самого домена, вышестоящий сервер может отдавать старую запись, пока не истечёт её срок жизни. Локальная очистка тут не поможет, остаётся подождать или временно спросить другой сервер.

Проверка и типовые проблемы

Для диагностики пригодятся dig и getent. Первая спрашивает DNS напрямую и показывает подробности ответа, вторая проходит тот же путь, что и обычные программы.

# пакеты с dig: Debian/Ubuntu, Fedora, Arch
sudo apt install bind9-dnsutils
sudo dnf install bind-utils
sudo pacman -S bind
dig linuxru.link
dig @9.9.9.9 linuxru.link +short
getent hosts linuxru.link

Если dig @9.9.9.9 отвечает, а getent нет, проблема в локальной настройке, а не в сети. Типовые случаи:

  • Сайты по IP открываются, по имени нет. Проверьте resolvectl status: возможно, в списке нет ни одного сервера. Перезапустите подключение через nmcli connection up.
  • После правки resolv.conf всё вернулось. Файл генерируется автоматически, меняйте DNS в NetworkManager, netplan или resolved.conf.
  • Порт 53 занят, другой DNS-сервер не стартует. Заглушка resolved слушает 127.0.0.53:53. Для локального Pi-hole или dnsmasq отключите её строкой DNSStubListener=no в своём фрагменте конфига.
  • systemd-resolved упал или не стартует. Читайте журнал через journalctl -u systemd-resolved -b, порядок разбора описан в статье служба в состоянии failed.

Если же пропал не только DNS, а сеть целиком, начните с адаптера и подключения: для беспроводных сетей есть отдельный разбор не работает Wi-Fi в Linux.

Частые вопросы

Почему мои изменения в /etc/resolv.conf пропадают?

Файл генерирует NetworkManager или systemd-resolved, и при переподключении к сети он перезаписывается. Меняйте DNS в настройках подключения, через nmcli или в /etc/systemd/resolved.conf.d/.

Что за адрес 127.0.0.53 в resolv.conf?

Это локальная заглушка systemd-resolved. Программы спрашивают её, а она пересылает запросы настоящим серверам и кэширует ответы. Реальные серверы показывает resolvectl status.

Как очистить кэш DNS в Ubuntu?

Выполните sudo resolvectl flush-caches. Проверить, что кэш пуст, можно командой resolvectl statistics. Браузерный кэш очищается отдельно.

DNS over TLS или DNS over HTTPS?

systemd-resolved поддерживает DNS over TLS на уровне всей системы. DNS over HTTPS обычно включают в браузере, и тогда он работает только для браузера.

Какие DNS-серверы можно указать?

Подойдёт DNS провайдера или публичные серверы, например Quad9 (9.9.9.9), Cloudflare (1.1.1.1), Google (8.8.8.8), Яндекс DNS (77.88.8.8). Для DNS over TLS у сервера должно быть известное имя для проверки сертификата.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.