Kea — это DHCP-сервер, который ISC развивает как замену старому isc-dhcp-server. Классический dhcpd официально снят с поддержки в конце 2022 года, поэтому в 2026-м разворачивать его на новой сети нет смысла: исправления безопасности больше не выходят. Kea хранит настройки в JSON, умеет складывать аренды в MySQL или PostgreSQL, поддерживает DHCPv4 и DHCPv6 отдельными процессами и даёт управление через сокет. Ниже — рабочий сценарий для домашней или небольшой офисной сети на Linux Mint или Ubuntu.
Чем Kea отличается от ISC DHCP
Старый dhcpd читал /etc/dhcp/dhcpd.conf с собственным синтаксисом, а Kea использует JSON. Привычки придётся поменять: комментарии не поддерживаются, зато ошибка ловится валидатором до запуска службы, а конфиг удобно хранить в git и генерировать шаблоном. Остальные отличия важнее:
- DHCPv4 и DHCPv6 — разные демоны, kea-dhcp4 и kea-dhcp6, у каждого свой файл и свой юнит systemd.
- Аренды по умолчанию лежат в CSV-файле memfile; для нескольких серверов или большой нагрузки подключается СУБД.
- Хуки расширяют поведение: lease_cmds, ha, ddns, radius. Без нужного хука часть команд управления арендами недоступна.
- Управляющий сокет позволяет смотреть состояние и менять настройки без перезапуска.
Совместимости с dhcpd.conf нет, поэтому миграция — это перенос смысла, а не копирование файла.
Установка
В репозиториях Ubuntu 24.04 и Linux Mint 22 пакет называется kea-dhcp4-server. Вместе с ним полезно поставить утилиты администрирования, агент управления и socat для ручных запросов к сокету.
sudo apt update
sudo apt install kea-dhcp4-server kea-admin kea-ctrl-agent socat
kea-dhcp4 -v
systemctl status kea-dhcp4-server --no-pager
После установки служба уже запущена с пустым примером конфигурации и никому не отвечает, пока вы не опишете подсети. Проверьте, что порт 67 свободен: старый isc-dhcp-server нужно остановить и отключить, иначе два демона будут конфликтовать.
sudo systemctl disable --now isc-dhcp-server
sudo ss -lunp | grep ':67 '
Минимальный конфиг для одной подсети
Файл /etc/kea/kea-dhcp4.conf — обычный JSON. Ниже основа для сети 192.168.10.0/24 со шлюзом и DNS на роутере.
{
"Dhcp4": {
"interfaces-config": {
"interfaces": [ "eth0" ]
},
"control-socket": {
"socket-type": "unix",
"socket-name": "/run/kea4-ctrl-socket"
},
"lease-database": {
"type": "memfile",
"persist": true,
"name": "/var/lib/kea/kea-leases4.csv",
"lfc-interval": 3600
},
"valid-lifetime": 3600,
"renew-timer": 900,
"rebind-timer": 1800,
"subnet4": [
{
"id": 1,
"subnet": "192.168.10.0/24",
"pools": [ { "pool": "192.168.10.100 - 192.168.10.200" } ],
"option-data": [
{ "name": "routers", "data": "192.168.10.1" },
{ "name": "domain-name-servers", "data": "192.168.10.1" },
{ "name": "domain-name", "data": "home.lan" }
]
}
],
"loggers": [
{
"name": "kea-dhcp4",
"output_options": [ { "output": "/var/log/kea-dhcp4.log" } ],
"severity": "INFO",
"debuglevel": 0
}
]
}
}
Запоминать весь файл не нужно, достаточно трёх уровней: глобальные параметры Dhcp4, затем subnet4, затем reservations внутри подсети. Сроки задаются в секундах; 3600 — разумный компромисс для квартиры, а в офисе с потоком гостей ставьте меньше, чтобы пул быстрее освобождался. Если интерфейс без IPv4-адреса, добавьте в interfaces-config пару "dhcp-socket-type": "raw": обычный UDP-сокет на таком интерфейсе не поднимется.
Отдельный случай — несколько VLAN и DHCP relay. Сервер получает запросы через агент ретрансляции, и для каждой подсети описывается свой subnet4. Интерфейс при этом не обязан иметь адрес в обслуживаемой сети: Kea выбирает подсеть по полю giaddr в пакете, а не по адресу сокета.
Резервирование адресов
Постоянный адрес принтеру или NAS выдаётся блоком reservations. Привязка идёт по MAC, а hostname помогает только в логах и на выбор адреса не влияет.
"reservations": [
{
"hw-address": "3c:52:82:1a:2b:3c",
"ip-address": "192.168.10.20",
"hostname": "printer"
},
{
"hw-address": "00:11:32:aa:bb:cc",
"ip-address": "192.168.10.21",
"hostname": "nas"
}
]
Резервы не обязаны входить в пул, но удобнее держать их вне динамического диапазона. Если устройств с известным MAC много, список стоит генерировать скриптом из инвентаря, а не править руками: одна опечатка в адресе ломает выдачу конкретному клиенту.
Аренды в MySQL
Memfile переживает перезапуск и подходит для сотен клиентов. Для нескольких экземпляров Kea или десятков тысяч аренд нужна СУБД: CSV не рассчитан на параллельную запись с разных хостов.
"lease-database": {
"type": "mysql",
"host": "127.0.0.1",
"user": "kea",
"password": "CHANGE_ME",
"name": "kea"
}
Схему создаёт kea-admin db-init mysql -u kea -p -n kea. Пароль в конфиге — повод выставить права 0640 и владельца root:kea, а не хранить файл в общедоступном каталоге. Резервный сервер с хуком ha потребует отдельной настройки синхронизации, но это уже задача для сети с требованием непрерывности.
Проверка конфигурации и запуск
Перед перезапуском всегда прогоняйте валидатор: он укажет поле и место, где опечатка.
sudo kea-dhcp4 -t /etc/kea/kea-dhcp4.conf
sudo systemctl restart kea-dhcp4-server
journalctl -u kea-dhcp4-server -n 30 --no-pager
sudo ss -lunp | grep kea-dhcp4
Фраза «Configuration seems sane» означает, что синтаксис верный, но не гарантирует выдачу адресов: проверьте интерфейс, зону файрвола и отсутствие второго DHCP в сегменте. Лог должен лежать на отдельном разделе или ротироваться через logrotate, иначе через месяц он займёт весь корень.
Диагностика
DHCP работает поверх UDP, поэтому смотреть надо 67-й и 68-й порты. Запустите tcpdump на сервере и подключите тестового клиента.
sudo tcpdump -ni eth0 -vv port 67 or port 68
echo '{"command":"config-get"}' | sudo socat - UNIX-CONNECT:/run/kea4-ctrl-socket
sudo tail -f /var/log/kea-dhcp4.log
Если в дампе видны DISCOVER, но нет OFFER, смотрите лог Kea и занятость пула. Если OFFER уходит, а клиент не берёт адрес, ищите конфликт адресов и настройки файрвола на клиенте. Ошибка соединения с сокетом означает, что он не создан: проверьте путь и права, а также что служба перезапустилась без ошибок.
Чек-лист перед вводом в эксплуатацию
- Старый DHCP-сервер остановлен и убран из автозапуска.
- Пул не пересекается со статическими адресами и резервами.
- Для каждой подсети заданы шлюз, DNS и домен.
- Логи пишутся в отдельный файл и ротируются.
- Управляющий сокет доступен только root, ctrl-agent слушает localhost.
- Резервная копия конфига и CSV-аренд снимается по расписанию.
- На коммутаторе включён DHCP snooping, если он поддерживается.
Итог
Kea — не «ещё один DHCP», а современный демон с предсказуемой конфигурацией и нормальным API. Для домашней сети хватит memfile и одного subnet4; для офиса добавьте СУБД, второй сервер с хуком ha и мониторинг аренд. Главное — не тащить в новую установку старый dhcpd.conf и проверять каждый JSON через kea-dhcp4 -t перед перезапуском.