// Как минимум необходимо настроить:
// - имена сетевых интерфейсов, на которых работает 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
}
]
}
}
|