Site Tools


software:perl:dhcp_server

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Next revisionBoth sides next revision
software:perl:dhcp_server [2015/05/20 13:42]
– [Требования] root
software:perl:dhcp_server [2015/05/20 18:26]
– [DHCP на Perl] root
Line 1: Line 1:
 ====== DHCP на Perl ====== ====== DHCP на Perl ======
 +Фреймворк для построения собственно DHCP сервера с базой данных\\
 +Реализован приём пакетов, разбор, доступ к опциями, изменение формата до нужного.\\
 +
 +**Скачать**: [[http://netlab.linkpc.net/download/software/perl/dhcp_srv/dhcpd.pl|dhcpd.pl]]\\
 +**Лицензия**: BSD\\
 +**Обсуждение**: [[http://forum.nag.ru/forum/index.php?showtopic=64849|forum.nag.ru]]\\
 +
 +===== Модификации и дополнения =====
 +  * [[http://forum.nag.ru/forum/index.php?showtopic=64849&view=findpost&p=683271|Вариант от Инкогнито]]
 +  * [[http://forum.nag.ru/forum/index.php?showtopic=64849&view=findpost&p=764264|Вариант от NiTr0 для Abills]]
 +  * [[http://forum.nag.ru/forum/index.php?showtopic=64849&view=findpost&p=801162|Пример запроса к базе от doubtpoint]]
 +  * [[http://forum.nag.ru/forum/index.php?showtopic=64849&view=findpost&p=1000353|Варианты с пулом от Cramac]]
 +  * [[http://forum.nag.ru/forum/index.php?showtopic=64849&view=findpost&p=1005220|Патч для переподключения к базе от harmless]]
  
  
Line 10: Line 23:
   * умеет работать в качестве демона   * умеет работать в качестве демона
   * несколько уровней вывода отладочной информации   * несколько уровней вывода отладочной информации
 +
 +
 +===== Производительность =====
 +На процессоре CoreDuo E5300 при статически сконфигурированных ответах (без базы) получалось обработать примерно 3-4 тысячи запросов в секунду.\\
 +С базой данных будет меньше, основная нагрузка придётся именно на неё.\\
  
  
Line 48: Line 66:
 Биндить лучше на 0.0.0.0, потому как если забиндить на конкретный IP то ответы будут уходить только с него, в случае нескольких адаптеров/алиасов остальные задействованны не будут. В таких случаях сервер будет получать, обрабатывать запрос но ответ уходить не будет.  Биндить лучше на 0.0.0.0, потому как если забиндить на конкретный IP то ответы будут уходить только с него, в случае нескольких адаптеров/алиасов остальные задействованны не будут. В таких случаях сервер будет получать, обрабатывать запрос но ответ уходить не будет. 
  
 +
 +===== Логика работы =====
 +Все запросы принимаются, далее происходит разбор, отсев не DHCP пакетов, пакетов от microsoft RRAS (встроенный VPN сервер пытается захапать пачку адресов для дальнейшей раздачи), и прочего мусора.\\
 +На каждый тип запроса вызывается соответствующая функция для обработки.\\
 +
 +
 +==== 1. Пришёл запрос ====
 +В запросе есть:
 +  * 82.Vlan ID
 +  * 82.Unit ID (номер коммутатора в стёке)
 +  * 82.Port ID
 +  * 82.Chassis ID (мак коммутатора)
 +  * giaddr (relay agent IP)
 +  * DHCP Client ID - а это вообще генерирует клиент
 +
 +Опция 82 и giaddr могут не приходить при попытке продления клиентом времени аренды, тк клиент уже имеет IP адрес и пытается слать запрос напрямую серверу. Зависит от коммутатора, его настроек и его глючности.\\
 +Соответственно клиент потеряет аренду если не получит от него запроса на продление, и клиент начнёт по новой получать адрес.\\
 +
 +Из этого многообразия нужно определить что будем использовать для идентификации клиента и сети клиента.
 +RFC2141 говорит что мы должны полагаться на DHCP Client ID, если её нет то на аппаратный адрес, при идентификации клиента.\\
 +
 +
 +==== 2. Поиск в базе ====
 +На основании выбранного идентификатора из п1 ищем в базе настройки для сети:
 +  * [scope id] - некоторая информация по которой будем искать из п1 (к примеру: 82.vlan id)
 +  * 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] (тут может быть, к примеру: 82.vlan id + 82.port id или DHCP Client ID, те кто привязывает адрес к порту должны либо настраивать коммутаторы чтобы опция82 добавлялась всегда, либо организовывать логику с учётом того что после получения адреса, клиент запрос для продления аренды будет слать на прямую серверу и он не всегда релееится - те приходит без опции 82):
 +  * End Lease Time
 +  * IP
 +  * ...
 +параметры из п2 можно продублировать здесь и считать их главнее.\\
 +Время обновляется при получении/продлении аренды, адрес в зависимости от настроек.\\
software/perl/dhcp_server.txt · Last modified: 2022/02/05 05:25 by root