Мониторинг DNS (сервиса Named = Bind) с помощью Zabbix

upd: Обновлено, т.к. каждый отдельный запрос выполнялся очень долго и жутко грузил заббикс ожиданиями ?, теперь нужная статистика «выгружается» по крону, а потом забирается из текстового файлика агентом. Плюс маленько переделан сам шаблон, т.к. в элементах данных стоял некорректный тип хранения значения «дельта», а не «как есть». Забирайте, допиливайте под свои нужды, ссылка дальше по тексту.

Используемый в данной статье шаблон я скачал где-то на просторах интернета и несколько допилил под себя, автору оригинала «Спасибо». В данном шаблоне столько триггеров потому, что в своё время сервис named у меня любил падать и/или не заводиться при перезагрузке. После организации мониторинга и толковой настройки всё стало хорошо.

Имеем сервер с CentOS (для Debian просто скорректируйте пути) с работающим сервисом Named (он же Bind).

Чтобы всё взлетело нужно установить пакеты: zabbix и zabbix-agent (для Debian только zabbix-agent) и xml2. Пакеты заббикса можно взять тут: http://repo.zabbix.com/zabbix/2.4/ (или смотрите там другие версии).

Редактируем необходимые переменные в /etc/zabbix/zabbix_agentd.conf

sudo nano /etc/zabbix/zabbix_agentd.conf
LogFileSize=15
DebugLevel=3
Server=<ip адрес zabbix сервера>
ServerActive=<ip адрес zabbix сервера>
Hostname=<ip адрес данной машины> - <имя машины>   # Hostname = Имя хоста на Zabbix сервере
HostMetadataItem=system.uname
Timeout=30
Include=/etc/zabbix/zabbix_agentd.d/

UserParameter=bind.worksdig,cat /tmp/zabbix.named.dig
UserParameter=bind.worksnslookup,cat /tmp/zabbix.named.nslookup

UserParameter=bind.queries.in[*],cat /tmp/zabbix.named.statistics | grep -A1 -i "/isc/bind/statistics/server/queries-in/rdtype/name=$1$" | tail -1 | cut -d= -f2
UserParameter=bind.queries.out[*],cat /tmp/zabbix.named.statistics | grep -A1 -i "/isc/bind/statistics/views/view/rdtype/name=$1$" | tail -1 | cut -d= -f2
UserParameter=bind.stats.query[*],cat /tmp/zabbix.named.statistics | grep -A1 -i "/isc/bind/statistics/server/nsstat/name=Qry$1" | tail -1 | cut -d= -f2

UserParameter=bind.net.udp,netstat -nua | grep :53 | wc -l
UserParameter=bind.net.tcp,netstat -nta | grep :53 | wc -l

Добавляем в крон задания:

sudo crontab -e -u root
# Записываем значение параметра в файлы для прочтения zabbix агентом
*/2 * * * *     echo "0" > /tmp/zabbix.named.nslookup ; timeout -s 9 3 nslookup google.ru ip_адрес_вашего_DNS_сервера | grep -c "Name:" > /tmp/zabbix.named.nslookup ; sleep 5 ; /etc/zabbix/scripts/zabbix.named.check.sh >> /tmp/zabbix.named.log
*/2 * * * *     echo "0" > /tmp/zabbix.named.dig ; timeout -s 9 3 dig google.ru @ip_адрес_вашего_DNS_сервера | grep -c "google.ru" > /tmp/zabbix.named.dig

# Расширенная статистика по-новому
*/5 * * * *     curl -s http://localhost:8053/ | xml2 | grep -E "server\/queries-in\/rdtype|views\/view\/rdtype|server\/nsstat" 1>/tmp/zabbix.named.statistics_temp 2>/dev/null ; cp -f /tmp/zabbix.named.statistics_temp /tmp/zabbix.named.statistics

Дальше скрипт перезапуска сервиса при зависании или ещё каких-то проблемах.

sudo nano /etc/zabbix/scripts/zabbix.named.check.sh

Или напишите свой красивый велосипед ?.

#!/bin/bash
named_nslookup=`cat /tmp/zabbix.named.nslookup`
named_dig=`cat /tmp/zabbix.named.dig`
datenow=`/bin/date`

if [[ "$named_nslookup" = 0 && "$named_dig" = 0 ]]
then
  echo -e "\n\nNOW: $datenow     And at response of zabbix.named.nslookup we have: $named_nslookup, at zabbix.named.dig: $named_dig"
  echo "Copy date to zabbix.named.date_fail and create flag"
  /bin/date >> /tmp/zabbix.named.date_fail
  /bin/touch /tmp/zabbix.named.flag_dontwork

  # Если флаг существует значит надо остановить сервис или убить процесс
  if [ -e /tmp/zabbix.named.flag_dontwork ]
  then
        /bin/rm -f /tmp/zabbix.named.flag_dontwork
        tokill=`ps axu | grep "usr\/sbin\/named" | awk '{print $2}' | head -n1`
        echo -e "\nOk, Flag exist     PID of named: $tokill     Try to stop service named"
        timeout -s 9 10 /etc/init.d/named stop

        tokillbypid=`ps axu | grep "usr\/sbin\/named" | awk '{print $2}' | head -n1`
        # Если строка пустая, то служба остановлена
        while [ "$tokillbypid" ]
        do
                echo "Service don't stopped, try to kill by PID $tokillbypid"
                # Через kill -HUP почему-то именно named не дохнет
                kill -9 $tokillbypid
                tokillbypid=`ps axu | grep "usr\/sbin\/named" | awk '{print $2}' | head -n1`
        done
        echo "Service named stopped"
  fi

  echo -e "\nLet's start service named!"
  /etc/init.d/named start
fi
exit 0
sudo chmod 775 /etc/zabbix/scripts/zabbix.named.check.sh
sudo chown zabbix:root /etc/zabbix/scripts/zabbix.named.check.sh

Как видите, сервис перезапускается если перестаёт нормально работать. После настройки не забываем перезапустить сервис zabbix-agent.

sudo service zabbix-agent restart

Теперь импортируем шаблон на сервере, старая кривая версия — экспортирована из Zabbix 2.4, новая версия — экспортирована из Zabbix 3.2 (но, я думаю, будет работать и на младших релизах, ничего особо не менялось) и добавляем его на хост нашего DNS сервера.

Через 5 минут можно смотреть графики. Для просмотра лучше создать отдельный Комплексный экран и добавить туда все графики.

Т.к. команды с curl тяжёлые по времени выполнения, в конфиге агента и сервера лучше отредактировать переменную отвечающую за время выполнения скриптов. В принципе, это уже не нужно.

 Timeout=30

На этом всё.

2 комментария

  1. Нужно еще активировать статистику в /etc/bind/named.conf

    statistics-channels {
    inet 127.0.0.1 port 8053 allow { 127.0.0.1; };
    };

Добавить комментарий для djvnsk Отменить ответ

Ваш e-mail не будет опубликован. Обязательные поля помечены *