| Секция | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
Введение
Предварительная настройка
Установка
Для установки набора программ Kea используется команда:
| Command |
|---|
apt update |
sudo apt apt install keasysstat |
Конфигурационные файлы
IPv4 DHCP-сервер:
| Command |
|---|
sudo mkdir -p /etc/zabbix/scripts/ |
- Создать скрипт /etc/zabbix/scripts/iostat.sh для сбора статистики с клиентского компьютераНастройки сервера хранятся в JSON-формате в файле
/etc/kea/kea-dhcp4.conf.Раскрыть title Содержимое файла с настройками... Блок кода #!// Как минимум необходимо настроить: // - имена сетевых интерфейсов, на которых работает DHCP-сервер; // - выдаваемые клиентам параметры (например, адреса DNS-серверов); // - подсеть, в рамках которой выдаются адреса клиентам. // // В файле приведено малое количество настроек. // Полное описание возможных настроек сервера дано в официальной документации // "Kea User's Guide", находящейся по адресу https://kea.readthedocs.io/. { "Dhcp4": { // Имена сетевых интерфейсов, на которых принимает запросы DHCP-сервер. "interfaces-config": { // Можно указать название сетевого интерфейса, например: "eth0". // Или конкретный IP-адрес сетевого интерфейса, например: "eth0/192.0.2.1". "interfaces": [ "ens3" ] // По умолчанию DHCP-сервер принимает сетевые пакеты в режиме "raw sockets". // Это гарантирует, что сервер получит запросы от всех клиентов, // включая тех, кто подключен напрямую к серверу и ещё не имеет IP-адреса. // Однако, если все клиентские запросы ретранслируются (проходят через коммутатор), // то лучше использовать UDP-соединение. // "dhcp-socket-type": "udp" }, // UNIX-сокет для управления DHCP-сервером. Используется программой kea-ctrl-agent: // для настройки сервера, для загрузки настроек из файла, // для получения статистики сервера, и т. д. "control-socket": { "socket-type": "unix", "socket-name": "/run/kea/kea4-ctrl-socket" }, // Использовать Memfile (текстовой файл на диске) для хранения // информации о выданных клиентам IP-адресах. // Также может использоваться база данных MySQL или PostgreSQL. // Подробнее см. раздел "Lease Storage" в официальной документации. "lease-database": { "type": "memfile", "lfc-interval": 3600 }, // Информация о забронированных за узлами IP-адресах может быть указана // как в файле настроек, так и храниться в базе данных. // Если сеть небольшая, то проще использовать файл настроек. // Для большой сети лучше использовать базу данных: // "hosts-database": { // "type": "mysql", // "name": "kea", // "user": "kea", // "password": "kea", // "host": "localhost", // "port": 3306 // }, // Подробнее см. раздел "Hosts storage" в официальной документации. // Настройка обработки адресов с истёкшим сроком аренды. // Между окончанием одного цикла обработки адресов с истёкшим сроком аренды // и началом следующего должно пройти 10 секунд. // Каждые 25 секунд запускается процедура по удалению адресов, // чей срок аренды истёк более 3600 секунд назад. // За один цикл обработки аннулируется аренда максимум 100 адресов. // Один цикл аннулирования адресов длится максимум 250 мс. // Если после 5 последовательных циклов обработки аренды // всё ещё будут адреса с истёкшим сроком аренды, // то в журнал работы сервера будет выдано предупреждающее сообщение. "expired-leases-processing": { "reclaim-timer-wait-time": 10, "flush-reclaimed-timer-wait-time": 25, "hold-reclaimed-time": 3600, "max-reclaim-leases": 100, "max-reclaim-time": 250, "unwarned-reclaim-cycles": 5 }, // Глобальные настройки таймеров для всех подсетей. // В настройках конкретной подсети можно переопределить значения таймеров. "renew-timer": 900, "rebind-timer": 1800, "valid-lifetime": 3600, // Глобальные параметры. Отправляются клиенту, когда он их запрашивает. // Значение параметров может быть переопределено на более низких уровнях. // Уровни (от самого верхнего до самого нижнего): // - глобальный (наиболее общие настройки, могут быть переопределены на других уровнях); // - класс клиента; // - подсеть; // - узел (настройки данного уровня переопределяют настройки всех остальных уровней) // // Необходимо настраивать только те параметры, которые действительно нужны. // // Полный перечень параметров описан в официальной документации. "option-data": [ // Для задания параметра обычно достаточно указать его название или код, // а также данные. // Полное описание параметра состоит из названия, кода, области, // csv-формата и данных. // По умолчанию область параметра = "dhcp4", csv-формат = "true". // // Например, чтобы задать DNS-серверы, необходимо указать: // { // "name": "domain-name-servers", // "code": 6, // "csv-format": "true", // "space": "dhcp4", // "data": "192.0.2.1, 192.0.2.2" // } // но это слишком длинное описание, проще сделать так: { "name": "domain-name-servers", "data": "192.0.2.1, 192.0.2.2" }, // Вместо названия параметра можно использовать его код. // // Например, для указания доменного имени используется // параметр с названием "domain-name", которому соответствует код 15. // Тогда для настройки параметра с использованием кода можно указать: { "code": 15, "data": "example.org" }, // Параметр с доменными именами, // относительно которых клиент должен пытаться разрешать имена. // // Например, для имени "foo" клиент попытается разрешить имя как // "foo.mydomain.example.com", а если это не получится, // то как "foo.example.com" { "name": "domain-search", "data": "mydomain.example.com, example.com" }, // Запятая в строковых данных должна экранироваться // двумя обратными слешами: // { // "name": "boot-file-name", // "data": "EST5EDT4\\,M3.2.0/02:00\\,M11.1.0/02:00" // }, // Целые числовые значения могут быть указаны как в десятичном формате, // так и в шестнадцатеричном. // Шестнадцатеричное число указывается либо как есть (например, abcd) // либо с префиксом "0x" (например, 0xabcd). { "name": "default-ip-ttl", "data": "0xf0" } // Внимание: DHCP-сервер самостоятельно задаёт некоторые параметры, // даже если они не заданы в настройках. // Например, сервер отправляет: // - IP Address lease type (code 51, на основе параметра valid-lifetime); // - Subnet mask (code 1, на основе настроек subnet), // - Renewal time (code 58, на основе параметра renew-timer), // - Rebind time (code 59, на основе параметра rebind-timer). ], // Здесь можно расположить другие глобальные параметры. // Входящие запросы клиентов можно распределить по классам. // Класс может представлять группу устройств, которые обладают // каким-то общим свойством, например, компьютеры с ОС Windows, // телефоны iphone, и т. д. // Исходя из класса можно разрешить или запретить клиентам // использовать определённую подсеть, добавлять для них определённые параметры // или изменять их значения. "client-classes": [ { // Название класса. Используется для ссылки на этот класс. "name": "voip", // Данное тестовое выражение вычисляется для каждого входящего пакета. // Результатом вычисления является Истина или Ложь. // Если результат Истина, то пакет включается в данный класс. "test": "substring(option[60].hex,0,6) == 'Aastra'", // Клиентам, входящих в класс можно назначить свои параметры. "next-server": "192.0.2.254", "server-hostname": "hal9000", "boot-file-name": "/dev/null" // Здесь можно задать свои параметры для класса. } ], // Kea поддерживает загрузку внешних библиотек, т. н. "hook". // Библиотеки могут извлекать информацию из пакетов, а также влиять на то, // как сервер обрабатывает эти пакеты. // Подробнее см. раздел "Hook Libraries" в официальной документации. // "hooks-libraries": [ // { // // Библиотека для аудита всех устройств, обслуженных DHCP-сервером, // // включая их идентификаторы (MAC-адреса), их расположение в сети, // // время их активности. // "library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_legal_log.so", // "parameters": { // "path": "/var/lib/kea", // "base-name": "kea-forensic4" // } // }, // { // // Вычисляемый идентификатор (flex-id). // // Значение параметра вычисляется как комбинация других параметров. // // Подробнее см. раздел "flex_id: Flexible Identifier for Host Reservations" // // из официальной документации. // "library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_flex_id.so", // "parameters": { // "identifier-expression": "relay4[2].hex" // } // } // ], // Простой пример описания IPv4-подсети. // Это список структур, обозначенный скобками [ ]. Каждая структура // обозначена скобками { }. Структура описывает единичную подсеть и может иметь несколько параметров. // Одним из таких параметров является "pools", который также является списком структур. "subnet4": [ { // Задание всей подсети в целом. // Обязательный параметр для каждой подсети. "subnet": "192.0.2.0/24", // Диапазоны адресов подсети, из которых DHCP-сервер выдаёт адреса // клиентам. // Если параметр не задан, то сервер будет выдавать адреса только // тем клиентам, чьи адреса забронированы в настройках сервера. "pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ], // Параметры подсети. // Как минимум для каждой подсети необходимо указать адрес маршрутизатора, // т. к. без него клиенты не смогут выйти в Интернет. "option-data": [ { "name": "routers", "data": "192.0.2.1" } ], // DHCP-сервер позволяет бронировать IP-адреса за клиентами. // Доступны разные способы идентификации клиентов: // - hw-address (аппаратный MAC-адрес клиента); // - duid (DUID, направленный клиентом); // - client-id (идентификатор клиента, направленный клиентом); // - circuit-id (идентификатор, добавляемый ретранслятором, который // пересылает сетевые пакеты от клиента к DHCP-серверу); // - flex-id (вычисляемый идентификатор). "reservations": [ // Бронирование по MAC-адресу клиента. { "hw-address": "1a:1b:1c:1d:1e:1f", "ip-address": "192.0.2.201" }, // Бронирование по идентификатору клиента. // Также клиент получит забронированное имя узла. Имя узла можно указать // при любом способе идентификации клиента. { "client-id": "01:11:22:33:44:55:66", "ip-address": "192.0.2.202", "hostname": "special-snowflake" }, // Бронирование по DUID клиента. // Также клиент получит список DNS-серверов. // Данная список DNS-серверов на уровне узла имеет преимущество по сравнению // с DNS-серверами, заданными на глобальном уровне, на уровне подсети или класса. { "duid": "01:02:03:04:05", "ip-address": "192.0.2.203", "option-data": [ { "name": "domain-name-servers", "data": "10.1.1.202, 10.1.1.203" } ] }, // Бронирование по circuit-id. // Пример также содержит параметры, специфичные для производителя // клиентского оборудования. // // При использовании бронирования полезно настроить параметры: // reservations-global, reservations-in-subnet, // reservations-out-of-pool (параметр для подсети), // host-reservation-identifiers (глобальный параметр). { "circuit-id": "'charter950'", "ip-address": "192.0.2.204", "option-data": [ { "name": "vivso-suboptions", "data": "4491" }, { "name": "tftp-servers", "space": "vendor-4491", "data": "10.1.1.202, 10.1.1.203" } ] }, // Бронирование для клиента, которому требуется указать определённые // DHCPv4-параметры: next-server, server-hostname, boot-file-name { "client-id": "01:0a:0b:0c:0d:0e:0f", "ip-address": "192.0.2.205", "next-server": "192.0.2.1", "server-hostname": "hal9000", "boot-file-name": "/dev/null" }, // Бронирование на основе вычисляемого идентификатора "flex-id". // Администратор может задать выражение, аналогичное тому, которое // используется при классификации клиента, например, // "substring(relay[0].option[17],0,6)". Затем для входящего пакета // вычисляется значение выражения. Если вычисленное значение совпало // со значением параметра "flex-id", то осуществляется бронирование. // Значение параметра "flex-id" должно быть либо шестнадцатеричным числом // либо текстом, заключённым в одинарные кавычки. // // Примечание: для работы "flex-id" идентификатора требуется // библиотека "flex_id hook". { "flex-id": "'s0mEVaLue'", "ip-address": "192.0.2.206" } // Сюда можно ещё добавить настройки бронирования для клиентов. ] // Сюда можно добавить настройки других подсетей. } ], // Журналирование работы сервера. Сообщения о работе программ // направляются в журнал с помощью сущностей, называемых регистраторами (loggers). // Для разных событий используются разные регистраторы. // Подробнее см. раздел "Logging" в официальной документации. "loggers": [ { // Данная секция относится к kea-dhcp4 - основному регистратору DHCPv4-сервера. // Настроен вывод всех журнальных сообщений (уровня INFO или выше) в файл. "name": "kea-dhcp4", "output_options": [ { // Настройка, куда выводить сообщения: // - stdout (печать в стандартный вывод программы STDOUT); // - stderr (печать в стандартный вывод для ошибок программы STDERR); // - syslog (отправка сообщений в программу журналирования (syslog)); // - syslog:name (отправка сообщений в программу журналирования с использованием указанного имени); // - любое другое значение параметра рассматривается как название файла для вывода. "output": "syslog", // Шаблон для сокращения сообщения. Подходит для использования со службой systemd. "pattern": "%-5p %m\n", // Настройка, определяющая надо ли, чтобы каждое отправленное сообщение // фактически записывалось на диск, а не накапливалось в буфере файла. // "flush": false, // Максимальный размер файла в байтах, перед его ротацией. // "maxsize": 1048576, // Максимальное количество ротаций файла. // "maxver": 8 } ], // Уровень сообщений, отправляемых в журнал. // Поддерживаются значения: FATAL, ERROR, WARN, INFO, DEBUG. "severity": "INFO", // Этот параметр используется, если указан уровень DEBUG. 0 означает минимальную // подробность сообщений, 99 - максимальную. // Внимание: сервер может генерировать огромное количество сообщений. "debuglevel": 0 } ] } } bin/bash export LC_ALL="" export LANG="C" # Проверка на передачу параметров if [[ -z "$1" || -z "$2" || -z "$3" ]]; then ##### DISCOVERY ##### DEVICES=`iostat -d | awk '{print $1}' | sed -e '/^\([hsv]d[a-z]\)$/!d'` if [[ -n ${DEVICES} ]]; then JSON="{ \"data\":[" SEP="" for DEV in ${DEVICES}; do JSON=${JSON}"$SEP{\"{#HDNAME}\":\"${DEV}\"}" SEP=", " done JSON=${JSON}"]}" echo ${JSON} fi exit 0 fi ##### PARAMETERS ##### RESERVED="$1" METRIC="$2" DISK="$3" EXEC_TIMEOUT="2" NOW_TIME=`date '+%s'` ##### RUN ##### # Чтение статистики по метрике для конкретного диска declare -A METRICS=( ["r/s"]=2 ["rkB/s"]=3 ["rrqm/s"]=4 ["%rrqm"]=5 ["r_await"]=6 ["rareq-sz"]=7 ["w/s"]=8 ["wkB/s"]=9 ["wrqm/s"]=10 ["%wrqm"]=11 ["w_await"]=12 ["wareq-sz"]=13 ["d/s"]=14 ["dkB/s"]=15 ["drqm/s"]=16 ["%drqm"]=17 ["d_await"]=18 ["dareq-sz"]=19 ["f/s"]=20 ["f_await"]=21 ["aqu-sz"]=22 ["%util"]=23 ) COLUMN=${METRICS[$METRIC]} if [[ -z "$COLUMN" ]]; then echo "Неизвестная метрика, проверьте в 'iostat -dxk': $METRIC" exit 1 fi iostat -dxk | awk -v disk="$DISK" -v col="$COLUMN" '$1 == disk {print $col}'
Command chmod 750 /etc/zabbix/scripts/iostat.sh
chown root:zabbix /etc/zabbix/scripts/iostat.shchmod +x /etc/zabbix/scripts/iostat.sh
- После изменения настроек необходимо перезапустить сервер:
Command sudo systemctl restart kea-dhcp4-server
...