В большинстве современных дистрибутивов Linux в systemd есть отдельная служба systemd-resolved, которую можно использовать для локального кэширования DNS запросов. В этой статье мы рассмотрим, как ускорить резолвинг DNS запросов с помощью локального кэширования systemd-resolved на примере Debian и Ubuntu. Это позволить вам уменьшить задержки резолвинга DNS на нестабильных каналах, при включенном DNSSEC, а также на серверах, на которых выполняется большое количество DNS запросов (например, на почтовых серверах).
В Unubtu 18.04 и выше systemd-resolved предустановлен и не требует отдельной установки (в отличии от dnsmasq или unbound).
Проверьте, что systemd-resolved запущен:
$ systemctl status systemd-resolved
Текущие настройки systemd-resolved можно получить:
$ systemd-resolve --status
В Ubuntu 22.04+ утилита была переименована в resolvectl, поэтому нужно выполнить:
$ resolvectl status
Чтобы приложения выполняли разрешения имен через systemd-resolved, нужно установить libnss-resolve, плагин для механизма NSS (GNU Name Service Switch):
$ sudo apt-get install libnss-resolve
При этом в файле /etc/nsswitch.conf строка
hosts: files dns
будет заменена на:
hosts: files mdns4_minimal [NOTFOUND=return] resolve [!UNAVAIL=return] dns
Отредактируйте файл /etc/systemd/resolved.conf (по умолчанию все настройки в нем закоментированы):
[Resolve] DNS=8.8.8.8 8.8.4.4 FallbackDNS= 1.1.1.1 1.0.0.1 DNSSEC=no DNSOverTLS=no Cache=yes
Для совместимости с приложениями, которые не используют библиотечные вызовы, а обращаются к DNS сервера напрямую, нужно создать символическую ссылку:
# ln -svi /run/systemd/resolve/resolv.conf /etc/resolv.conf
Запустите systemd-resolved:
# systemctl enable systemd-resolved # systemctl restart systemd-resolved
Теперь /etc/systemd/resolved.conf это основной конфигурационный файл DNS на компьютере.
Чтобы посмотреть, как используется кэш DNS запросов, нужно включить режим отладки:
# systemctl edit systemd-resolved
Добавьте:
[Service] Environment=SYSTEMD_LOG_LEVEL=debug
Откройте лог службы:
# journalctl -f -u systemd-resolved
Теперь при повторном резолвинге одного имени, в логе будут такие строки:
Looking up RR for vmblog.ru IN A. Cache miss for vmblog.ru IN A …. Looking up RR for vmblog.ru IN AAAA. Positive cache hit for vmblog.ru IN A
Статистику по кэшированию запросов DNS можно получить так:
$ systemd-resolve --statistics
Очистить локальный кэш DNS:
$ systemd-resolve --flush-caches