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
software:perl:dhcp_server [2015/05/20 13:42]
– [Требования] root
software:perl:dhcp_server [2022/02/05 05:25] (current)
root
Line 1: Line 1:
-====== DHCP на Perl ======+====== DHCP сервер с базой SQL на Perl, с опцией 82, маршрутами и прочим ====== 
 +Фреймворк для построения собственно 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 40: Line 58:
 <code>dhcpd.pl -id 192.168.0.1 -m 192.168.0.2 -t 2 -v 1</code> <code>dhcpd.pl -id 192.168.0.1 -m 192.168.0.2 -t 2 -v 1</code>
   * **192.168.0.1** - адрес дхцп сервера (настроенный в релеях) к которому должны обращаться клиенты   * **192.168.0.1** - адрес дхцп сервера (настроенный в релеях) к которому должны обращаться клиенты
-  * **192.168.0.2** - адрес куда отсылаются копии всех пакетов, под windows можно использовать: [[ru:software:win:net:dhcp_tool|DHCPTool - Утилита-снифер для декодирования DHCP пакетов]]+  * **192.168.0.2** - адрес куда отсылаются копии всех пакетов, под windows можно использовать: [[software:win:net:dhcp_tool|DHCPTool - Утилита-снифер для декодирования DHCP пакетов]]
   * **2** - потока   * **2** - потока
   * **1** - выводить минимум отладочной информации о запросах: от кого получено, кому отправлено, сколько времени заняло   * **1** - выводить минимум отладочной информации о запросах: от кого получено, кому отправлено, сколько времени заняло
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 можно продублировать здесь и считать их главнее.\\
 +Время обновляется при получении/продлении аренды, адрес в зависимости от настроек.\\
  
  
 +{{tag>software freebsd linux net perl DHCP mysoft}}
software/perl/dhcp_server.1432129331.txt.gz · Last modified: 2015/05/20 13:42 by root