Site Tools


software:perl:dhcp_server

This is an old revision of the document!


DHCP на Perl

Фреймворк для построения собственно DHCP сервера с базой данных
Реализован приём пакетов, разбор, доступ к опциями, изменение формата до нужного.

Скачать: dhcpd.pl
Лицензия: BSD
Обсуждение: forum.nag.ru

Модификации и дополнения

Возможности

  • поддержка любых опций, включая опцию 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 - работать в режиме демона

Замечание

Для все параметры подключения к базе данных: логин, пароль, адрес - могут быть прописаны в скрипте.

Пример запуска

dhcpd.pl -id 192.168.0.1 -m 192.168.0.2 -t 2 -v 1
  • 192.168.0.1 - адрес дхцп сервера (настроенный в релеях) к которому должны обращаться клиенты
  • 192.168.0.2 - адрес куда отсылаются копии всех пакетов, под windows можно использовать: 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.1432137146.txt.gz · Last modified: 2015/05/20 15:52 by root