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

Для отладки да и просто для статистики полезно мониторить какие запросы идут к named-серверу, какие из них выполняются корректно и какие некорректные. Демон bind позволяет настроить гибкое логирование запросов, затем эти логи можно анализировать сторонней утилитой. В качестве такой утилиты удобно использовать систему мониторинга munin с bind-плагинами «из коробки».

Первое, что сделаем — включим нужные плагины. Их в директории с готовыми плагинами два, оба и подключим

1
2
3
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:

1
2
3
[bind9]
user bind
env.logfile /var/log/named/query.log

Стандартная директория для логов bind /var/log/named, а мунин их читает из /var/log/bind9. Поэтому, явно указываем в конфиге путь к логу (как сделано выше). Как альтернатива, чтобы вносить меньше правок в конфигурацию, можно сделать симлинк:

1
2
cd /var/log
ln -s named bind9

Далее, настроим сбор логов от неймсервера в лог. Для этого создаем файл (например /etc/bind/logging.conf) с указанием данных, которые нужно писать в лог. Не будем мелочиться и настроим наиболее полное логирование, причем разных каналов в разные файлы.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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, остальное — в отладочных целях и смело можно вычеркнуть.
Включаем этот файл в конфиге бинда

1
include "/etc/bind/logging.conf";

рестартуем демон и проверяем, что файлы лога создались и пишутся корректно. Заранее создаем директорию под логи и выставляем на неё нужные права.

Далее, нужно убедиться, что лог читаем для парсера плагина, что делается штатной муниновской командой

1
munin-run bind9

В случае корректной настройки тест вернёт количество запросов разного типа. Или не вернёт — тогда нужно искать ошибку в конфигурации. Типичная ошибка происходит с правами доступа, поэтому или выставляем доступные права для /var/named/* или настраиваем запуск плагина от рута.

bind9_rndc

Включаем сам плагин для сбора статистики rndc в /etc/plugin-conf.d/bind9_rndc и настраиваем его параметры:

1
2
3
[bind9_rndc]
user bind
env.querystats /var/cache/bind/named.stats

Путь для файла статистики намеренно указан нестандартный, поскольку apparmor в дистрибутивах Debian/Ubuntu ограничивает запись в стандартную директорию /var/run/named. Поэтому указываем файл в директории для кеша, где нет явных ограничений на запись.

Теперь включим расширенную статистику rndc со стороны bind. Включаем в конфигурации (обычно /etc/bind9/named.conf.options) строчку:

1
statistics-file "/var/cache/bind/named.stats";

и рестартуем bind9.

Аналогично вышеуказанному плагину проверяем, что плагин работает корректно

1
munin-run bind9_rndc

По окончании, чтобы мунин подхватил новые настройки, его демон нужно перезапустить. Перезапускаем мунин

1
/etc/init.d/munin-node restart

и проверяем, что логи корректно парсятся и в отчётах мунина присутствует статистика по DNS-запросам. В хорошем случае получаем картинки такого вида