This shows you the differences between two versions of the page.
Next revision | Previous revisionLast revisionBoth sides next revision | ||
software:perl:dhcp_server [2015/05/18 03:03] – создано root | software:perl:dhcp_server [2022/02/05 04:19] – root | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== DHCP на Perl ====== | ====== DHCP на Perl ====== | ||
+ | Фреймворк для построения собственно DHCP сервера с базой данных\\ | ||
+ | Реализован приём пакетов, | ||
+ | |||
+ | **Скачать**: | ||
+ | **Лицензия**: | ||
+ | **Обсуждение**: | ||
+ | |||
+ | ===== Модификации и дополнения ===== | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[http:// | ||
Line 9: | Line 22: | ||
* умеет отправлять копии пакетов на указанный IP адрес | * умеет отправлять копии пакетов на указанный IP адрес | ||
* умеет работать в качестве демона | * умеет работать в качестве демона | ||
- | * несколько уровней вывода отладочной инфы: 1 - от кого, кому, время обработки, | + | * несколько уровней вывода отладочной информации |
+ | |||
+ | |||
+ | ===== Производительность ===== | ||
+ | На процессоре CoreDuo E5300 при статически сконфигурированных ответах (без базы) получалось обработать примерно 3-4 тысячи запросов в секунду.\\ | ||
+ | С базой данных будет меньше, | ||
+ | |||
+ | |||
+ | ===== Требования ===== | ||
+ | * DHCP Relay - скрипт работает только через релеи, без них он не работоспособен | ||
+ | * perl с поддержкой многопоточности | ||
+ | * набор пакетов к perl указанный в начале скрипта | ||
+ | * дописать запросы к базе данных, | ||
+ | |||
+ | |||
+ | ===== Опции командной строки ===== | ||
+ | * **-b** - <ip> IP адрес для приёма запросов, | ||
+ | * **-sp** - < | ||
+ | * **-cp** - < | ||
+ | * **-id** - <ip> IP адрес - DHCP server ID, Обязательно установить!, | ||
+ | * **-m** - <ip> IP адрес куда отправлять копии всех принятых запросов | ||
+ | * **-t** - < | ||
+ | * **-dbs** - параметры подключения к базе данных: | ||
+ | * **-dbl** - логин для подключения к базе данных | ||
+ | * **-dbp** - пароль для подключения к базе данных | ||
+ | * **-P** - < | ||
+ | * **-v** - < | ||
+ | * **-d** - работать в режиме | ||
+ | |||
+ | ==== Замечание ==== | ||
+ | Для все параметры подключения к базе данных: | ||
+ | |||
+ | |||
+ | ===== Пример запуска ===== | ||
+ | < | ||
+ | * **192.168.0.1** - адрес дхцп сервера (настроенный в релеях) к которому должны обращаться клиенты | ||
+ | * **192.168.0.2** - адрес куда отсылаются копии всех пакетов, | ||
+ | * **2** - потока | ||
+ | * **1** - выводить минимум отладочной информации о запросах: | ||
+ | |||
+ | |||
+ | ==== Замечание ==== | ||
+ | Биндить лучше на 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 можно продублировать здесь и считать их главнее.\\ | ||
+ | Время обновляется при получении/ | ||
+ | |||
+ | |||
+ | {{tag> |