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 revisionBoth sides next revision
software:perl:dhcp_server [2022/02/04 18:37]
– ↷ Links adapted because of a move operation root
software:perl:dhcp_server [2022/02/04 18:37]
– removed - external edit (Unknown date) 127.0.0.1
Line 1: Line 1:
-====== 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]] 
- 
- 
-===== Возможности ===== 
-  * поддержка любых опций, включая опцию 82, маршруты 
-  * возможность работы с любой базой или файлами 
-  * легкость модификации 
-  * масштабируемость: как многопоточность так и возможность работы одновременно на нескольких серверах 
-  * умеет отправлять копии пакетов на указанный IP адрес 
-  * умеет работать в качестве демона 
-  * несколько уровней вывода отладочной информации 
- 
- 
-===== Производительность ===== 
-На процессоре CoreDuo E5300 при статически сконфигурированных ответах (без базы) получалось обработать примерно 3-4 тысячи запросов в секунду.\\ 
-С базой данных будет меньше, основная нагрузка придётся именно на неё.\\ 
- 
- 
-===== Требования ===== 
-  * DHCP Relay - скрипт работает только через релеи, без них он не работоспособен 
-  * perl с поддержкой многопоточности 
-  * набор пакетов к perl указанный в начале скрипта 
-  * дописать запросы к базе данных, местами можно и закомментировать (release, decline) 
- 
- 
-===== Опции командной строки ===== 
-  * **-b** - <ip> IP адрес для приёма запросов, по умолчанию: 0.0.0.0 (bind addr) 
-  * **-sp** - <port> порт для приёма запросов, по умолчанию: 67 (bind port) 
-  * **-cp** - <port> порт для отправки ответов клиенту напрямую, по умолчанию: 68 
-  * **-id** - <ip> IP адрес - DHCP server ID, Обязательно установить!, Должен быть реальным IP адресом сервера. 
-  * **-m** - <ip> IP адрес куда отправлять копии всех принятых запросов 
-  * **-t** - <threads> количество потоков, рекомендуется: CPU cores * 2, по умолчанию: 4 
-  * **-dbs** - параметры подключения к базе данных: DriverName:database=database_name;host=hostname;port=port 
-  * **-dbl** - логин для подключения к базе данных 
-  * **-dbp** - пароль для подключения к базе данных 
-  * **-P** - <path> имя файла куда сохранять PID 
-  * **-v** - <level> отображать отладочную информацию: 1 - от кого, кому, время обработки, 2 - тоже что и 1 плюс декодинг содержимого пакетов, по умолчанию 0 - ничего не отображать. 
-  * **-d** - работать в режиме демона 
- 
-==== Замечание ==== 
-Для все параметры подключения к базе данных: логин, пароль, адрес - могут быть прописаны в скрипте. 
- 
- 
-===== Пример запуска ===== 
-<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.2** - адрес куда отсылаются копии всех пакетов, под windows можно использовать: [[software:win:net:dhcp_tool|DHCPTool - Утилита-снифер для декодирования DHCP пакетов]] 
-  * **2** - потока 
-  * **1** - выводить минимум отладочной информации о запросах: от кого получено, кому отправлено, сколько времени заняло 
- 
- 
-==== Замечание ==== 
-Биндить лучше на 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