Как прочитать содержимое локального кэша DNS?

Вопрос или проблема

Я знаю, что на Windows я могу выполнить ipconfig /displaydns и увижу содержимое кэша локального DNS.

Как я могу просмотреть содержимое кэша DNS в Linux?

Хотелось бы получить решение, которое будет работать на различных дистрибутивах.

До systemd почти не было кэширования DNS на уровне ОС

До systemd на Linux (и, вероятно, большинстве Unix) не было кэширования DNS на уровне ОС, если не был установлен и запущен nscd или dnsmasq.

Даже тогда функция кэширования DNS в nscd была отключена по умолчанию в Debian, просто потому что она сломана.

Что касается dnsmasq, то кэширование, по умолчанию, происходит в оперативной памяти.

nscd — это демон кэширования служебных имен. Это утилита, которую используют Linux, Solaris и другие для кэширования запросов к службам имен. Служба имен в данном случае является обобщённым термином, который не ограничивается только разрешением хостов, но также включает пользователей, группы и т.д.

Я не знаю способа увидеть фактическое содержимое кэша, хотя вы можете отобразить статистику с помощью /usr/sbin/nscd -g.

Это, по крайней мере, может показать вам, насколько эффективен ваш кэш, хотя и не то, что именно он разрешает.

У вас могут быть другие варианты, если вы используете другой инструмент кэширования, такой как DNSMASQ.

Если вы используете nscd, вы можете просмотреть содержимое (и, возможно, другой мусор), показав ASCII строки из бинарного файла кэша. В Debian/Ubuntu этот файл — /var/cache/nscd/hosts для хостов/DNS кэша, так что вы можете выполнить strings /var/cache/nscd/hosts, чтобы увидеть хосты в кэше.

Обратите внимание, что это полное хакирство, так как, по всей видимости, нет правильного способа просмотреть кэш nscd без декодирования бинарного формата.

Вы можете отправить сигнал SIGUSR1 процессу systemd-resolved, чтобы просмотреть кэш с помощью journalctl.

killall -USR1 systemd-resolved && journalctl -u systemd-resolved | grep -A 100000 "CACHE:"

Из руководства:

SIGUSR1
  При получении сигнала SIGUSR1 процесс systemd-resolved
  сбросит содержимое всех кэшей ресурсных записей DNS, которые он
  поддерживает, а также всю информацию о уровнях функций, которую он узнал
  о настроенных DNS-серверах, в системные журналы.

  Добавлено в версии 231.

(Также здесь). Поскольку systemd 254 (проблема 14796, выпущенная в 2023 году), у нас есть

sudo resolvectl show-cache

Из заметок к релизу v254:

    * resolvectl получил новый глагол "show-cache", чтобы показать текущее содержимое кэша
      systemd-resolved. Этот глагол общается с демоном
      systemd-resolved и требует привилегий.

Чтобы очистить кэш, используйте resolvectl flush-caches (systemd-resolve --flush-caches в более ранних версиях systemd).

На дистрибутиве Fedora команда systemd-resolve --statistics возвращает обзор статистики резолвера.
Чтобы отобразить содержимое кэша, вы можете использовать resolvectl show-cache (из man resolvectl).
Я предполагаю, что эти команды будут доступны на любом дистрибутиве с systemd.

Ответ или решение

Как просмотреть содержимое локального DNS-кэша в Linux

Существует несколько способов просмотра содержимого локального DNS-кэша в операционных системах на базе Linux. В отличие от Windows, где для этого используется команда ipconfig /displaydns, в Linux необходимо учитывать различия между дистрибутивами и используемыми службами кэширования DNS. В этой статье мы рассмотрим несколько методик, которые удовлетворяют потребности большинства пользователей, вне зависимости от выбранного дистрибутива.

1. Использование systemd-resolved

Среди современных дистрибутивов Linux, таких как Ubuntu и Fedora, наиболее распространенной службой для кэширования DNS является systemd-resolved. Если ваша система использует эту службу, вы можете легко просмотреть содержимое DNS-кэша следующими способами:

1.1. Отправка сигнала SIGUSR1

Вы можете отправить сигнал SIGUSR1 процессу systemd-resolved, после чего содержимое кэша будет записано в журнал системных логов. Для этого выполните следующую команду в терминале:

killall -USR1 systemd-resolved && journalctl -u systemd-resolved | grep -A 100000 "CACHE:"

Эта команда выполнит следующее:

  • Убьет процесс systemd-resolved, отправив ему сигнал, который заставит его записать состояние кэша.
  • Затем выведет содержимое системного журнала, в котором вы сможете найти строки, начинающиеся с "CACHE:", содержащие актуальную информацию.

1.2. Использование resolvectl

Начиная с версии 254 systemd, вы можете получить доступ к содержимому кэша более прямолинейным способом. Используйте следующую команду:

sudo resolvectl show-cache

Эта команда выводит текущее состояние кэша DNS, находящегося под контролем systemd-resolved, и требует прав суперпользователя.

2. Использование nscd (Name Service Cache Daemon)

Если ваша система использует nscd для кэширования запросов DNS, то для просмотра статистики, а не конкретного содержания, вы можете использовать следующую команду:

/usr/sbin/nscd -g

Хотя nscd не предоставляет возможности напрямую просмотреть кэш, вы можете получить доступ к его бинарным файлам, используя утилиту strings. В Debian/Ubuntu кэш DNS хранится по пути /var/cache/nscd/hosts. Для вывода строковых представлений содержимого выполните команду:

strings /var/cache/nscd/hosts

Обратите внимание, что этот метод является неформальным и не рекомендуется для точного анализа кэша. Он может выводить «мусорные» данные.

3. Использование dnsmasq

Если вы используете dnsmasq, то информация о кэше хранится в оперативной памяти, и для доступа к ней обычно рекомендуется просматривать логи сервера при включенном ведении журнала. Чтобы получить доступ к кэшу, вам потребуется настроить dnsmasq на ведение логов.

Заключение

Understanding how to read the local DNS cache on Linux is essential for troubleshooting and ensuring the network operates smoothly. Whether you are using systemd-resolved, nscd, or dnsmasq, each method offers distinct ways to access valuable information about name resolution within your system.

Эти подходы позволят вам просмотреть содержимое DNS-кэша в большинстве современных дистрибутивов Linux, выбирая наиболее подходящий метод в зависимости от вашей конфигурации. Не забывайте, что каждая команда потребует определенных привилегий, поэтому убедитесь, что у вас есть необходимые права доступа.

Оцените материал
Добавить комментарий

Капча загружается...