Инструменты пользователя

Инструменты сайта


ru:software:perl:dhcp_server

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Следующая версия
Предыдущая версия
ru:software:perl:dhcp_server [2015/05/18 03:03]
root создано
ru:software:perl:dhcp_server [2015/05/20 18:28] (текущий)
root ru:software:dhcp_server_on_perl переименовано в ru:software:perl:dhcp_server
Строка 1: Строка 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]]
  
  
Строка 9: Строка 22:
   * умеет отправлять копии пакетов на указанный IP адрес   * умеет отправлять копии пакетов на указанный IP адрес
   * умеет работать в качестве демона   * умеет работать в качестве демона
-  * несколько уровней вывода отладочной инфы: 1 - от кого, кому, время обработки,​ 2 - тоже что и 1 и декодинг содержимого пакетов+  * несколько уровней вывода отладочной информации 
 + 
 + 
 +===== Производительность ===== 
 +На процессоре 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 ​можно использовать:​ [[ru:​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 можно продублировать здесь и считать их главнее.\\ 
 +Время обновляется при получении/​продлении аренды,​ адрес в зависимости от настроек.\\
ru/software/perl/dhcp_server.1431918186.txt.gz · Последние изменения: 2015/05/18 03:03 — root