Мониторинг DHCP в Zabbix

    Задача: Имеется DHCP-сервер, который должен выдавать ip-адреса по mac-адресу. Имеется Zabbix-сервер, которым мы хотим мониторить способность DHCP-сервера выполнять эту функцию. Решение под катом.

    Сразу обращу внимание, что реально ip-адрес выдаваться не будет, дабы не нарушать работу Zabbix-сервера. Мы будем просто проверять, приходит ли предложение DHCPOFFER от нашего DHCP-сервера. Допустим, мак-адрес Zabbix-сервера 01:02:03:04:05:06, а ip-адрес, который нужно выдавать – 10.0.0.5. Это реализуется примерно такими строками в dhcpd.conf:

    host zabbix {
      hardware ethernet 01:02:03:04:05:06;
       fixed-address 10.0.0.5; }
    

    Теперь скачиваем исходники последней версии DHCP-клиента с официального сайта Internet Systems Consortium. Распаковываем tar.gz-архив.

    Вносим мелкие исправления в исходный файл client/dhclient.c, чтобы интерфейс на время DHCP-проверки не падал, а сразу после получения пакета DHCPOFFER – завершался. Ведь больше нам ничего не нужно – DHCP-сервер реагирует, и слава богу. Итак, исправления вносятся согласно следующему diff:

    # diff -c dhclient.c.orig dhclient.c
    *** dhclient.c.orig	2011-01-21 05:46:45.000000000 +0600
    --- dhclient.c	2011-03-16 17:58:22.996064000 +0600
    ***************
    *** 520,526 ****
      							    "alias_",
      							    ip->client->alias);
      			}
    ! 			script_go(ip->client);
      		}
      	}
      
    --- 520,526 ----
      							    "alias_",
      							    ip->client->alias);
      			}
    ! //			script_go(ip->client);
      		}
      	}
      
    ***************
    *** 971,976 ****
    --- 971,980 ----
      	client -> first_sending = cur_time;
      	client -> interval = client -> config -> initial_interval;
      
    +     unsigned char * addr = picked->address.iabuf;
    + 	printf("DHCPOFFER %d.%d.%d.%d",addr[0],addr[1],addr[2],addr[3]);
    + 	exit(0);
    + 
      	/* Make a DHCPREQUEST packet from the lease we picked. */
      	make_request (client, picked);
      	client -> xid = client -> packet.xid;
    ***************
    *** 1781,1786 ****
    --- 1785,1792 ----
      	/* If we're past the panic timeout, call the script and tell it
      	   we haven't found anything for this interface yet. */
      	if (interval > client -> config -> timeout) {
    + 		printf("No DHCPOFFERS received.");
    + 		exit(0);
      		state_panic (client);
      		return;
      	}
    

    И выполняем такие команды (в этот момент мы находимся в каталоге с исходниками):

    # make
    # mkdir -p /usr/local/etc/zabbix/externalscripts
    # cp client/dhclient /usr/local/etc/zabbix/externalscripts/dhcptest
    # chmod +s /usr/local/etc/zabbix/externalscripts/dhcptest
    

    Создаем файл /usr/local/etc/zabbix/externalscripts/dhcptest.sh следующего содержания:

    #!/bin/sh
    /usr/local/etc/zabbix/externalscripts/dhcptest eth0
    

    Здесь eth0 – сетевой интерфейс, через который должно идти общение с DHCP-сервером.
    На данном этапе должно работать выполнение скрипта dhcptest.sh от имени любого пользователя. В случае успеха скрипт говорит DHCPOFFER 10.0.0.5, а если адрес получить не удается – No DHCPOFFERS received..

    Теперь задействуем все это хозяйство в мониторинге Zabbix следующим образом. Item можно прикрепить к конкретному хосту, или к шаблону (как на скриншоте) – как вам удобнее:

    Также по желанию можно включить триггер:
    Теперь пробуем выключить DHCP-сервер, и наш мониторинг должен в течение 30 секунд нас проинформировать.

    Похожие статьи

2 thoughts on “Мониторинг DHCP в Zabbix”

  1. Огромное спасибо! Воспользовался Вашим решением для мониторинга, всё отлично. Правда, от имени пользователя у меня почему-то не работает – просто ничего не выводит.

  2. почему не выложил готовый файл? сейчас файлы dhcpclient уже сильно отличаются от того что было…

Leave a Reply

Your email address will not be published. Required fields are marked *