This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
software:perl:dhcp_server [2015/05/20 13:40] – root | software:perl:dhcp_server [2015/05/20 15:52] – [DHCP на Perl] root | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== DHCP на Perl ====== | ====== DHCP на Perl ====== | ||
+ | Фреймворк для построения собственно DHCP сервера с базой данных\\ | ||
+ | Реализован приём пакетов, | ||
+ | |||
+ | **Скачать**: | ||
+ | **Лицензия**: | ||
+ | **Обсуждение**: | ||
+ | |||
+ | ===== Модификации и дополнения ===== | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
Line 10: | Line 23: | ||
* умеет работать в качестве демона | * умеет работать в качестве демона | ||
* несколько уровней вывода отладочной информации | * несколько уровней вывода отладочной информации | ||
+ | |||
+ | |||
+ | ===== Производительность ===== | ||
+ | На процессоре CoreDuo E5300 при статически сконфигурированных ответах (без базы) получалось обработать примерно 3-4 тысячи запросов в секунду.\\ | ||
+ | С базой данных будет меньше, | ||
===== Требования ===== | ===== Требования ===== | ||
+ | * DHCP Relay - скрипт работает только через релеи, без них он не работоспособен | ||
* perl с поддержкой многопоточности | * perl с поддержкой многопоточности | ||
* набор пакетов к perl указанный в начале скрипта | * набор пакетов к perl указанный в начале скрипта | ||
Line 47: | Line 66: | ||
Биндить лучше на 0.0.0.0, потому как если забиндить на конкретный IP то ответы будут уходить только с него, в случае нескольких адаптеров/ | Биндить лучше на 0.0.0.0, потому как если забиндить на конкретный IP то ответы будут уходить только с него, в случае нескольких адаптеров/ | ||
+ | |||
+ | ===== Логика работы ===== | ||
+ | Все запросы принимаются, | ||
+ | На каждый тип запроса вызывается соответствующая функция для обработки.\\ | ||
+ | |||
+ | |||
+ | ==== 1. Пришёл запрос ==== | ||
+ | В запросе есть: | ||
+ | * 82.Vlan ID | ||
+ | * 82.Unit ID (номер коммутатора в стёке) | ||
+ | * 82.Port ID | ||
+ | * 82.Chassis ID (мак коммутатора) | ||
+ | * giaddr (relay agent IP) | ||
+ | * DHCP Client ID - а это вообще генерирует клиент | ||
+ | |||
+ | Опция 82 и giaddr могут не приходить при попытке продления клиентом времени аренды, | ||
+ | Соответственно клиент потеряет аренду если не получит от него запроса на продление, | ||
+ | |||
+ | Из этого многообразия нужно определить что будем использовать для идентификации клиента и сети клиента. | ||
+ | RFC2141 говорит что мы должны полагаться на DHCP Client ID, если её нет то на аппаратный адрес, при идентификации клиента.\\ | ||
+ | |||
+ | |||
+ | ==== 2. Поиск в базе ==== | ||
+ | На основании выбранного идентификатора из п1 ищем в базе настройки для сети: | ||
+ | * [scope id] - некоторая информация по которой будем искать из п1 (к примеру: | ||
+ | * DHCP enabled | ||
+ | * Lease time | ||
+ | * Renew time | ||
+ | * Rebind Time | ||
+ | * Subnet mask | ||
+ | * Routers (default gateways) | ||
+ | * Domain Name servers | ||
+ | * Static routes | ||
+ | * Classless routes (можно держать net_id и по нему делать выборку с др таблицы) | ||
+ | * Domain name | ||
+ | * ... | ||
+ | ==== 3. Лиза клиента ==== | ||
+ | [client id] (тут может быть, к примеру: | ||
+ | * End Lease Time | ||
+ | * IP | ||
+ | * ... | ||
+ | параметры из п2 можно продублировать здесь и считать их главнее.\\ | ||
+ | Время обновляется при получении/ |