This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionNext revisionBoth sides next revision | ||
software:perl:dhcp_server [2015/05/20 14:46] – [Производительность] 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:// | ||
- | * [[http:// | ||
- | * [[http:// | ||
- | * [[http:// | ||
- | * [[http:// | ||
- | |||
- | |||
- | ===== Возможности ===== | ||
- | * поддержка любых опций, включая опцию 82, маршруты | ||
- | * возможность работы с любой базой или файлами | ||
- | * легкость модификации | ||
- | * масштабируемость: | ||
- | * умеет отправлять копии пакетов на указанный IP адрес | ||
- | * умеет работать в качестве демона | ||
- | * несколько уровней вывода отладочной информации | ||
- | |||
- | |||
- | ===== Производительность ===== | ||
- | На процессоре 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 можно продублировать здесь и считать их главнее.\\ | ||
- | Время обновляется при получении/ |