Вопрос или проблема
Я переключился на свою сеть, чтобы использовать isc-kea v2.2.0, но похоже, что резервирования не выполняются. Я создал тестовый хост, и вместо получения своего резервированного IP он получает динамический IP из пула подсети. Я проверил свою конфигурацию isc-dhcpd с помощью инструмента миграции, а затем мне пришлось изменить некоторые параметры, так как параметры высокой доступности и другие поля сильно изменились.
Мои файлы конфигурации Kea следующие. Я надеюсь, что я пропустил какое-то поле, или я неправильно настроил что-то для работы резервирования?
#// kea-dhcp4.conf
{
"Dhcp4": {
#// 1d время аренды глобально
"valid-lifetime": 86400,
#// T1 жестко установленное значение
#//"renew-timer": 900,
#// T2 жестко установленное значение
#//"rebind-timer": 1800,
"calculate-tee-times": true,
#// T1 по умолчанию 50% от срока аренды
"t1-percent": 0.5,
#// T2 по умолчанию 87.5% от срока аренды
"t2-percent": 0.875,
"interfaces-config": {
"interfaces": [ "eth0" ]
},
"reservation-mode": "global",
"host-reservation-identifiers": [
"hw-address"
],
"lease-database": {
"type": "memfile",
"lfc-interval": 3600,
"persist": true,
#// По умолчанию "[kea-install-dir]/var/lib/kea/kea-leases4.csv"
#//"name": "/var/log/kea/kea-leases4.csv",
"max-row-errors": 100
},
"control-socket": {
"socket-type": "unix",
"socket-name": "/run/kea/kea4-ctrl-socket"
},
"expired-leases-processing": {
#// 1ч, проверка аренд, которые истекли, каждый час
"reclaim-timer-wait-time": 3600,
#// 2д, чтобы устройство вернулось и использовало тот же IP
"hold-reclaimed-time": 172800,
#// По умолчанию 100, обработка всех возвращенных аренды за одно время
"max-reclaim-leases": 0,
#// По умолчанию 250мс, сколько времени требуется для обработки восстановления
"max-reclaim-time": 0
},
"option-data": [ {
#// DNS-серверы по умолчанию для всех
"name": "domain-name-servers",
"code": 6,
"data": "9.9.9.9, 1.1.1.1"
#//"data": "192.168.1.6, 192.168.1.7"
} ],
#// https://kb.isc.org/docs/kea-hook-libraries
"hooks-libraries": [
{
"library": "/usr/lib/aarch64-linux-gnu/kea/hooks/libdhcp_lease_cmds.so"
},
{
"library": "/usr/lib/aarch64-linux-gnu/kea/hooks/libdhcp_ha.so",
"parameters": {
"high-availability": [ {
"this-server-name": "dhcp-001",
"mode": "hot-standby",
"heartbeat-delay": 10000,
"max-response-delay": 60000,
"max-ack-delay": 5000,
"max-unacked-clients": 5,
"sync-timeout": 60000,
"peers": [
{
"name": "dhcp-001",
"url": "http://192.168.1.6:8000/",
"role": "primary"
},
{
"name": "dhcp-002",
"url": "http://192.168.1.7:8000/",
"role": "standby"
}
]
} ]
}
}
],
"loggers": [ {
"name": "kea-dhcp4",
"output_options": [
{
"output": "stdout",
"pattern": "%-5p %m\n"
},
{
"output": "/var/log/kea/kea-dhcp4.log",
"maxsize": 2048000,
"maxver": 4
}
],
"severity": "INFO",
"debuglevel": 0
} ],
"subnet4": [
<?include "/etc/kea/subnet-1-trust.conf"?>
],
"option-def": [ #// Используется для сети управления unifi AP
{
"space": "ubnt",
"name": "unifi-address",
"code": 1,
"type": "ipv4-address"
} ],
"client-classes": [ {
"name": "ubnt",
#// из: соответствовать, если (подстрока(option dhcp.vendor-class-identifier, 0, 4)) = 'ubnt'
"test": "substring(option[60].hex,0,4) == 'ubnt'",
"option-data": [
{
"space": "dhcp4",
"name": "vendor-class-identifier",
"code": 60,
"data": "ubnt"
},
{
"name": "vendor-encapsulated-options",
"code": 43
},
{
"space": "ubnt",
"name": "unifi-address",
"code": 1,
"data": "192.168.1.23"
}
],
"option-def": [ {
"name": "vendor-encapsulated-options",
"code": 43,
"type": "empty",
"encapsulate": "ubnt"
} ]
} ]
}
}
#//subnet-1-trust.conf
{
#// Доверительная сеть
"id": 1,
"subnet": "192.168.1.0/24",
"option-data": [
{
"name": "subnet-mask",
"code": 1,
"data": "255.255.255.0"
},
{
"name": "routers",
"code": 3,
"data": "192.168.1.1"
},
{
"name": "domain-name-servers",
"code": 6,
"data": "9.9.9.9, 1.1.1.1"
}
],
#// 24ч 1 день перед обновлением
#//"valid-lifetime": 86400,
"valid-lifetime": 3600,
#// 3д
"max-valid-lifetime": 259200,
"pools": [ {
"pool": "192.168.1.128 - 192.168.1.254"
} ],
"reservations": [ {
"hostname": "docker-host-001",
"hw-address": "06:40:1d:7a:f4:b1",
"ip-address": "192.168.1.11"
} ]
}
Чтобы протестировать и “очистить” любые возможные кеши, я удалял аренду с помощью restapi. Я остановил службу kea-dhcp4, удалил все строки в файле CSV аренды, относящиеся к тестовому хосту, и снова запустил службу.
http --json POST http://127.0.0.1:8000 \
service:='["dhcp4"]' \
command=lease4-del \
arguments:='{"ip-address": "192.168.1.211"}'
sudo systemctl stop kea-dhcp4-server.service
sudo sed -i '/docker-host/d' /var/lib/kea/kea-leases4.csv
sudo systemctl start kea-dhcp4-server.service
sudo tail -f /var/log/kea/kea-dhcp4.log
Затем удалите IP с хоста и перезапустите его сетевую службу или даже полностью перезагрузите хост.
Ответ или решение
Возможные Причины Игнорирования Резервации IP в ISC-Kea DHCP
Вы столкнулись с проблемой, когда резервации IP в системе ISC-Kea DHCP версии 2.2.0 не работают должным образом. Вместо получения заранее заданного IP-адреса, ваше устройство получает динамический IP из диапазона пула подсети. Давайте проанализируем вашу конфигурацию и выясним, в чем может быть ошибка.
1. Проверка Конфигурации Резервации
Согласно предоставленной конфигурации, вы указали резервацию в файле subnet-1-trust.conf
:
"reservations": [ {
"hostname": "docker-host-001",
"hw-address": "06:40:1d:7a:f4:b1",
"ip-address": "192.168.1.11"
} ]
Хотя резервация выглядит правильно, важно убедиться, что MAC-адрес устройства, запрашивающего IP, точно совпадает с тем, что указан в конфигурации. Проверьте, что:
- Устройство, получающее IP, действительно использует MAC-адрес
06:40:1d:7a:f4:b1
. - Убедитесь, что вы применили корректные настройки, чтобы устройство могло отправить DHCP-запрос с правильным идентификатором.
2. Механизмы Идентификации Хостов
Ваша конфигурация по умолчанию использует hw-address
для определения резервации:
"host-reservation-identifiers": [
"hw-address"
]
Убедитесь, что это соответствует тому, как ваше устройство идентифицируется в сети. Если ваше устройство использует DHCP-клиент с другим методом аутентификации (например, идентификатором DUID), вам нужно будет добавить соответствующее значение в host-reservation-identifiers
.
3. Проверка Настроек Подсети
В subnet-1-trust.conf
вы указываете пул IP-адресов:
"pools": [ {
"pool": "192.168.1.128 - 192.168.1.254"
} ]
Убедитесь, что резервация (192.168.1.11
) находится вне диапазона динамических адресов, который может выдать сервер. В вашем случае это выполняется, так как указанный адрес не входит в диапазон пулов.
4. Журнал Логов
Вы упомянули, что записываете логи в файл /var/log/kea/kea-dhcp4.log
. Настоятельно рекомендуется анализировать этот файл на предмет любых предупреждений или ошибок, связанных с резервациями. Особенно обратите внимание на сообщения, когда ваше устройство отправляет DHCP-запросы – это поможет понять, принимает ли Kea запросы правильно.
5. Очистка Лизинга
Вы упомянули, что очищали лизинг с помощью REST API, но важно убедиться, что все предыдущие лизинги для устройства удалены. Это можно сделать через:
http --json POST http://127.0.0.1:8000 service:='["dhcp4"]' command=lease4-del arguments:='{"ip-address": "192.168.1.211"}'
Также, стоит ещё раз убедиться, что лизинг, который вы удаляете, действительно относится к мак-адресу вашего клиента, и что он был удален из базы данных перед перезапуском.
6. Перезапуск Сервиса
После очистки данных обязательно перезапустите службу:
sudo systemctl restart kea-dhcp4-server.service
Любые кэшированные данные могут вызвать проблемы с резервацией. Поэтому важно следить за тем, чтобы все изменения входили в силу.
Заключение
Если после проверки всех вышеуказанных пунктов проблема сохраняется, рассмотрите возможность проведения тестов с более простыми конфигурациями. Используйте только один или два устройства с резервацией для изоляции проблем. Также, возможно, вам стоит обратиться к сообществу ISC или на специализированные форумы, где другие пользователи могли сталкиваться с подобной проблемой.
Убедитесь, что ваша конфигурация правильно оформлена и соответствует всем требованиям, это поможет вам избежать множества потенциальных ошибок и обеспечить надежную работу вашего DHCP сервера.