Monitorovanie DHCP servera pomocou Zabbix-u

9. mája 2016

V tomto článku vám predstavím, akým spôsobom monitorovať isc-dhcp server, pomocou monitorovacieho systému Zabbix.  Pôjde hlavne o monitorovanie veľkosti rozsahu a počtu pridelených IP. Pôvodný článok v portugalčine som objavil na blogu WERNECK COSTA.

Scenár :

  • Server Ubuntu 14.04.4 LTS
  • Zabbix Server a agent verzia 3.0.2
  • ISC-DHCP
  • Oba servery bežia na jednom stroji, preto budem používať IP 127.0.0.1

Sledované hodnoty:

  • Kapacita IP rozsahu (pool)
  • Počet pridelených IP z rozsahu
  • Počet IP „touch“ v každom rozsahu

Ako Zabbix prečíta dáta z DHCP servera

Keďže „Lease“ súbor môže byť pomerne rozsiahly, akýkoľvek „cat + grep + cut“ by preto trval dlho a spotreboval by veľa zdrojov. Preto sa autor rozhodol použiť nástroj dhcpd-pools: http://dhcpd-pools.sourceforge.net/.

Postup:

Nainštalujeme si závislosti:

$ apt-get install -y -b  xz-utils gnulib uthash-dev

Vytvoríme si adresár, stiahneme a rozbalíme dhcpd-pools:

$ mkdir /usr/src/dhcpd-pools 
$ cd /usr/src/dhcpd-pools 
$ wget https://sourceforge.net/projects/dhcpd-pools/files/dhcpd-pools-2.28.tar.xz/download -O dhcpd-pools-2.28.tar.xz 
$ tar xJf dhcpd-pools-2.28.tar.xz

Skompilujeme a nainštalujeme:

$ cd dhcpd-pools-2.28
$ ./configure && make && make install

Po inštalácii môžeme vykonať skúšku pomocou nasledovného príkazu:

$ dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases

Výstup príkazu by mal vyzerať nejako takto:

Ranges:
shared net name first ip last ip max cur percent touch t+c t+c perc
All networks 172.16.101.1 - 172.16.101.254 254 6 2.362 179 185 72.835

Shared networks:
name max cur percent touch t+c t+c perc

Sum of all ranges:
name max cur percent touch t+c t+c perc
All networks 254 6 2.362 179 185 72.835

Z výstupu môžeme vyčítať že, sieť má nakonfigurovaný rozsah 254 IP adries, z čoho 6 IP sa používa, čo je 2,362%, a 179 IP bolo už použitých. Väčšinou ale potrebujeme prideľovať IP adresy pre viaceré siete. Na to potrebujeme vykonať potrebné zmeny v etc/dhcp/dhcpd .conf. Treba pridať  do config-u shared-network nazov_subnetu { subnet …}:

# cudzi 158.195.95.11 - 254
    shared-network cudzi {
        subnet 158.195.95.0 netmask 255.255.255.0
	{
	    range 158.195.95.11 158.195.95.254;
	    option subnet-mask 255.255.255.0;
	    option broadcast-address 158.195.95.255;
	    option routers 158.195.95.1;
	    default-lease-time 	43200;    #12 hours (v sekundach)
	    max-lease-time	86400;    #172800 = 48 hours, 86400 = 24 hours
	}
    }	
# standartni 158.195.40.0/21
    shared-network standartni {
	subnet 158.195.40.0 netmask 255.255.248.0
	{
	    range 158.195.40.31 158.195.47.254;
	    option subnet-mask 255.255.248.0;
	    option broadcast-address 158.195.47.255;
	    option routers 158.195.40.250;
	    default-lease-time 10368000; #120 dni
	    max-lease-time     10368000; #120 dni
	}
    }

Potom bude výstup vyzerať nasledovne: 

$ dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases
Ranges:
shared net name     first ip           last ip            max   cur    percent  touch   t+c  t+c perc
standartni          18.15.40.31      - 18.15.47.254       2016   566    28.075     17   583    28.919
cudzi               18.15.95.11      - 18.15.95.254       244    10      4.098    214   224    91.803

Shared networks:
name                   max   cur     percent  touch    t+c  t+c perc
cudzi                  244    10      4.098     214    224    91.803
standartni            2016   566     28.075      17    583    28.919

Sum of all ranges:
name                   max   cur     percent  touch    t+c  t+c perc
All networks          2514   576     22.912     231    807    32.100

Teraz si výpis zjednodušíme, aby sme s nim mohli ďalej pracovať, pre lepšie pochopenie je možné zobraziť nápovedu (man dhcpd-pools):

-L, --limit=NR
The NR will limit what will be printed. Syntax is similar to chmod(1) permission string. The NR limit string uses two digits which vary between
0 to 7. The first digit determines which headers to display, and the second digit determines which numeric analysis tables to include in the output.
The following values are "OR'd" together to create the desired output. The default is 77.

01 Print ranges
02 Print shared networks
04 Print total summary
10 Print range header
20 Print shared network header
40 Print total summary header

Tu môžeme vidieť, že použitie parametra “ L “ obmedzuje výpis podľa vyššie uvedenej tabuľky, v závislosti na zvolenej kombinácii. Takže, ak by sme spustili príkaz vrátane “ -L22 „, vrátia sa iba dáta z “ Shared networks“ :

$ dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -L22

Výsledok:

Shared networks:
name                   max   cur     percent  touch    t+c  t+c perc
cudzi                  244    11      4.508     213    224    91.803
standartni            2016   566     28.075      17    583    28.919

 

Zachytávanie údajov pomocou Zabbixu

Pomocou rozšírenia Zabbix agenta je možné sledovať všetko, čo je možné získať zo servera príkazom alebo scriptom. Princíp je veľmi jednoduchý. V konfiguračnom súbore agenta /etc/zabbix/zabbix_agentd.conf pridáme (zmeníme) riadok:

# Include=/etc/zabbix_agentd.userparams.conf

Zmeníme na:

Include=/etc/zabbix_agentd.conf.d/

V tomto adresári (/etc/zabbix_agentd.conf.d/) vytvoríme súbor „userparameters_dhcpd.conf“ a skopírujeme do neho nasledujúce user parametre:

UserParameter=dhcp.pool.all,dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -L22
UserParameter=dhcp.pool.max[*],dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -L22|grep -i $1|sed 's/ \+/;/g'|cut -d';' -f2
UserParameter=dhcp.pool.use[*],dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -L22|grep -i $1|sed 's/ \+/;/g'|cut -d';' -f3
UserParameter=dhcp.pool.percent[*],dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -L22|grep -i $1|sed 's/ \+/;/g'|cut -d';' -f4
UserParameter=dhcp.pool.touch[*],dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -L22|grep -i $1|sed 's/ \+/;/g'|cut -d';' -f5

Po vytvorení súboru reštartujeme agenta:

$ sudo /etc/init.d/zabbix-agent restart

Každý UserParameter má dva prvky: položku a príkaz. Príklad:

Položka (Item):

dhcp.pool.all

Príkaz (Command): 

dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -L22

A následne vyskúšame či Zabbix agent pracuje s našimi user parametrami: 

$ zabbix_get -s 127.0.0.1 -k dhcp.pool.all

Ak je všetko v poriadku, výpis by mal vyzerať nasledovne:

Shared networks:
name                   max   cur     percent  touch    t+c  t+c perc
cudzi                  244    11      4.508     213    224    91.803
standartni            2016   566     28.075      17    583    28.919

Ďalej môžeme otestovať ostatné položky UserParameters: 

$ zabbix_get -s 127.0.0.1 -k dhcp.pool.percent[cudzi]

V mojom prípade sa mi vrátila hodnota:

4.508

Ďalej budeme potrebovať skript, ktorý oznámi aké subnety sú zadefinované v DHCP serveri a vráti údaje vo formáte JSON.

Vytvoríme /etc/zabbix/scripts/dhcppolls.sh

#!/bin/bash
pools_all=`dhcpd-pools -c /etc/dhcp/dhcpd.conf -l /var/lib/dhcp/dhcpd.leases -L02|egrep -io "^[a-z]*(\-|\_)?[a-z]*"`
pools_qtd=`echo $pools_all|wc -w`
retorno=`echo -e "{\n\t\t"\"data\"":["`
for p in $pools_all
do
 if [ "$pools_qtd" -le "1" ]
 then
 retorno=$retorno`echo -e "\n\t\t{\"{#DHCPPOOL}\":\"$p\"}"`
 else
 retorno=$retorno`echo -e "\n\t\t{\"{#DHCPPOOL}\":\"$p\"},"`
 fi
 pools_qtd=$(($pools_qtd - 1))
done
retorno=$retorno`echo -e "]}"`
echo -e $retorno

Pridáme do súboru /etc/zabbix_agentd.conf.d/userparameters_dhcpd.conf ďalší riadok (UserParameter):

UserParameter=dhcp.pool.discovery,/etc/zabbix/scripts/dhcppolls.sh

A znovu reštartujeme agenta:

$ sudo /etc/init.d/zabbix-agent restart

Funkčnosť „discovery“ skriptu si overíme nasledovným príkazom:

$ zabbix_get -s 127.0.0.1 -k dhcp.pool.discovery

Výpis by mal vyzerať nasledovne:

{ "data":[ {"{#DHCPPOOL}":"cudzi"}, {"{#DHCPPOOL}":"standartni"}]}

Ak nám všetko funguje, môžeme prejsť k nastaveniu rozhrania Zabbixu. Pridáme objavovacie pravidlo cez „Configuration -> Hosts -> nas_dhcp_server -> Discovery rules -> Create discovery rule

Ďalej pridáme Item prototypes:

Do Items pridáme všetky položky, ktoré chceme sledovať: 

Funkčnosť si overíme cez Monitoring -> Overview

Prípadne môžeme z nazbieraných údajov vykresliť graf, ktorý sa automaticky vytvorí pre každý subnet: Configuration -> Hosts -> nas_dhcp_server -> Discovery rules -> Discovery DHCP Pools -> Graph prototypes 

Prípadne môžeme vytvoriť graf pre všetky subnety súčasne, v tomto prípade však treba pridať každý subnet ručne: Configuration -> Hosts -> nas_dhcp_server -> Graphs -> Create graph

Pri reštartovaní servera mi nechcel tento monitoring nabehnúť a tak som našiel takéto, trocha primitívne riešenie.

Pridať do /etc/rc.local

zabbix_get -s 127.0.0.1 -k dhcp.pool.discovery > /dev/null
sleep 120
sudo /etc/init.d/zabbix-agent force-reload

Zdroj: https://neckcosta.wordpress.com/2013/11/01/monitoramento-de-pools-isc-dhcp-com-zabbix/

Potrebujete pomocť s WordPress webom?

Ďalšie články…

0 komentárov

Odoslať komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *