This is an old revision of the document!
Фреймворк для построения собственно DHCP сервера с базой данных
Реализован приём пакетов, разбор, доступ к опциями, изменение формата до нужного.
Скачать: dhcpd.pl
Лицензия: BSD
Обсуждение: forum.nag.ru
На процессоре CoreDuo E5300 при статически сконфигурированных ответах (без базы) получалось обработать примерно 3-4 тысячи запросов в секунду.
С базой данных будет меньше, основная нагрузка придётся именно на неё.
Для все параметры подключения к базе данных: логин, пароль, адрес - могут быть прописаны в скрипте.
dhcpd.pl -id 192.168.0.1 -m 192.168.0.2 -t 2 -v 1
Биндить лучше на 0.0.0.0, потому как если забиндить на конкретный IP то ответы будут уходить только с него, в случае нескольких адаптеров/алиасов остальные задействованны не будут. В таких случаях сервер будет получать, обрабатывать запрос но ответ уходить не будет.
Все запросы принимаются, далее происходит разбор, отсев не DHCP пакетов, пакетов от microsoft RRAS (встроенный VPN сервер пытается захапать пачку адресов для дальнейшей раздачи), и прочего мусора.
На каждый тип запроса вызывается соответствующая функция для обработки.
В запросе есть:
Опция 82 и giaddr могут не приходить при попытке продления клиентом времени аренды, тк клиент уже имеет IP адрес и пытается слать запрос напрямую серверу. Зависит от коммутатора, его настроек и его глючности.
Соответственно клиент потеряет аренду если не получит от него запроса на продление, и клиент начнёт по новой получать адрес.
Из этого многообразия нужно определить что будем использовать для идентификации клиента и сети клиента.
RFC2141 говорит что мы должны полагаться на DHCP Client ID, если её нет то на аппаратный адрес, при идентификации клиента.
На основании выбранного идентификатора из п1 ищем в базе настройки для сети:
[client id] (тут может быть, к примеру: 82.vlan id + 82.port id или DHCP Client ID, те кто привязывает адрес к порту должны либо настраивать коммутаторы чтобы опция82 добавлялась всегда, либо организовывать логику с учётом того что после получения адреса, клиент запрос для продления аренды будет слать на прямую серверу и он не всегда релееится - те приходит без опции 82):
параметры из п2 можно продублировать здесь и считать их главнее.
Время обновляется при получении/продлении аренды, адрес в зависимости от настроек.