image

Статья-инструкция по установке и базовой настройке отказоустойчивого сервера Kea DHCP


Kea DHCP – это open-source DHCP сервер, разрабатываемый Internet Systems Consortium(ISC) с поддержкой DHCPv4 и DHCPv6.

ISC – это те же ребята, которые разрабатывают наши любимые bind и dhcpd. Kea – разработана на базе BIND 10.

Kea позволяет запустить dhcp-сервер как для небольших систем, так и для больших телеком/корпоративных компаний. Из нововведений – использование API для управления сервисом, возможность хранения базы lease в СУБД и использование hooks для дополнительных функций.
На момент написания статьи(июнь 2019) – последняя стабильная версия 1.5.0.

Вдаваться в детальную работу протокола DHCP не буду, тогда статья будет раза в два-три больше. Есть хорошая статья на Хабре.

Протокол DHCP работает по протоколу UDP(порты 67-68), используется для динамического выделения ip-адресов. Использует четыре шага для получения/выдачи ip-адресов – discover-offer-request-acknowledge(DORA). Также DHCP использует понятие lease – аренда адреса, срок аренды адреса устройством – lease-time.

image

Почему Kea


DHCP сервер Kea обладает рядом преимуществ – скорость работы, возможность создания кластера отказоустойчивости, большого функционала и возможности покупки технической поддержки от разработчиков.

Этот продукт будет использоваться нашим телеком-оператором, который планирует выдавать около 2 млн. адресов, с 2000 запросами в секунду. Он был выбран из-за скорости работы и возможности создания кластера из двух серверов.

Поддерживаемые ОС


• CentOS Linux — 7.1804 (aka 7.5)
• Fedora — 28, 29
• Ubuntu — 16.04, 18.04
• Debian GNU/Linux — 7, 8, 9
• FreeBSD — 11.0
• macOS — 10.13, 10.14

Планов запуска Kea для Windows нет.

Хранение базы lease


Kea DHCP – поддерживает хранение базы выданных адресов в локальном CSV-файле(memfile) или в одной из трёх СУБД – MySQL, PostgreSQL и Cassandra.

Отличия – в скорости работы и возможностях хранения. Memfile – в 10 раз быстрее, но хранение базы в СУБД позволяет хранить дополнительные поля и опции DHCP. Сравнение скорости работы:

image

Очень большой анализ использования различных баз данных и локального хранения тут.

В нашем проекте решили начать с базы в memfile, так как количество запросов в секунду будет больше 2000.

Установка


В качестве примера Kea будет разворачиваться на базе CentOS 7(minimal edition):

[root@localhost ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)

Перед установкой самого сервиса, необходимо установить все необходимые зависимости:

  1. Библиотеки Boost C++ (http://www.boost.org/). # run-time среда с++ для запуска самого Kea
  2. Криптобиблиотеку Botan (вер. 1.9) или OpenSSL (вер. 1.0.1). Советую openssl, так как botan не будет поддерживаться с версии Kea 1.6.0
  3. log4cplus (вер. 1.0.3) development # нужен для создания логов
  4. Компилятор C++
  5. Библиотеки automake, libtool, pkg-config # для сборки и установки самого Kea
  6. Если будете использовать СУБД – то тогда установить MySQL, PostgreSQL или Cassandra.

Опционально если нужны RADIUS или NETCONF/YANG(на англ.)
  • FreeRADIUS client library when --with-freeradius configuration flag used.
  • Sysrepo (version 0.7.6 or later) and libyang (version 0.16-r2 or later) when --with-sysrepo configuration flag used.
  • googletest (version 1.8 or later), when using the --with-gtest configuration option to build the unit tests.
  • The documentation generation tools elinks, docbook-xsl, libxslt and Doxygen, if using the --enable-generate-docs configuration option to create the documentation.


Шаг 1. Устанавливаем нужные зависимости


# wget нужен для скачивания файлов 
sudo yum install wget
# репозиторий community программ
sudo yum install epel-release
# нужен для создания логов
sudo yum install log4cplus-devel
# run-time среда с++ для запуска самого Kea
sudo yum install boost-devel
# для генериации ssl сертификатов, нужен именно *-devel, иначе не поставиться
sudo yum install openssl-devel
# для сборки и установки Kead
sudo yum install automake libtool
# компилятор gcс, поставил Development Tools, т.к. другие варианты установки выдавали ошибку при установке 
sudo yum groupinstall Development\ Tools

Шаг 2. Если все зависимости встали нормально, переходим к установке самого Kea


# скачиваем исходники Kea (или скачиваем с сайта https://ftp.isc.org/isc/kea/1.5.0/ и передаем на сервер)
wget -nd https://ftp.isc.org/isc/kea/1.5.0/kea-1.5.0.tar.gz
# распаковываем архив
tar zxvf kea-1.5.0.tar.gz
# переходим в папку из архива
cd kea-1.5.0
# проверяем нужные библиотеки и готовимся к установке
#./configure [нужные опции здесь] я устанавливал без дополнительных опций
./configure 

*Тут нужно упомянуть про нужные опции – если вы планируете использовать СУБД, нужно отметить эту опцию.

Все опции при сборке:
--prefix
Define the installation location (the default is /usr/local).
--with-boost-include
Define the path to find the Boost headers.
--with-botan-config
Specify the path to the botan-config script to build with Botan for cryptographic functions.
--with-mysql
Build Kea with code to allow it to store leases and host reservations in a MySQL database.
--with-pgsql
Build Kea with code to allow it to store leases and host reservations in a PostgreSQL database.
--with-cql
Build Kea with code to allow it to store leases and host reservations in a Cassandra (CQL) database.
--with-gtest, --with-gtest-source
Enable the building of the C++ Unit Tests using the Google Test framework. This option specifies the path to the gtest source. (If the framework is not installed on your system, it can be downloaded from github.com/google/googletest.) from github.com/google/googletest.)
--with-benchmark, --with-benchmark-source
Enable the building of the database backend benchmarks using the Google Benchmark framework. This option specifies the path to the gtest source. (If the framework is not installed on your system, it can be downloaded from github.com/google/benchmark.)
--with-log4cplus
Define the path to find the Log4cplus headers and libraries.
--with-openssl
Replace Botan by the OpenSSL the cryptographic library. By default configure searches for a valid Botan installation: if one is not found, it searches for OpenSSL.

Собирается относительно долго, при сборке может выдавать ошибки если не установили какую-то зависимость. В конце вы увидите итог сборки:

image

Шаг 3. Устанавливаем


make
sudo make install

Операция make проходит очень долго(час или около того). Make install около минуты.

Запуск и настройка


Запускается из установленной директории:

keactrl start

Еще есть опции stop, reload(перезагрузка конфигурации) и status

При старте запускает три процесса – kea-dhcp4, kea-dhcp6 kea-ctrl-agent – агент для управления и управляющих коммуникации сервера

Если вам не нужен dhcp6, то можно запустить только dhcp4, не забываем запустить агента:

keactrl start -s dhcp4, ctrl_agent

Конфигурация


Основной конфигурационный файл dhcp4 — /usr/local/etc/kea/kea-dhcp4.conf

Файл хорошо описан, очень много комментариев и примеров настроек, не запутаетесь, напишу только главные настройки:
Указываем интерфейс или адрес через который будет работать dhcp4:

"interfaces-config": {
         // interface name (e.g. "eth0" or specific IPv4 address on that
        // interface name (e.g. "eth0/192.0.2.1").
        "interfaces": [ ]
}

Указываем где хранить базу lease

"lease-database": {
        // Memfile is the simplest and easiest backend to use. It's a in-memory
        // C++ database that stores its state in CSV file.
        "type": "memfile",
        "lfc-interval": 3600
    },

Какие DNS сервера будут презентованы клиентам

"option-data": [
       {
            "name": "domain-name-servers",
            "data": "192.0.2.1, 192.0.2.2"
        },


Доменное имя вашей организации
{
            "name": "domain-search",
            "data": "mydomain.example.com, example.com"
        },

И главная настройка — подсети, пулы и default gateway:

"subnet4": [
{ //subnet обязательный параметр, указывает Kea из какой подсети выдавать адреса
"subnet": "192.0.2.0/24",

            //пул адресов, который будут использоваться для выдачи клиентам
            "pools": [ { "pool": "192.0.2.1 - 192.0.2.200" } ],

"option-data": [
                {
                  // указываем default gateway для этой подсети
                    "name": "routers",
                    "data": "192.0.2.1"
                }
            ],

Ну и последний параметр, нужен для резервирования адресов из пула/подсети, указанные адреса не будут выдаваться клиентам, нужны для адресов сервера/устройств которые прописаны статично:


"reservations": [
                {
                    "hw-address": "1a:1b:1c:1d:1e:1f",
                    "ip-address": "192.0.2.201"
                }
]

Вот пожалуй основные настройки, после изменения конфигурации нужно перезапустить сервис –

keacrtl stop
keactrl start -s dhcp4,ctrl_agent

CSV-база


Локальная база хранится тут — /usr/local/var/kea/kea-leases4.csv


Логи


Логи по умолчанию хранятся — /usr/local/var/log/

Тут у каждого из компонентов отдельный файл:

  • kea-dhcp4.log
  • kea-dhcp6.log
  • kea-ctrl-agent.log

В отдельной статье опишу как запустить кластер из двух серверов и настройку синхронизации базы выдачи lease.

Использованные материалы

Комментарии (18)


  1. Meklon
    29.06.2019 23:58

    Как решается проблема split-brain в кластере? Если сеть моргнула и кластер рассекло на две независимые части.


    1. gecube
      30.06.2019 00:19

      поддержу, что это важный момент. Но меня больше волновало бы — как будет работать схема с двумя dhcp, причем обоими активными (такое возможно — rogue-dhcp), т.е. лучше когда активен только один.


      1. OldarKose Автор
        30.06.2019 17:45

        Есть механизмы, ждите второй статьи, уже пишу


  1. gecube
    30.06.2019 00:17

    Srsly, это те самые ребята, которые сделали популярнейший DNS-сервер (потому что его пихают во все дистры), но при этом на который не ругался только ленивый (из-за постоянных брешей в безопасности)? Я бы поостерегся это пускать в продакшен. Очень буду признателен, если переубедите меня.


    1. OldarKose Автор
      30.06.2019 17:46

      У заказчика стоит в продакшене 1.3.0, судя по тому что хотят сделать upgrdae до 1.5.0, видимо устраивает


  1. firk
    30.06.2019 01:13

    ISC – это те же ребята, которые разрабатывают наши любимые bind и dhcpd.

    Первой ассоциацией была жуткая дырявость их софта, "любимые" следовало в кавычки взять.


    Kea – разработана на базе BIND 10.

    Непонятно каким образом dhcp сервер сделали на базе dns сервера.


    1. gecube
      30.06.2019 01:39

      Поддержу, я, к сожалению, не могу найти ссылку на статью, где было описано по полочкам, почему ISС BIND такой нехороший, и какое негативное влияние имела ISC на развитие всей экосистемы вокруг DNS.


    1. gecube
      30.06.2019 01:44

      Касательно


      Kea – разработана на базе BIND 10.

      Очень интересно разложена внутренняя структура тут:
      https://www.opennet.ru/opennews/art.shtml?num=39598
      Так что действительно Kea сделана на базе BIND10 (насколько это вообще возможно)....


  1. Zoomerman
    30.06.2019 13:06

    А мог бы автор прокомментировать математику проекта?
    Вы утверждаете, что ожидаете 2000 запросов в секунду. При этом в конфиг-файлах резервируете пул в 200 адресов… Похоже, это тренировочный конфиг, выпадающий из темы статьи.

    Если вы планируете двумя серверами покрыть 2 млн выдаваемых адресов, значит, вы должны затранслировать мак-адреса клиентов из локальных сегментов «наверх». Полагаю, это планируется сделать с помощью DHCP-ретранслятора. Но как тогда быть с коллизиями маков «на самом верхнем уровне»? В компании с парой тысяч устройств в сети уже бывают коллизии мак-адресов, даже у техники, у которой изменить его не представляется возможным (принтеры, роутеры, телефоны).

    Правильно ли я понимаю, что централизацию DHCP вы планируете использовать только для авторизации устройств по мак-адресу? Или есть еще какие-то причины это делать?


    1. OldarKose Автор
      30.06.2019 17:48

      Да, только MAC, причем пулов будет больше 10 000. Это статья только про базовую установку в нашей тестовой среде.


    1. gecube
      30.06.2019 19:04

      В компании с парой тысяч устройств в сети уже бывают коллизии мак-адресов, даже у техники, у которой изменить его не представляется возможным (принтеры, роутеры, телефоны).

      Проблема реальна? Я почему спрашиваю — я реально всегда думал, что mac является уником и это гарантируется самим вендором и я действительно не сталкивался с проблемами вида "2 устройства в корп сети имеют одинаковый MAC-адрес". Очевидно, что если два таких устройства попадут на один WiFi точку, то работать все будет… от слова никак.


      1. DaemonGloom
        01.07.2019 07:29

        Да, проблема вполне реальна. Часть китайских телефонов любила(любит) этим грешить.


  1. donpadlo
    30.06.2019 17:42

    Былоб хорошо упомянуть о возможности работы с опциями (например Option 82), а так-же поподробнее рассмотреть по подробнее «хуки» (на пример на предмет хранения в БД соответствия МАС/порт и IP абонентов)


    1. OldarKose Автор
      30.06.2019 17:49

      К сожалению не разбирался с этим, у нас в проекте это не предусмотрено.


  1. P6i
    30.06.2019 19:33
    +1

    make
    sudo make install

    Есть, такая, категория людей, которым, какой из дистрибутивов linux не дай, они из него сделают слаку (при всей моей любви к слаке).
    Ну есть же готовый спек файл, от федоры, с минимальными телодвижениями его можно приспособить для centos. Зачем же из системы помойку делать и новичков плохому учить.


    1. OldarKose Автор
      01.07.2019 09:53

      Согласен, есть другие способы, но я все же склонен всегда придерживаться «официального мануала»(если он есть)


      1. gecube
        01.07.2019 13:11

        Прошу прощения, но это не официальный мануал, а путь в никуда. Как выше коллега отметил — make install в системе оставляет такие хвосты, которые потом руками приходится вычищать. Оптимально — устанавливать пакетным менеджером, ну, на худой конец предложили бы коллегам, которые хотят протестировать продукт, докер-образ готовый.
        Я, к сожалению, нередко сталкиваюсь с ситуацией, когда есть специалисты. Реально специалисты в своей области. Но они не могут сделать что-то смежное с их областью. Например, собрать правильный rpm/deb. Или сделать красивый мониторинг для приложения. Или что-то еще.


  1. sub31
    01.07.2019 21:12

    isc dhcp был вполне стандартным пакетом. До сих пор в дистрибутивах.