Подключение bind9 к мониторингу munin

Для отладки да и просто для статистики полезно мониторить какие запросы идут к 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-запросам. В хорошем случае получаем картинки такого вида