Для отладки да и просто для статистики полезно мониторить какие запросы идут к named
-серверу, какие из них выполняются корректно и какие некорректные. Демон bind
позволяет настроить гибкое логирование запросов, затем эти логи можно анализировать сторонней утилитой. В качестве такой утилиты удобно использовать систему мониторинга munin
с bind
-плагинами «из коробки».
Первое, что сделаем — включим нужные плагины. Их в директории с готовыми плагинами два, оба и подключим
cd /etc/munin/plugins ln -s /usr/share/munin/plugins/bind9 ln -s /usr/share/munin/plugins/bind9_rndc
Эти плагины — перловские скрипты. Из их исходного текста можно увидеть, что первый из них (bind9
) парсит стандартный лог неймсервера /var/log/bind9/query.log
, второй (bind9_rndc) — парсит данные rndc
из /var/run/named.stats
и выдаёт расширенную статистику по запросам к DNS
-серверу. В большинстве задач достаточно будет и общего плагина, однако, сконфигурируем их оба.
bind9
Конфигурируем параметры запуска скрипта мониторинга. Соответственно, общего плагина в файле /etc/plugin-conf.d/bind9
:
[bind9] user bind env.logfile /var/log/named/query.log
Стандартная директория для логов bind /var/log/named
, а мунин их читает из /var/log/bind9
. Поэтому, явно указываем в конфиге путь к логу (как сделано выше). Как альтернатива, чтобы вносить меньше правок в конфигурацию, можно сделать симлинк:
cd /var/log ln -s named bind9
Далее, настроим сбор логов от неймсервера в лог. Для этого создаем файл (например /etc/bind/logging.conf
) с указанием данных, которые нужно писать в лог. Не будем мелочиться и настроим наиболее полное логирование, причем разных каналов в разные файлы.
logging { channel default_file { file "/var/log/named/default.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel general_file { file "/var/log/named/general.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel database_file { file "/var/log/named/database.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel security_file { file "/var/log/named/security.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel config_file { file "/var/log/named/config.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel resolver_file { file "/var/log/named/resolver.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel xfer-in_file { file "/var/log/named/xfer-in.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel xfer-out_file { file "/var/log/named/xfer-out.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel notify_file { file "/var/log/named/notify.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel client_file { file "/var/log/named/client.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel unmatched_file { file "/var/log/named/unmatched.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel queries_file { file "/var/log/named/query.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel network_file { file "/var/log/named/network.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel update_file { file "/var/log/named/update.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel dispatch_file { file "/var/log/named/dispatch.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel dnssec_file { file "/var/log/named/dnssec.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; channel lame-servers_file { file "/var/log/named/lame-servers.log" versions 5 size 10m; severity dynamic; print-category yes; print-severity yes; print-time yes; }; category default { default_file; }; category general { general_file; }; category database { database_file; }; category security { security_file; }; category config { config_file; }; category resolver { resolver_file; }; category xfer-in { xfer-in_file; }; category xfer-out { xfer-out_file; }; category notify { notify_file; }; category client { client_file; }; category unmatched { unmatched_file; }; category queries { queries_file; }; category network { network_file; }; category update { update_file; }; category dispatch { dispatch_file; }; category dnssec { dnssec_file; }; category lame-servers { lame-servers_file; }; };
Для munin
потребуется только лог запросов query.log
, остальное — в отладочных целях и смело можно вычеркнуть.
Включаем этот файл в конфиге бинда
include "/etc/bind/logging.conf";
рестартуем демон и проверяем, что файлы лога создались и пишутся корректно. Заранее создаем директорию под логи и выставляем на неё нужные права.
Далее, нужно убедиться, что лог читаем для парсера плагина, что делается штатной муниновской командой
munin-run bind9
В случае корректной настройки тест вернёт количество запросов разного типа. Или не вернёт — тогда нужно искать ошибку в конфигурации. Типичная ошибка происходит с правами доступа, поэтому или выставляем доступные права для /var/named/* или настраиваем запуск плагина от рута.
bind9_rndc
Включаем сам плагин для сбора статистики rndc
в /etc/plugin-conf.d/bind9_rndc
и настраиваем его параметры:
[bind9_rndc] user bind env.querystats /var/cache/bind/named.stats
Путь для файла статистики намеренно указан нестандартный, поскольку apparmor в дистрибутивах Debian/Ubuntu ограничивает запись в стандартную директорию /var/run/named
. Поэтому указываем файл в директории для кеша, где нет явных ограничений на запись.
Теперь включим расширенную статистику rndc
со стороны bind
. Включаем в конфигурации (обычно /etc/bind9/named.conf.options
) строчку:
statistics-file "/var/cache/bind/named.stats";
и рестартуем bind9
.
Аналогично вышеуказанному плагину проверяем, что плагин работает корректно
munin-run bind9_rndc
По окончании, чтобы мунин подхватил новые настройки, его демон нужно перезапустить. Перезапускаем мунин
/etc/init.d/munin-node restart
и проверяем, что логи корректно парсятся и в отчётах мунина присутствует статистика по DNS-запросам. В хорошем случае получаем картинки такого вида