DHCP. Установка сервера DHCP Kea

Установка сервера DHCP ISC Kea.

Содержание

1 Общая информация

1.1 Особенности

  • Модульная конструкция компонентов
    • Расширяется с помощью модулей-хуков.
    • Дистрибутив Kea включает отдельные демоны для сервера DHCPv4, сервера DHCPv6 и модуля динамического DNS (DDNS).
  • Онлайн-реконфигурация с помощью REST API.
    • Kea использует файл конфигурации JSON, который можно изменить удалённо без остановки и перезапуска сервера.
  • Панель управления через веб-интерфейс.
  • Поддерживает базы данных MySQL, PostgreSQL:
    • упрощает интеграцию с другими системами;
    • можно использовать один и тот же сервер резервирования хостов для нескольких DHCP-серверов;
    • администрирование глобальных параметров из централизованной системы настройки.

2 Опции DHCP

Таблица 1: Список стандартных опций DHCPv4
НазваниеКодTypeМассивReturned if not requested?
time-offset2int32falsefalse
routers3ipv4-addresstruetrue
time-servers4ipv4-addresstruefalse
name-servers5ipv4-addresstruefalse
domain-name-servers6ipv4-addresstruetrue
log-servers7ipv4-addresstruefalse
cookie-servers8ipv4-addresstruefalse
lpr-servers9ipv4-addresstruefalse
impress-servers10ipv4-addresstruefalse
resource-location-servers11ipv4-addresstruefalse
boot-size13uint16falsefalse
merit-dump14stringfalsefalse
domain-name15fqdnfalsetrue
swap-server16ipv4-addressfalsefalse
root-path17stringfalsefalse
extensions-path18stringfalsefalse
ip-forwarding19booleanfalsefalse
non-local-source-routing20booleanfalsefalse
policy-filter21ipv4-addresstruefalse
max-dgram-reassembly22uint16falsefalse
default-ip-ttl23uint8falsefalse
path-mtu-aging-timeout24uint32falsefalse
path-mtu-plateau-table25uint16truefalse
interface-mtu26uint16falsefalse
all-subnets-local27booleanfalsefalse
broadcast-address28ipv4-addressfalsefalse
perform-mask-discovery29booleanfalsefalse
mask-supplier30booleanfalsefalse
router-discovery31booleanfalsefalse
router-solicitation-address32ipv4-addressfalsefalse
static-routes33ipv4-addresstruefalse
trailer-encapsulation34booleanfalsefalse
arp-cache-timeout35uint32falsefalse
ieee802-3-encapsulation36booleanfalsefalse
default-tcp-ttl37uint8falsefalse
tcp-keepalive-interval38uint32falsefalse
tcp-keepalive-garbage39booleanfalsefalse
nis-domain40stringfalsefalse
nis-servers41ipv4-addresstruefalse
ntp-servers42ipv4-addresstruefalse
vendor-encapsulated-options43emptyfalsefalse
netbios-name-servers44ipv4-addresstruefalse
netbios-dd-server45ipv4-addresstruefalse
netbios-node-type46uint8falsefalse
netbios-scope47stringfalsefalse
font-servers48ipv4-addresstruefalse
x-display-manager49ipv4-addresstruefalse
dhcp-option-overload52uint8falsefalse
dhcp-server-identifier54ipv4-addressfalsetrue
dhcp-message56stringfalsefalse
dhcp-max-message-size57uint16falsefalse
vendor-class-identifier60hexfalsefalse
nwip-domain-name62stringfalsefalse
nwip-suboptions63hexfalsefalse
nisplus-domain-name64stringfalsefalse
nisplus-servers65ipv4-addresstruefalse
tftp-server-name66stringfalsefalse
boot-file-name67stringfalsefalse
mobile-ip-home-agent68ipv4-addresstruefalse
smtp-server69ipv4-addresstruefalse
pop-server70ipv4-addresstruefalse
nntp-server71ipv4-addresstruefalse
www-server72ipv4-addresstruefalse
finger-server73ipv4-addresstruefalse
irc-server74ipv4-addresstruefalse
streettalk-server75ipv4-addresstruefalse
streettalk-directory-assistance-server76ipv4-addresstruefalse
user-class77hexfalsefalse
slp-directory-agent78record (boolean, ipv4-address)truefalse
slp-service-scope79record (boolean, string)falsefalse
nds-server85ipv4-addresstruefalse
nds-tree-name86stringfalsefalse
nds-context87stringfalsefalse
bcms-controller-names88fqdntruefalse
bcms-controller-address89ipv4-addresstruefalse
client-system93uint16truefalse
client-ndi94record (uint8, uint8, uint8)falsefalse
uuid-guid97record (uint8, hex)falsefalse
uap-servers98stringfalsefalse
geoconf-civic99hexfalsefalse
pcode100stringfalsefalse
tcode101stringfalsefalse
netinfo-server-address112ipv4-addresstruefalse
netinfo-server-tag113stringfalsefalse
default-url114stringfalsefalse
auto-config116uint8falsefalse
name-service-search117uint16truefalse
subnet-selection118ipv4-addressfalsefalse
domain-search119fqdntruefalse
vivco-suboptions124hexfalsefalse
vivso-suboptions125hexfalsefalse
pana-agent136ipv4-addresstruefalse
v4-lost137fqdnfalsefalse
capwap-ac-v4138ipv4-addresstruefalse
sip-ua-cs-domains142fqdntruefalse
rdnss-selection146record (uint8, ipv4-address, ipv4-address, fqdn)truefalse
v4-portparams159record (uint8, psid)falsefalse
v4-captive-portal160stringfalsefalse
option-6rd212record (uint8, uint8, ipv6-address, ipv4-address)truefalse
v4-access-domain213fqdnfalsefalse
Таблица 2: Список стандартных типов опций DHCP
ТипОписание
hexAn arbitrary string of bytes, specified as a set of hexadecimal digits.
booleanBoolean value with allowed values true or false
emptyNo value, data is carried in suboptions
fqdnFully qualified domain name (e.g. www.example.com)
ipv4-addressIPv4 address in the usual dotted-decimal notation (e.g. 192.0.2.1)
ipv6-addressIPv6 address in the usual colon notation (e.g. 2001:db8::1)
ipv6-prefixIPv6 prefix and prefix length specified using CIDR notation, e.g. 2001:db8:1::/64. This data type is used to represent an 8-bit field conveying a prefix length and the variable length prefix value
psidPSID and PSID length separated by a slash
recordStructured data that may be comprised of any types (except “record” and “empty”). The array flag applies to the last field only.
stringAny text
tupleA length encoded as a 8 (16 for DHCPv6) bit unsigned integer followed by a string of this length
uint88 bit unsigned integer with allowed values 0 to 255
uint1616 bit unsigned integer with allowed values 0 to 65535
uint3232 bit unsigned integer with allowed values 0 to 4294967295
int88 bit signed integer with allowed values -128 to 127
int1616 bit signed integer with allowed values -32768 to 32767
int3232 bit signed integer with allowed values -2147483648 to 2147483647

3 Установка

3.1 Репозиторий RockyLinux

  • Текущая версия в репозитории: 2.2.x.
  • В версии 2.3.2 изменили систему именования.
  • Если в дальнейше планируется обновление, возможно стоит использовать репозитории ISC.
  • Подключаем репозиторий EPEL:
    1dnf config-manager --set-enabled crb
    2dnf -y install epel-release
    
  • Устанавливаем сервер Kea:
    1dnf -y install kea kea-hooks
    

3.2 Репозиторий ISC

  • Текущая стабильная версия в репозитории: 2.6.x.

3.2.1 Kea-2.6

  • Подключаем репозиторий:
    1curl -1sLf 'https://dl.cloudsmith.io/public/isc/kea-2-6/setup.rpm.sh' | sudo -E bash
    
  • Отключите старые репозитории, если они были установлены:
    1dnf config-manager --disable isc-kea-2-4 isc-kea-2-4-noarch isc-kea-2-4-source
    2dnf clean all
    
  • Проверьте, что репозитории отключены:
    1dnf repolist
    
  • Устанавливаем сервер Kea:
    1dnf -y install isc-kea isc-kea-hooks
    

3.2.2 Kea-2.4

  • Подключаем репозиторий:
    1curl -1sLf 'https://dl.cloudsmith.io/public/isc/kea-2-4/setup.rpm.sh' | sudo -E bash
    
  • Устанавливаем сервер Kea:
    1dnf -y install isc-kea isc-kea-hooks
    

3.3 Инструментарий миграции keama

4 Подготовка

4.1 Брандмауэр

  • Сконфигурируем брандмауэр:
    1firewall-cmd --add-service=dhcp --permanent
    2firewall-cmd --reload
    

5 Подготовка базы данных

5.1 PostgreSQL

  • Установка базы данных:
    1dnf install postgresql-server
    
  • Проверьте временную зону сервера:
    1date +%Z
    
  • Рекомендуется использовать временную зону UTC.
  • Инициализируйте базу данных:
    1postgresql-setup --initdb
    
  • Запустим базу данных:
    1systemctl enable --now postgresql.service
    

5.1.1 Создание базы данных

  • Подключимся к базе данных:
    1sudo -i -u postgres psql postgres
    
  • Проверим временную зону базы:
    1show timezone;
    2SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
    
  • Настройки временной зоны для postgresql находятся в файле /var/lib/pgsql/data/postgresql.conf:
    1timezone = 'Etc/UTC'
    
  • Можно использовать следующие названия:
    • database-name : kea;
    • user-name : kea;
    • password : сгенерите нужный пароль.
  • Создадим базу данных:
    1CREATE DATABASE database-name;
    
  • Создадим пользователя и пароль для взаимодействия с базой:
    1CREATE USER user-name WITH PASSWORD 'password';
    2GRANT ALL PRIVILEGES ON DATABASE database-name TO user-name;
    
  • Выйдем из интерфейса базы данных:
    1\q
    

5.1.2 Заполнение базы данных

  • Настроим доступ к базе данных в файле /var/lib/pgsql/data/pg_hba.conf.
  • Добавьте эти записи до других записей:
    1local   database-name    user-name                                 password
    2host    database-name    user-name          127.0.0.1/32           password
    3host    database-name    user-name          ::1/128                password
    
  • Перезагрузите postgresql:
    1systemctl restart postgresql.service
    
  1. Загрузка значений вручную

    • Загрузим значения в базу данных:
      1psql -d database-name -U user-name -f /usr/share/kea/scripts/pgsql/dhcpdb_create.pgsql
      
  1. Загрузка значений через kea-admin

    • Загрузим значения в базу данных:
      1kea-admin db-init pgsql -u database-user -p database-password -n database-name
      

5.1.3 Обновление базы данных

  • При переходе с предыдущей версии kea надо обновить базу данных.
  • Проверьте текущую версию базы данных:
    1kea-admin db-version pgsql -u database-user -p database-password -n database-name
    
  • Обновите базу (при необходимости):
    1kea-admin db-upgrade pgsql -u database-user -p database-password -n database-name
    

5.2 Миграция с ISC DHCP на ISC Kea

  • Преобразуем конфигурационные файлы:
    1keama -4 -i dhcpd.conf -o kea-dhcp4.conf
    

5.3 Тьюнинг базы данных

  • Отключите синхронные коммиты.
  • Можно отключить в базе данных:
    1sudo -i -u postgres psql postgres
    2ALTER SYSTEM SET synchronous_commit=OFF;
    3\q
    
  • Можно задать в файле конфигурации /var/lib/pgsql/data/postgresql.conf:
    1synchronous_commit = off
    

5.4 Конфигурация базы данных для Kea

  • Добавим конфигурацию базы данных:
     1"Dhcp4": {
     2    "lease-database": {
     3        "type": "postgresql",
     4        "name": "database_name",
     5        "host" : "localhost",
     6        "user": "user_name",
     7        "password": "password"
     8    },
     9
    10    "hosts-database": {
    11        "type": "postgresql",
    12        "name": "database_name",
    13        "host" : "localhost",
    14        "user": "user_name",
    15        "password": "password"
    16    },
    17}
    

6 Виртуальные интерфейсы

6.1 Миграция интерфейсов

  • Файлы описания интерфейсов на старой системе имеют следующий вид (/etc/sysconfig/network-scripts/ifcfg-eth1.200):

    1VLAN=yes
    2DEVICE=eth1.200
    3BOOTPROTO=none
    4ONBOOT=yes
    5TYPE=Ethernet
    6IPADDR=10.200.0.2
    7NETMASK=255.255.0.0
    8NETWORK=10.200.0.0
    9BROADCAST=10.200.255.255
    
  • Для миграции сделал набор скриптов.

  • Скрипт для извлечения параметров интерфейсов (mk-if-list):

     1#!/bin/bash
     2
     3OUTFILE=iflist
     4[[ -f ${OUTFILE} ]] && rm ${OUTFILE}
     5
     6for i in ifcfg-eth*.*
     7do
     8        vlan_id=$(grep DEVICE= ${i} | cut -d "." -f 2)
     9        ip=$(grep IPADDR= ${i} | cut -d "=" -f 2)
    10        mask=$(grep NETMASK= ${i} | cut -d "=" -f 2)
    11        prefix=$(ipcalc -p 1.1.1.1 ${mask}  | sed -n 's:^PREFIX=\(.*\):\1:p')
    12        echo ${vlan_id}" "${ip}"/"${prefix} >> ${OUTFILE}
    13done
    
    • Для скрипта необходима утилита ipcalc:
      1dnf -y install ipcalc
      
  • Получившийся файл iflist имеет следующий формат:

    1200 10.200.0.2/16
    
  • Скрипт mk-if-script для получения команд генерации интерфейсов VLAN:

    1#!/usr/bin/awk -f
    2
    3BEGIN { print "#!/bin/sh\n" }
    4{ print "nmcli connection add type vlan con-name vlan"$1"-con ifname vlan"$1"-if dev eno1 id "$1"\n""nmcli connection modify vlan"$1"-con ipv4.addresses "$2"\n""sudo nmcli connection modify vlan"$1"-con ipv4.method manual" }
    
  • Получим файл с командами интерфейсов:

    1./mk-if-script iflist > iflist-run
    
  • Сгенерим новые интерфейсы:

    1chmod +x iflist-run
    2./iflist-run
    

6.2 Конфигурация интерфейсов для Kea

  • Добавим интерфейсы в файл конфигурации /etc/kea/kea-dhcp4.conf:
     1"Dhcp4": {
     2    "interfaces-config": {
     3        "interfaces": [
     4            "vlan200-if",
     5            "vlan201-if",
     6            "vlan202-if"
     7        ],
     8        "dhcp-socket-type": "raw"
     9    },
    10}
    

7 Управляющий агент kea-ctrl-agent

7.1 По умолчанию

  • По умолчанию агент устанавливает unix-сокеты и доступ по сети для локального хоста.
  • Если ничего другого не надо, то дополнительной настройки не требуется.

7.2 Доступ по сети

  • Для доступа к управляющему агенту из вне необходимо настроить сетевой доступ.
  • Например, это может понадобиться для интеграции с Netbox (см. NetBox. Плагин netbox-kea).

7.2.1 Брандмауэр

  • Сконфигурируем брандмауэр:
    1firewall-cmd --add-port=8000/tcp --permanent
    2firewall-cmd --reload
    

7.2.2 Сертификаты

  • В качестве сертификатов можно использовать сертификаты ACME.
  • Если сертификаты не установлены, то используется протокол http.

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

  • Конфигурация в файле будет будет иметь вид:
     1{
     2    "Control-agent": {
     3        "http-host": "10.20.30.40",
     4        "http-port": 8000,
     5        "trust-anchor": "/path/to/the/ca-cert.pem",
     6        "cert-file": "/path/to/the/agent-cert.pem",
     7        "key-file": "/path/to/the/agent-key.pem",
     8        "cert-required": true,
     9        "authentication": {
    10            "type": "basic",
    11            "realm": "kea-control-agent",
    12            "clients": [
    13                {
    14                    "user": "admin",
    15                    "password": "1234"
    16                }
    17            ]
    18        },
    19        ...
    20    }
    

7.2.4 Пример запроса

  • Пример запроса с использованием RESTful API:
    1curl -u admin:1234 -X POST -H "Content-Type: application/json" -d '{ "command": "config-get", "service": [ "dhcp4" ] }' http://10.20.30.40:8000/
    

8 Запуск

  • Запуск управляющего агента:
    1systemctl enable --now kea-ctrl-agent.service
    
  • Запуск сервера DHCPv4:
    1systemctl enable --now kea-dhcp4.service
    
  • Запуск сервиса DDNS:
    1systemctl enable --now kea-dhcp-ddns.service
    

9 Утилиты

9.1 Просмотр арендованных адресов

  • Арендованные адреса можно смотреть в базе данных.
  • Для разных баз данных существуют конкретные утилиты.

9.1.1 Postgres

  1. kea-list-leases

    1. Пререквизиты

      • Нужно установить драйвер PostgreSQL для python : psycopg (https://www.psycopg.org/):
        1dnf -y install python3-psycopg2
        
    1. Настройка

      • Задайте конфигурационный файл kea-list-leases.conf (в том же каталоге, что и скрипт):
        1[postgresql]
        2host=127.0.0.1
        3database=kea_lease_db
        4user=kea
        5password=password
        

10 После установки


Дмитрий Сергеевич Кулябов
Дмитрий Сергеевич Кулябов
Профессор кафедры теории вероятностей и кибербезопасности

Мои научные интересы включают физику, администрирование Unix и сетей.

Похожие