Sept. 12, 2016, 6:51 p.m.
Posted by soar

BIND9 + SNMP + Cacti - подводные камни

Реализация

На docs.cacti.net лежит, судя по всему выложенный пользователями, набор скриптов для мониторинга BIND9. Вот что нужно знать о том, как оно работает (или должно работать):

  1. Для опроса запускается скрипт bind-stats.sh
  2. Скрипт запускает snmpget
  3. По SNMP-запросу через extend запускается скрипт runstats.sh
    1. Он удаляет файл со статистикой /var/cache/bind/named.stats (путь захардкожен)
    2. Запускает rndc stats
    3. Выполняет команду cat /var/cache/bind/named.stats | /root/bin/dnsstats.pl (пути захардкожены)
    4. Скрипт dnsstats.pl получает на вход вывод файла статистики, а на выходе печатает всё в одну строку, которая и отправляется как ответ на SNMP-запрос
  4. Ответ пропускается через sed
  5. После чего разбирается на части и сохраняется в RRD

Вот так выглядит ответ перлового скрипта:

a:5741 a6:0 aaaa:1560 any:0 cname:0 mx:0 naptr:0 ns:245 ptr:233 soa:55 spf:0 srv:6 txt:47 rsnx:19 rsfail: rserr:4 rsipv4qs:3459 rsipv4rr:3398 rsmismatch: rsqr:674 rsqt:668 rsrtt10: rsrtt100500:630 rsrtt10100:2755 rsrtt1600: rsrtt500800:13 rsrtt8001600: sockopen:3513 sockclosed:3505 sockbf: consest:3439 recverr:

У любого адекватного человека волосы встанут дыбом от такого перформанса. Но если вы всё-таки решили настроить это именно так - то вот пара советов.

Проблемы

Права на запуск rndc stats

Запускать эту команду будет демон snmpd запущенный от пользователя snmp. И всё бы хорошо, но ей для выполнения нужен файл /etc/bind/rndc.key, который в целях безопасности доступен только пользователю bind. Неправильное решение - запускать эту команду через sudo. Правильное решение - добавить пользователя snmp в группу bind (это пригодится и в следующем совете):

$ usermod -a -G bind snmp

Права на файл /var/run/named/named.stats

Демон snmpd запускается от пользователя snmp, а всё, связанное с биндом - от пользователя bind. Поэтому удалять файл /var/run/named/named.stats скрипт не сможет. Решение простое:

  1. Создаем файл /var/run/named/named.stats любым способом
  2. Отдаём его пользователю bind: chown bind:bind /var/run/named/named.stats
  3. Даём права записи в него группе: chmod 660 /var/run/named/named.stats
  4. Вместо удаления файла каждый раз - просто чистим его: truncate --size=0 /var/run/named/named.stats

Запуск cat каждый раз - не нужен

Зачем каждый раз запускать cat, если перловый скрипт может сам читать файл? Добавим пару строк:

my $filename = $ARGV[0];
open my $file, "<:encoding(utf8)", $filename or die "$filename: $!";
...
while(my $line = <$file>) {

Ненужный runstats.sh

Еще один скрипт runstats.sh - не нужен, это просто лишний процесс bash. Вместо этого просто напишите в snmpd.conf:

extend-sh .1.3.6.1.4.1.18689.0.1 dnscache-stats /usr/bin/truncate --size=0 /var/run/named/named.stats ; /usr/sbin/rndc stats ; /etc/snmp/scripts/bind9/dnsstats.pl /var/run/named/named.stats

bind-stats.sh

В серверном скрипте bind-stats.sh захардкожено использование SNMP v2 с community. Если вы используете SNMP v3 - его придется переписать.

Завершение

Учитывая всё вышесказанное - такой путь мониторинга сервиса в корне неправилен. Используйте правильные решения и никогда не городите костыли.

Comments