Cacti: Мониторинг ISC DHCP

Serious-Vulnerability-Patched-in-Popular-DHCP-Client-2

DHCP (англ. Dynamic Host Configuration Protocol — протокол динамической настройки узла) — сетевой протокол, позволяющий компьютерам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер». Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к так называемому серверу DHCP.

В качестве DHCP сервера на CentOS 6 как правило используется ISC DHCP 4.x.

Демон имеет массу «полезных» фич и достаточное количество недостатков, одним из которых является отсутствие мониторинга. С последней проблемой можно успешно справиться с помощью небольшого набора скриптов.

В мониторинге меня интересует два набора параметров:

  • Мониторинг работы демона (количество dhcpdiscover, dhcpinform и т.д.)
  • Состояние динамических пулов (Active leases, Pool size и т.д)

1. Мониторинг работы демона
Так как штатных средств для мониторинга у демона нет, мы будем парсить логи. Несмотря на явный костыль, решение показало свою эффективность при достаточно больших нагрузках.

  • Для начала зарегистрируем логи в отдельный поток syslog.
[root@dhcp]# grep "log-facility" dhcpd.conf
log-facility local5;
  • В syslog, для удобства, направим поток в отдельный файл:
[root@dhcp etc]# grep "local5.*" /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none;local5.none    /var/log/messages
local5.*                                                /var/log/dhcp/dhcpd.log
  • Сразу добавим скрипт для ротации логов, иначе оно когда-нибудь кончится.
[root@dhcp logrotate.d]# cat /etc/logrotate.d/dhcpd
/var/log/dhcp/dhcpd.log {
    rotate 4
    missingok
    daily
    sharedscripts
    create 0644 root root
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
  • В /etc/snmp/ создаем скрипт «dhcpd_stat» (с атрибутами 755), который будет заниматься непосредственно парсингом логов:
[root@dhcp snmp]# cat /etc/snmp/dhcpd_stat
export LANG=n_US.UTF-8
FILENAME=$(find /var/log/dhcp/ -mmin -10 -type f -name "dhcp*")
tail -n 150000 $FILENAME>/tmp/stat.log
TIME=$(date -d '5 min ago' '+%b %e %H:%M');
TIME_NOW=$(date '+%b %e %H:%M');
awk "/$TIME/,/$TIME_NOW/" /tmp/stat.log > /tmp/stat.st

DHCPDISCOVER=$(grep DHCPDISCOVER /tmp/stat.st|wc -l)
DHCPREQUEST=$(grep DHCPREQUEST /tmp/stat.st|wc -l)
DHCPACK=$(grep DHCPACK /tmp/stat.st|wc -l)
DHCPOFFER=$(grep DHCPOFFER /tmp/stat.st|wc -l)

DHCPINFORM=$(grep DHCPINFORM /tmp/stat.st|wc -l)
DHCPNACK=$(grep DHCPNACK /tmp/stat.st|wc -l)
DHCPDECLINE=$(grep DHCPDECLINE /tmp/stat.st|wc -l)
DHCPRELEASE=$(grep DHCPRELEASE /tmp/stat.st|wc -l)

echo DHCPDISCOVER:$DHCPDISCOVER DHCPREQUEST:$DHCPREQUEST DHCPACK:$DHCPACK DHCPOFFER:$DHCPOFFER DHCPINFORM:$DHCPINFORM DHCPNACK:$DHCPNACK DHCPDECLINE:$DHCPDECLINE DHCPRELEASE:$DHCPRELEASE
  • В случае, если мы сделал все верно, скрипт должен показать примерно такой вывод:
[root@dhcp snmp]# ./dhcpd_stat
DHCPDISCOVER:3331 DHCPREQUEST:2006 DHCPACK:1938 DHCPOFFER:3294 DHCPINFORM:7525 DHCPNACK:0 DHCPDECLINE:54 DHCPRELEASE:6
  • Добавляем «exec» в snmpd.conf, перезапускаем snmpd и делаем проверку:
[root@dhcp snmp]# grep "exec dhcpd_stat" snmpd.conf
exec dhcpd_stat /bin/sh /etc/snmp/dhcpd_stat

[root@dhcpd snmp]# service snmpd restart
Останавливается snmpd:                                     [  OK  ]
Запускается snmpd:                                         [  OK  ]

Проверяем с хоста мониторинга:

[root@cacti scripts]# snmpwalk -v2c -c communiti dhcp_ip UCD-SNMP-MIB::extOutput.1
UCD-SNMP-MIB::extOutput.1 = STRING: DHCPDISCOVER:3810 DHCPREQUEST:1954 DHCPACK:1885 DHCPOFFER:3769 DHCPINFORM:7553 DHCPNACK:0 DHCPDECLINE:44 DHCPRELEASE:2
  • Импортируем шаблон «cacti_graph_template_6_linux_dhcpd_daemon_-_server_stat.xml» в систему мониторинга, переносим «query_dhcpd_server.php» в «cacti/scripts» и добавляем шаблон «6 Linux DHCPD Daemon — server stat» к нужному хосту.

В итоге, в зависимости от схемы работы сервера, должен появиться примерно такой график:
6 Linux DHCPD Daemon - server stat

2. Состояние динамических пулов.
Состояние динамических полов будем парсить из лиз, при помощи готового инструмента от net-track GmbH.

В частности, интересует лишь один перловый скрипт «dhcpd-snmp»

  • Скачиваем скрипт, в dhcpd-snmp.conf прописываем по аналогии сети:
#cd /etc/snmpd/

#wget https://github.com/spions/cacti_isc_dhcp/raw/master/dhcpd-snmp

#chmod 755 dhcpd-snmp

#wget https://github.com/spions/cacti_isc_dhcp/raw/master/dhcpd-snmp.conf
  • Вносим изменение в snmpd.conf, перезапускаем snmpd демона.
# grep "pass_persist" snmpd.conf
pass_persist .1.3.6.1.4.1.21695.1.2 /etc/snmp/dhcpd-snmp /etc/snmp/dhcpd-snmp.conf
  • Если все сделано верно, то с хоста мониторинга можно получить примерно такую статистику:
$ snmpwalk -v2c -c communiti host .1.3.6.1.4.1.21695.1.2
SNMPv2-SMI::enterprises.21695.1.2.1 = INTEGER: 3
SNMPv2-SMI::enterprises.21695.1.2.2.1.1 = INTEGER: 1
SNMPv2-SMI::enterprises.21695.1.2.2.1.2 = INTEGER: 2
SNMPv2-SMI::enterprises.21695.1.2.2.1.3 = INTEGER: 3
SNMPv2-SMI::enterprises.21695.1.2.2.2.1 = STRING: "pool: 10.0.0.0-10.255.255.255"
SNMPv2-SMI::enterprises.21695.1.2.2.3.1 = INTEGER: 2031
SNMPv2-SMI::enterprises.21695.1.2.2.4.1 = INTEGER: 1486
SNMPv2-SMI::enterprises.21695.1.2.2.5.1 = INTEGER: 545
SNMPv2-SMI::enterprises.21695.1.2.2.6.1 = INTEGER: 545

Как мы делали ранее, добавляем в кактус шаблон cacti_graph_template_6_linux_dhcpd_pool_statistics.xml и создаем график для необходимого хоста.

6 linux_dhcpd_pool_statistics

Дополнительные материалы по посту, можно найти на https://github.com/spions/

Вы можете оставить комментарий ниже.