• Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8).

Введение




Установка

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

sudo apt install kea

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

IPv4 DHCP-сервер:

  1. Настройки сервера хранятся в JSON-формате в файле /etc/kea/kea-dhcp4.conf.
    // Как минимум необходимо настроить:
    // - имена сетевых интерфейсов, на которых работает 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. После изменения настроек необходимо перезапустить сервер:

    sudo systemctl restart kea-dhcp4-server