Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.
Секция
Столбец

Оглавление
stylenone

Столбец
Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8).

Введение

Kea DHCP – это современный DHCP-сервер, пришедший на смену ISC DHCP-серверу. Домашняя страница набора программ Kea: strongSwan – это программное обеспечение для создания виртуальной частной сети (VPN) на основе IPsec. Домашняя страница ПО: https://www.iscstrongswan.org/kea/.Информация о выданных IP-адресах и именах хранится в базе данных. Поддерживаются базы данных: memfile (текстовой файл на диске), MySQL, PostgreSQL.

В набор программ Kea входят:

...

Сервер для динамического обновления записей о выданных адресах на DNS-сервере.

Для взаимодействия с DNS-сервером используется DDNS-протокол

...

Программа для обслуживания базы данных DHCP-сервера

...

Программа для удаления избыточной информации из memfile базы данных.

Обычно программа запускается DHCP-сервером по мере необходимости

...




Установка

Для установки набора программ Kea используется команда:

Command

sudo apt install kea

Конфигурационные файлы

IPv4 DHCP-сервер:

  1. Настройки сервера хранятся в 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
        }
      ]
    }
    }
    
  2. После изменения настроек необходимо перезапустить сервер:
    Command

    sudo systemctl restart kea-dhcp4-server

...

  1. Настройки сервера хранятся в JSON-формате в файле /etc/kea/kea-dhcp6.conf.
    Раскрыть
    titleСодержимое файла с настройками...
    Блок кода
    // Как минимум необходимо настроить:
    // - имена сетевых интерфейсов, на которых работает DHCP-сервер;
    // - выдаваемые клиентам параметры (например, адреса DNS-серверов);
    // - подсеть, в рамках которой выдаются адреса клиентам.
    //
    // В файле приведено малое количество настроек.
    // Полное описание возможных настроек сервера дано в официальной документации
    // "Kea User's Guide", находящейся по адресу https://kea.readthedocs.io/.
    {
    
    "Dhcp6": {
        // Имена сетевых интерфейсов, на которых принимает запросы DHCP-сервер.
        "interfaces-config": {
            // Обычно достаточно указать название сетевого интерфейса, например: "eth0".
            // IPv6 DHCP-сервер работает с мультикастными сетевыми пакетами.
            // Чтобы сервер также обрабатывал и юникаст-пакеты, необходимо
            // указать конкретный IP-адрес, например: "eth0/2001:db8::1".
            // (DHCPv6 - это протокол, основанный на мультикастной передаче данных).
            "interfaces": [ "ens3" ]
        },
    
        // UNIX-сокет для управления DHCP-сервером. Используется программой kea-ctrl-agent: 
        //  для настройки сервера, для загрузки настроек из файла,
        //  для получения статистики сервера, и т. д.
        "control-socket": {
            "socket-type": "unix",
            "socket-name": "/run/kea/kea6-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
        },
    
        // Глобальные настройки таймеров
        // Клиент должен продлять аренду адреса каждые 1000 секунд.
        // Если сервер не ответил на запрос о продлении аренды в течение 2000 секунд,
        //  то клиент должен запустить процедуру REBIND (экстренное обновление аренды, позволяющее
        //  переключиться на другой сервер).
        // Предпочтительный срок аренды адреса 3000 секунд.
        // Допустимый срок аренды адреса 4000 секунд.
        "renew-timer": 1000,
        "rebind-timer": 2000,
        "preferred-lifetime": 3000,
        "valid-lifetime": 4000,
    
        // Глобальные параметры. Отправляются клиенту, когда он их запрашивает.
        // Значение параметров может быть переопределено на более низких уровнях.
        // Уровни (от самого верхнего до самого нижнего):
        // - глобальный (наиболее общие настройки, могут быть переопределены на других уровнях);
        // - класс клиента;
        // - подсеть;
        // - узел (настройки данного уровня переопределяют настройки всех остальных уровней)
        //
        // Необходимо настраивать только те параметры, которые действительно нужны.
        //
        // Полный перечень параметров описан в официальной документации.
        "option-data": [
            // Для задания параметра обычно достаточно указать его название или код,
            // а также данные.
            // Полное описание параметра состоит из названия, кода, области, 
            // csv-формата и данных.
            // По умолчанию область параметра = "dhcp6", csv-формат = "true".
            //
            // Например, чтобы задать DNS-серверы, необходимо указать:
            // {
            //     "name": "dns-servers",
            //     "code": 23,
            //     "csv-format": "true",
            //     "space": "dhcp6",
            //     "data": "2001:db8:2::45, 2001:db8:2::100"
            // }
            // но это слишком длинное описание, проще сделать так:
            {
                "name": "dns-servers",
                "data": "2001:db8:2::45, 2001:db8:2::100"
            },
    
            // Вместо названия параметра можно использовать его код.
            //
            // Например, DHCPv6 может дополнительно использовать юникаст-пакеты,
            //  если указан соответствующий параметр.
            // Параметру "unicast" соответствует код 12. Поэтому к параметру можно обратиться либо
            //  по его названию: "unicast" либо по коду: 12. 
            // При использовании параметра также необходимо указать адрес,
            //  на котором сервер будет принимать пакеты.
            {
                "code": 12,
                "data": "2001:db8::1"
            },
    
            // Запятая в строковых данных должна экранироваться
            //  двумя обратными слешами:
            {
                "name": "new-posix-timezone",
                "data": "EST5EDT4\\,M3.2.0/02:00\\,M11.1.0/02:00"
            },
    
            // Целые числовые значения могут быть указаны как в десятичном формате,
            //  так и в шестнадцатеричном.
            // Шестнадцатеричное число указывается либо как есть (например, abcd)
            //  либо с префиксом "0x" (например, 0xabcd).
            {
                "name": "preference",
                "data": "0xf0"
            },
    
            // Значением некоторых параметров является кортеж,
            //  который должен быть заключён в кавычки. Отдельные данные в кортеже разделяются запятыми.
            {
                "name": "bootfile-param",
                "data": "root=/dev/sda2, quiet, splash"
            }
        ],
    
        // 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-forensic6"
        //       }
        //   },
        //   {
        //       // Вычисляемый идентификатор (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": "relay6[0].option[37].hex"
        //       }
        //   }
        // ],
    
        // Простой пример описания IPv6-подсети.
        // Это список структур, обозначенный скобками [ ]. Каждая структура 
        //  обозначена скобками { }. Структура описывает единичную подсеть и может иметь несколько параметров.
        // Одним из таких параметров является "pools", который также является списком структур.
        "subnet6": [
            {
                // Задание всей подсети в целом.
                // Обязательный параметр для каждой подсети.
                "subnet": "2001:db8:1::/64",
    
                // Диапазоны адресов подсети, из которых DHCP-сервер выдаёт адреса клиентам.
                // Если параметр не задан, то сервер будет выдавать адреса только
                //  тем клиентам, чьи адреса забронированы в настройках сервера.
                "pools": [ { "pool": "2001:db8:1::/80" } ],
    
                // Сервер поддерживает делегирование префиксов (PD). Этот механизм делегирует
                // целый префикс адресов вместо единичного адреса. 
                // Необходимо задать префикс, а также размер делегируемых префиксов, на которые он будет разбит.
                // Например, исходный префикс 2001:db8:1::/56 разбивается на делегируемые префиксы /64.
                // Это даст 256 (2^(64-56)) делегируемых префиксов.
                "pd-pools": [
                    {
                        "prefix": "2001:db8:8::",
                        "prefix-len": 56,
                        "delegated-len": 64
    
                        // Сервер также поддерживает исключаемые префиксы.
                        // Необходимо убедиться, что исключаемый префикс соответствует пулу адресов.
                        // "excluded-prefix": "2001:db8:8:0:80::",
                        // "excluded-prefix-len": 72
                    }
                ],
                "option-data": [
                    // Параметры подсети.
                    // Здесь можно переопределить глобальные параметры.
                    {
                        "name": "dns-servers",
                        "data": "2001:db8:2::dead:beef, 2001:db8:2::cafe:babe"
                    }
                ],
    
                // Для каждой подсети можно настроить бронирование адресов.
                "reservations": [
                    // Бронирование по DUID клиента.
                    {
                        "duid": "01:02:03:04:05:0A:0B:0C:0D:0E",
                        "ip-addresses": [ "2001:db8:1::100" ]
                    },
    
                    // Бронирование по MAC-адресу клиента.
                    // Также настроены два дополнительных параметра, которые имеют преимущество
                    //  по сравнению с этими же параметрами, заданными 
                    //  на глобальном уровне, на уровне подсети или класса.
                    {
                        "hw-address": "00:01:02:03:04:05",
                        "ip-addresses": [ "2001:db8:1::101" ],
                        "option-data": [
                            {
                                "name": "dns-servers",
                                "data": "3000:1::234"
                            },
                            {
                                "name": "nis-servers",
                                "data": "3000:1::234"
                            }],
    
                        // Клиенту будет автоматически назначен класс
                        "client-classes": [ "special_snowflake", "office" ]
                    },
    
                    // Более сложная настройка бронирования.
                    // Клиент с заданным DUID получит адрес, префикс и имя узла.
                    // Бронируется адрес, который не входит в пул динамически бронируемых адресов.
                    // Также клиент получит параметры, касающиеся поставщика клиентского оборудования.
                    {
                        "duid": "01:02:03:04:05:06:07:08:09:0A",
                        "ip-addresses": [ "2001:db8:1:0:cafe::1" ],
                        "prefixes": [ "2001:db8:2:abcd::/64" ],
                        "hostname": "foo.example.com",
                        "option-data": [
                            {
                                "name": "vendor-opts",
                                "data": "4491"
                            },
                            {
                                "name": "tftp-servers",
                                "space": "vendor-4491",
                                "data": "3000:1::234"
                            }
                        ]
                    },
    
                    // Бронирование на основе вычисляемого идентификатора "flex-id". 
                    // Администратор может задать выражение, аналогичное тому, которое
                    // используется при классификации клиента, например,
                    // "substring(relay[0].option[17],0,6)". Затем для входящего пакета
                    // вычисляется значение выражения. Если вычисленное значение совпало
                    // со значением параметра "flex-id", то осуществляется бронирование.
                    // Значение параметра "flex-id" должно быть либо шестнадцатеричным числом
                    // либо текстом, заключённым в одинарные кавычки.
                    //
                    // Примечание: для работы "flex-id" идентификатора требуется 
                    //  библиотека "flex_id hook".
                    {
                        "flex-id": "'somevalue'",
                        "ip-addresses": [ "2001:db8:1:0:cafe::2" ]
                    }
                ]
            }
            // Сюда можно добавить настройки других подсетей.
            //      {
            //          "subnet": "2001:db8:2::/64",
            //          "pools": [ { "pool": "2001:db8:2::/80" } ]
            //      },
            //      {
            //          "subnet": "2001:db8:3::/64",
            //          "pools": [ { "pool": "2001:db8:3::/80" } ]
            //      },
            //      {
            //          "subnet": "2001:db8:4::/64",
            //          "pools": [ { "pool": "2001:db8:4::/80" } ]
            //      }
        ],
    
        // Здесь можно определить классы клиентов. См. для примера раздел "client-classes" 
        // в описании настроек IPv4 DHCP-сервера.
    
        // DDNS настройка взаимодействия с DDNS-сервером.
    
        // Журналирование работы сервера. Сообщения о работе программ 
        // направляются в журнал с помощью сущностей, называемых регистраторами (loggers).
        // Для разных событий используются разные регистраторы.
        // Подробнее см. раздел "Logging" в официальной документации.
        "loggers": [
        {
            // Данная секция относится к kea-dhcp6, т. е. к IPv6 DHCP-серверу.
            "name": "kea-dhcp6",
            "output_options": [
                {
                    // Настройка, куда выводить сообщения:
                    // - stdout (печать в стандартный вывод программы STDOUT);
                    // - stderr (печать в стандартный вывод ошибок программы STDERR);
                    // - syslog (отправка сообщений в программу журналирования (syslog));
                    // - syslog:name (отправка сообщений в программу журналирования с использованием указанного имени);
                    // - любое другое значение параметра рассматривается как название файла для вывода.
                    "output": "stdout",
    
                    // Шаблон для сокращения сообщения. Подходит для использования со службой systemd.
                    "pattern": "%-5p %m\n",
    
                    // Настройка, определяющая надо ли, чтобы каждое отправленное сообщение 
                    // фактически записывалось на диск, а не накапливалось в буфере файла.
                    // "flush": false,
    
                    // Максимальный размер файла в байтах, перед его ротацией.
                    // "maxsize": 1048576,
    
                    // Максимальное количество ротаций файла.
                    // "maxver": 8
                }
            ],
            // Уровень сообщений, отправляемых в журнал.
            // Поддерживаются значения: FATAL, ERROR, WARN, INFO, DEBUG.
            "severity": "INFO",
    
            // Этот параметр используется, если указан уровень DEBUG. 0 означает минимальную
            // подробность сообщений, 99 - максимальную.
            // Внимание: сервер может генерировать огромное количество сообщений.
            "debuglevel": 0
        }
      ]
    }
    }
  2. После изменения настроек необходимо перезапустить сервер:
    Command

    sudo systemctl restart kea-dhcp6-server

Создание отказоустойчивого DHCP-кластера 

Архитектура кластера

Отказоустойчивый DHCP-кластер состоит из двух узлов: ведущего dhcp-1 и подчинённого dhcp-2.

...

Имя узлаIP-адресНазначение
dhcp-110.192.6.108/24
Ведущий узел кластера
dhcp-210.192.6.109/24
Подчинённый узел кластера

Предварительная настройка

Задать имена узлов и настроить разрешение имён в соответствии со статьёй "Настройка разрешения имен и статических IP-адресов".

...

  1. На каждом узле – добавить в файл /etc/hosts строки:
    Блок кода
    10.192.6.108 dhcp-1
    10.192.6.109 dhcp-2
  2. На первом узле – установить имя узла:
    Command
    sudo hostnamectl hostname dhcp-1
  3. На втором узле – установить имя узла:
    Command
    sudo hostnamectl hostname dhcp-2

Настройка кластера

На ведущем узле dhcp-1:

  1. Создать файл /etc/kea/kea-ctrl-agent.conf с настройками управляющего агента.
    Раскрыть
    titleСодержимое файла с настройками...
    Блок кода
    {
        "Control-agent":
        {
            // IP-адрес и порт, на которых управляющий агент принимает HTTP-запросы
            "http-host": "10.192.6.108",
            "http-port": 8000,
    
            "control-sockets":
            {
                // Сокет для связи с локальным DHCPv4-сервером
                // ДОЛЖЕН СОВПАДАТЬ С СОКЕТОМ, КОТОРЫЙ ИСПОЛЬЗУЕТ DHCPv4-СЕРВЕР
                "dhcp4":
                {
                    "comment": "socket to DHCP4 server",
                    "socket-type": "unix",
                    "socket-name": "/run/kea/kea4-ctrl-socket"
                }
            },
    
            // Настройки журналирования
            "loggers": [
                {
                    "name": "kea-ctrl-agent",
                    "output_options": [
                        {
                            "output": "syslog"
                        }
                    ],
                    "severity": "INFO"
                }
            ]
        }
    }
  2. Создать файл /etc/kea/kea-dhcp4.conf с настройками DHCP-сервера.
    В файле за работу кластера отвечает раздел "hooks-libraries". На обоих узлах этот раздел отличается только значением параметра "this-server-name".
    Раскрыть
    titleСодержимое файла с настройками...
    Блок кода
    {
    "Dhcp4": {
    
        "interfaces-config": {
            "interfaces": [ "ens3" ]
        },
    
        "control-socket": {
            "socket-type": "unix",
            "socket-name": "/run/kea/kea4-ctrl-socket"
        },
    
        "lease-database": {
            "type": "memfile"
        },
    
        "valid-lifetime": 43200,
        "renew-timer": 21600,
        "rebind-timer": 32400,
    
        "expired-leases-processing": {
            "reclaim-timer-wait-time": 3600,
            "max-reclaim-leases": 0,
            "max-reclaim-time": 0
        },
    
        "hooks-libraries": [
            // Библиотека для обмена информацией между DHCP-серверами
            // о выданных адресах
            {
                "library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_lease_cmds.so"
            },
    
            // Библиотека для работы отказоустойчивого кластера
            {
                "library": "/usr/lib/x86_64-linux-gnu/kea/hooks/libdhcp_ha.so",
                "parameters": {
                    // На каждом узле должны быть одинаковые настройки,
                    // за исключением параметра "this-server-name"
                    "high-availability": [ {
                        // Уникальное имя сервера ТЕКУЩЕГО УЗЛА.
                        "this-server-name": "dhcp-1",
    
                        "mode": "hot-standby",
                        "heartbeat-delay": 10000,
                        "max-response-delay": 60000,
                        "max-ack-delay": 5000,
                        "max-unacked-clients": 0,
                        "sync-timeout": 60000,
    
                        "peers": [
                            // Настройки ВЕДУЩЕГО узла кластера
                            {
                                "name": "dhcp-1",
                                "url": "http://10.192.6.108:8000/",
                                "role": "primary"
                            },
                            // Настройки ПОДЧИНЁННОГО узла кластера
                            {
                                "name": "dhcp-2",
                                "url": "http://10.192.6.109:8000/",
                                "role": "standby"
                            }
                        ]
                    } ]
                }
            }
        ],
    
        "subnet4": [
            {
                "subnet": "10.192.6.0/24",
                "interface": "ens3",
    
                "pools": [
                    {
                        "pool": "10.192.6.105-10.192.6.115"
                    }
                ]
    
            }
        ],
    
        "loggers": [
        {
            "name": "kea-dhcp4",
            "output_options": [
                {
                    "output": "syslog"
                }
            ],
            "severity": "INFO"
        }
        ]
      }
    }
  3. Перезапустить DHCP-сервер и управляющего агента для применения настроек:
    Command

    sudo systemctl restart kea-dhcp4-server

    Command

    sudo systemctl restart kea-ctrl-agent

...