DHCP. Установка сервера DHCP Kea
Установка сервера DHCP ISC Kea.
Содержание
1 Общая информация
- Сайт: https://www.isc.org/kea/
- Репозиторий:
- Документация: https://kea.readthedocs.io/en/latest/index.html
1.1 Особенности
- Модульная конструкция компонентов
- Расширяется с помощью модулей-хуков.
- Дистрибутив Kea включает отдельные демоны для сервера DHCPv4, сервера DHCPv6 и модуля динамического DNS (DDNS).
- Онлайн-реконфигурация с помощью REST API.
- Kea использует файл конфигурации JSON, который можно изменить удалённо без остановки и перезапуска сервера.
- Панель управления через веб-интерфейс.
- Поддерживает базы данных MySQL, PostgreSQL:
- упрощает интеграцию с другими системами;
- можно использовать один и тот же сервер резервирования хостов для нескольких DHCP-серверов;
- администрирование глобальных параметров из централизованной системы настройки.
2 Опции DHCP
Таблица 1:
Список стандартных опций DHCPv4
Название | Код | Type | Массив | Returned if not requested? |
---|---|---|---|---|
time-offset | 2 | int32 | false | false |
routers | 3 | ipv4-address | true | true |
time-servers | 4 | ipv4-address | true | false |
name-servers | 5 | ipv4-address | true | false |
domain-name-servers | 6 | ipv4-address | true | true |
log-servers | 7 | ipv4-address | true | false |
cookie-servers | 8 | ipv4-address | true | false |
lpr-servers | 9 | ipv4-address | true | false |
impress-servers | 10 | ipv4-address | true | false |
resource-location-servers | 11 | ipv4-address | true | false |
boot-size | 13 | uint16 | false | false |
merit-dump | 14 | string | false | false |
domain-name | 15 | fqdn | false | true |
swap-server | 16 | ipv4-address | false | false |
root-path | 17 | string | false | false |
extensions-path | 18 | string | false | false |
ip-forwarding | 19 | boolean | false | false |
non-local-source-routing | 20 | boolean | false | false |
policy-filter | 21 | ipv4-address | true | false |
max-dgram-reassembly | 22 | uint16 | false | false |
default-ip-ttl | 23 | uint8 | false | false |
path-mtu-aging-timeout | 24 | uint32 | false | false |
path-mtu-plateau-table | 25 | uint16 | true | false |
interface-mtu | 26 | uint16 | false | false |
all-subnets-local | 27 | boolean | false | false |
broadcast-address | 28 | ipv4-address | false | false |
perform-mask-discovery | 29 | boolean | false | false |
mask-supplier | 30 | boolean | false | false |
router-discovery | 31 | boolean | false | false |
router-solicitation-address | 32 | ipv4-address | false | false |
static-routes | 33 | ipv4-address | true | false |
trailer-encapsulation | 34 | boolean | false | false |
arp-cache-timeout | 35 | uint32 | false | false |
ieee802-3-encapsulation | 36 | boolean | false | false |
default-tcp-ttl | 37 | uint8 | false | false |
tcp-keepalive-interval | 38 | uint32 | false | false |
tcp-keepalive-garbage | 39 | boolean | false | false |
nis-domain | 40 | string | false | false |
nis-servers | 41 | ipv4-address | true | false |
ntp-servers | 42 | ipv4-address | true | false |
vendor-encapsulated-options | 43 | empty | false | false |
netbios-name-servers | 44 | ipv4-address | true | false |
netbios-dd-server | 45 | ipv4-address | true | false |
netbios-node-type | 46 | uint8 | false | false |
netbios-scope | 47 | string | false | false |
font-servers | 48 | ipv4-address | true | false |
x-display-manager | 49 | ipv4-address | true | false |
dhcp-option-overload | 52 | uint8 | false | false |
dhcp-server-identifier | 54 | ipv4-address | false | true |
dhcp-message | 56 | string | false | false |
dhcp-max-message-size | 57 | uint16 | false | false |
vendor-class-identifier | 60 | hex | false | false |
nwip-domain-name | 62 | string | false | false |
nwip-suboptions | 63 | hex | false | false |
nisplus-domain-name | 64 | string | false | false |
nisplus-servers | 65 | ipv4-address | true | false |
tftp-server-name | 66 | string | false | false |
boot-file-name | 67 | string | false | false |
mobile-ip-home-agent | 68 | ipv4-address | true | false |
smtp-server | 69 | ipv4-address | true | false |
pop-server | 70 | ipv4-address | true | false |
nntp-server | 71 | ipv4-address | true | false |
www-server | 72 | ipv4-address | true | false |
finger-server | 73 | ipv4-address | true | false |
irc-server | 74 | ipv4-address | true | false |
streettalk-server | 75 | ipv4-address | true | false |
streettalk-directory-assistance-server | 76 | ipv4-address | true | false |
user-class | 77 | hex | false | false |
slp-directory-agent | 78 | record (boolean, ipv4-address) | true | false |
slp-service-scope | 79 | record (boolean, string) | false | false |
nds-server | 85 | ipv4-address | true | false |
nds-tree-name | 86 | string | false | false |
nds-context | 87 | string | false | false |
bcms-controller-names | 88 | fqdn | true | false |
bcms-controller-address | 89 | ipv4-address | true | false |
client-system | 93 | uint16 | true | false |
client-ndi | 94 | record (uint8, uint8, uint8) | false | false |
uuid-guid | 97 | record (uint8, hex) | false | false |
uap-servers | 98 | string | false | false |
geoconf-civic | 99 | hex | false | false |
pcode | 100 | string | false | false |
tcode | 101 | string | false | false |
netinfo-server-address | 112 | ipv4-address | true | false |
netinfo-server-tag | 113 | string | false | false |
default-url | 114 | string | false | false |
auto-config | 116 | uint8 | false | false |
name-service-search | 117 | uint16 | true | false |
subnet-selection | 118 | ipv4-address | false | false |
domain-search | 119 | fqdn | true | false |
vivco-suboptions | 124 | hex | false | false |
vivso-suboptions | 125 | hex | false | false |
pana-agent | 136 | ipv4-address | true | false |
v4-lost | 137 | fqdn | false | false |
capwap-ac-v4 | 138 | ipv4-address | true | false |
sip-ua-cs-domains | 142 | fqdn | true | false |
rdnss-selection | 146 | record (uint8, ipv4-address, ipv4-address, fqdn) | true | false |
v4-portparams | 159 | record (uint8, psid) | false | false |
v4-captive-portal | 160 | string | false | false |
option-6rd | 212 | record (uint8, uint8, ipv6-address, ipv4-address) | true | false |
v4-access-domain | 213 | fqdn | false | false |
Таблица 2:
Список стандартных типов опций DHCP
Тип | Описание |
---|---|
hex | An arbitrary string of bytes, specified as a set of hexadecimal digits. |
boolean | Boolean value with allowed values true or false |
empty | No value, data is carried in suboptions |
fqdn | Fully qualified domain name (e.g. www.example.com) |
ipv4-address | IPv4 address in the usual dotted-decimal notation (e.g. 192.0.2.1) |
ipv6-address | IPv6 address in the usual colon notation (e.g. 2001:db8::1) |
ipv6-prefix | IPv6 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 |
psid | PSID and PSID length separated by a slash |
record | Structured data that may be comprised of any types (except “record” and “empty”). The array flag applies to the last field only. |
string | Any text |
tuple | A length encoded as a 8 (16 for DHCPv6) bit unsigned integer followed by a string of this length |
uint8 | 8 bit unsigned integer with allowed values 0 to 255 |
uint16 | 16 bit unsigned integer with allowed values 0 to 65535 |
uint32 | 32 bit unsigned integer with allowed values 0 to 4294967295 |
int8 | 8 bit signed integer with allowed values -128 to 127 |
int16 | 16 bit signed integer with allowed values -32768 to 32767 |
int32 | 32 bit signed integer with allowed values -2147483648 to 2147483647 |
3 Установка
- Устанавливаем сервер Linux (см. Rocky Linux. Установка сервера).
3.1 Репозиторий RockyLinux
- Текущая версия в репозитории: 2.2.x.
- В версии 2.3.2 изменили систему именования.
- Если в дальнейше планируется обновление, возможно стоит использовать репозитории ISC.
- Подключаем репозиторий EPEL:
dnf config-manager --set-enabled crb dnf -y install epel-release
- Устанавливаем сервер Kea:
dnf -y install kea kea-hooks
3.2 Репозиторий ISC
- Текущая стабильная версия в репозитории: 2.6.x.
3.2.1 Kea-2.6
- Подключаем репозиторий:
curl -1sLf 'https://dl.cloudsmith.io/public/isc/kea-2-6/setup.rpm.sh' | sudo -E bash
- Отключите старые репозитории, если они были установлены:
dnf config-manager --disable isc-kea-2-4 isc-kea-2-4-noarch isc-kea-2-4-source dnf clean all
- Проверьте, что репозитории отключены:
dnf repolist
- Устанавливаем сервер Kea:
dnf -y install isc-kea isc-kea-hooks
3.2.2 Kea-2.4
- Подключаем репозиторий:
curl -1sLf 'https://dl.cloudsmith.io/public/isc/kea-2-4/setup.rpm.sh' | sudo -E bash
- Устанавливаем сервер Kea:
dnf -y install isc-kea isc-kea-hooks
3.3 Инструментарий миграции keama
- При необходимости миграции с реализации ISC DHCP на ISC KEA можно установить помощник миграции.
- Документация:
- Репозиторий: https://gitlab.isc.org/isc-projects/dhcp/-/tree/master/keama
- Бинарные сборки:
- https://cloudsmith.io/~isc/repos/keama/packages/
- заблокирован доступ из России
- Подключаем репозиторий бинарных файлов:
curl -1sLf 'https://dl.cloudsmith.io/public/isc/keama/setup.rpm.sh' | sudo -E bash
- Устанавливаем сервер Kea:
dnf -y install isc-dhcp-keama
4 Подготовка
4.1 Брандмауэр
- Сконфигурируем брандмауэр:
firewall-cmd --add-service=dhcp --permanent firewall-cmd --reload
5 Подготовка базы данных
5.1 PostgreSQL
- Установка базы данных:
dnf install postgresql-server
- Проверьте временную зону сервера:
date +%Z
- Рекомендуется использовать временную зону
UTC
. - Инициализируйте базу данных:
postgresql-setup --initdb
- Запустим базу данных:
systemctl enable --now postgresql.service
5.1.1 Создание базы данных
- Подключимся к базе данных:
sudo -i -u postgres psql postgres
- Проверим временную зону базы:
show timezone; SELECT * FROM pg_timezone_names WHERE name = current_setting('TIMEZONE');
- Настройки временной зоны для postgresql находятся в файле
/var/lib/pgsql/data/postgresql.conf
:timezone = 'Etc/UTC'
- Можно использовать следующие названия:
database-name
:kea
;user-name
:kea
;password
: сгенерите нужный пароль.
- Создадим базу данных:
CREATE DATABASE database-name;
- Создадим пользователя и пароль для взаимодействия с базой:
CREATE USER user-name WITH PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE database-name TO user-name;
- Выйдем из интерфейса базы данных:
\q
5.1.2 Заполнение базы данных
- Настроим доступ к базе данных в файле
/var/lib/pgsql/data/pg_hba.conf
. - Добавьте эти записи до других записей:
local database-name user-name password host database-name user-name 127.0.0.1/32 password host database-name user-name ::1/128 password
- Перезагрузите postgresql:
systemctl restart postgresql.service
Загрузка значений вручную
- Загрузим значения в базу данных:
psql -d database-name -U user-name -f /usr/share/kea/scripts/pgsql/dhcpdb_create.pgsql
- Загрузим значения в базу данных:
Загрузка значений через
kea-admin
- Загрузим значения в базу данных:
kea-admin db-init pgsql -u database-user -p database-password -n database-name
- Загрузим значения в базу данных:
5.1.3 Обновление базы данных
- При переходе с предыдущей версии
kea
надо обновить базу данных. - Проверьте текущую версию базы данных:
kea-admin db-version pgsql -u database-user -p database-password -n database-name
- Обновите базу (при необходимости):
kea-admin db-upgrade pgsql -u database-user -p database-password -n database-name
5.2 Миграция с ISC DHCP на ISC Kea
- Преобразуем конфигурационные файлы:
keama -4 -i dhcpd.conf -o kea-dhcp4.conf
5.3 Тьюнинг базы данных
- Отключите синхронные коммиты.
- Можно отключить в базе данных:
sudo -i -u postgres psql postgres ALTER SYSTEM SET synchronous_commit=OFF; \q
- Можно задать в файле конфигурации
/var/lib/pgsql/data/postgresql.conf
:synchronous_commit = off
5.4 Конфигурация базы данных для Kea
- Добавим конфигурацию базы данных:
"Dhcp4": { "lease-database": { "type": "postgresql", "name": "database_name", "host" : "localhost", "user": "user_name", "password": "password" }, "hosts-database": { "type": "postgresql", "name": "database_name", "host" : "localhost", "user": "user_name", "password": "password" }, }
6 Виртуальные интерфейсы
- Для подключения к сети использовал интерфейсы VLAN (см. Linux. Настройка vlan)
6.1 Миграция интерфейсов
Файлы описания интерфейсов на старой системе имеют следующий вид (
/etc/sysconfig/network-scripts/ifcfg-eth1.200
):VLAN=yes DEVICE=eth1.200 BOOTPROTO=none ONBOOT=yes TYPE=Ethernet IPADDR=10.200.0.2 NETMASK=255.255.0.0 NETWORK=10.200.0.0 BROADCAST=10.200.255.255
Для миграции сделал набор скриптов.
Скрипт для извлечения параметров интерфейсов (
mk-if-list
):#!/bin/bash OUTFILE=iflist [[ -f ${OUTFILE} ]] && rm ${OUTFILE} for i in ifcfg-eth*.* do vlan_id=$(grep DEVICE= ${i} | cut -d "." -f 2) ip=$(grep IPADDR= ${i} | cut -d "=" -f 2) mask=$(grep NETMASK= ${i} | cut -d "=" -f 2) prefix=$(ipcalc -p 1.1.1.1 ${mask} | sed -n 's:^PREFIX=\(.*\):\1:p') echo ${vlan_id}" "${ip}"/"${prefix} >> ${OUTFILE} done
- Для скрипта необходима утилита
ipcalc
:dnf -y install ipcalc
- Для скрипта необходима утилита
Получившийся файл
iflist
имеет следующий формат:200 10.200.0.2/16
Скрипт
mk-if-script
для получения команд генерации интерфейсов VLAN:#!/usr/bin/awk -f BEGIN { print "#!/bin/sh\n" } { 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" }
Получим файл с командами интерфейсов:
./mk-if-script iflist > iflist-run
Сгенерим новые интерфейсы:
chmod +x iflist-run ./iflist-run
6.2 Конфигурация интерфейсов для Kea
- Добавим интерфейсы в файл конфигурации
/etc/kea/kea-dhcp4.conf
:"Dhcp4": { "interfaces-config": { "interfaces": [ "vlan200-if", "vlan201-if", "vlan202-if" ], "dhcp-socket-type": "raw" }, }
7 Управляющий агент kea-ctrl-agent
7.1 По умолчанию
- По умолчанию агент устанавливает unix-сокеты и доступ по сети для локального хоста.
- Если ничего другого не надо, то дополнительной настройки не требуется.
7.2 Доступ по сети
- Для доступа к управляющему агенту из вне необходимо настроить сетевой доступ.
- Например, это может понадобиться для интеграции с Netbox (см. NetBox. Плагин netbox-kea).
7.2.1 Брандмауэр
- Сконфигурируем брандмауэр:
firewall-cmd --add-port=8000/tcp --permanent firewall-cmd --reload
7.2.2 Сертификаты
- В качестве сертификатов можно использовать сертификаты ACME.
- Если сертификаты не установлены, то используется протокол
http
.
7.2.3 Конфигурационный файл
- Конфигурация в файле будет будет иметь вид:
{ "Control-agent": { "http-host": "10.20.30.40", "http-port": 8000, "trust-anchor": "/path/to/the/ca-cert.pem", "cert-file": "/path/to/the/agent-cert.pem", "key-file": "/path/to/the/agent-key.pem", "cert-required": true, "authentication": { "type": "basic", "realm": "kea-control-agent", "clients": [ { "user": "admin", "password": "1234" } ] }, ... }
7.2.4 Пример запроса
- Пример запроса с использованием RESTful API:
curl -u admin:1234 -X POST -H "Content-Type: application/json" -d '{ "command": "config-get", "service": [ "dhcp4" ] }' http://10.20.30.40:8000/
8 Запуск
- Запуск управляющего агента:
systemctl enable --now kea-ctrl-agent.service
- Запуск сервера DHCPv4:
systemctl enable --now kea-dhcp4.service
- Запуск сервиса DDNS:
systemctl enable --now kea-dhcp-ddns.service
9 Утилиты
9.1 Просмотр арендованных адресов
- Арендованные адреса можно смотреть в базе данных.
- Для разных баз данных существуют конкретные утилиты.
9.1.1 Postgres
kea-list-leases
- Репозиторий: https://git.sr.ht/~cstrotm/kea-list-leases
- В репозитории скрипт и конфигурационный файл.
Пререквизиты
- Нужно установить драйвер PostgreSQL для python : psycopg (https://www.psycopg.org/):
dnf -y install python3-psycopg2
- Нужно установить драйвер PostgreSQL для python : psycopg (https://www.psycopg.org/):
Настройка
- Задайте конфигурационный файл
kea-list-leases.conf
(в том же каталоге, что и скрипт):[postgresql] host=127.0.0.1 database=kea_lease_db user=kea password=password
- Задайте конфигурационный файл
10 После установки
- Настройте DDNS (см. Динамическое обновление DNS-сервера BIND при помощи Kea DHCP)