- Вопрос или проблема
- До systemd почти не было кэширования DNS на уровне ОС
- Ответ или решение
- Как просмотреть содержимое локального DNS-кэша в Linux
- 1. Использование systemd-resolved
- 1.1. Отправка сигнала SIGUSR1
- 1.2. Использование resolvectl
- 2. Использование nscd (Name Service Cache Daemon)
- 3. Использование dnsmasq
- Заключение
Вопрос или проблема
Я знаю, что на 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, выбирая наиболее подходящий метод в зависимости от вашей конфигурации. Не забывайте, что каждая команда потребует определенных привилегий, поэтому убедитесь, что у вас есть необходимые права доступа.