Этот проект представляет собой простой и экспериментальный DHCP-сервер, разработанный на Python. Он предназначен для базового управления IP-адресами в локальной сети. Сервер сохраняет информацию об арендах на диск, поддерживает фоновую очистку истекших записей и логирует свои действия.
- Прослушивание DHCP-запросов: Сервер слушает UDP-порт 67 (стандартный порт DHCP-сервера).
- Обработка DHCP-сообщений:
- DHCPDISCOVER: Отвечает сообщением DHCPOFFER, предлагая свободный IP-адрес.
- DHCPREQUEST: Подтверждает выдачу IP-адреса (
DHCPACK) или отвечает отказом (DHCPNAK). - DHCPRELEASE: Освобождает IP-адрес, делая его доступным для других клиентов.
- DHCPDECLINE: Обрабатывает сообщение от клиента о конфликте IP-адреса, помечая его как "проблемный".
- Управление IP-пулом: Автоматически выделяет и освобождает IP-адреса из заданного диапазона.
- Сохранение аренд: Все выданные IP-адреса (аренды) сохраняются на диск (
dhcp_leases.json), что позволяет серверу помнить их после перезапуска. - Фоновая очистка: Периодически (каждую минуту) автоматически удаляет истекшие аренды из памяти и файла.
- Гибкая конфигурация: Настройки сервера (IP-ададрес, маска, пул, DNS, файл аренд) могут быть заданы через переменные окружения.
- Логирование: Детальное логирование всех действий сервера в консоль и в файл
dhcp_server.log. - Web-интерфейс и API: Встроенная панель управления на порту 8080 для просмотра и управления арендами в реальном времени.
- Контейнеризация: Полная поддержка Docker для легкого развертывания.
- Python 3.7+
- Зависимости из файла
requirements.txt(pip install -r requirements.txt) - root-доступ для запуска на стандартном порту 67.
Настройки DHCP-сервера могут быть изменены через переменные окружения:
| Переменная окружения | Описание | Значение по умолчанию |
|---|---|---|
DHCP_SERVER_IP |
IP-адрес самого DHCP-сервера | 192.168.0.10 |
DHCP_SUBNET_MASK |
Маска подсети, которую будет выдавать | 255.255.255.0 |
DHCP_ROUTER |
IP-адрес шлюза по умолчанию | 192.168.0.1 |
DHCP_DNS_1, DHCP_DNS_2 |
IP-адреса DNS-серверов | 8.8.8.8, 8.8.4.4 |
DHCP_LEASE_TIME |
Время аренды IP в секундах | 3600 (1 час) |
DHCP_POOL_START |
Начальный IP-адрес пула | 192.168.0.100 |
DHCP_POOL_END |
Конечный IP-адрес пула | 192.168.0.200 |
DHCP_LEASES_FILE |
Путь к файлу с арендами IP | dhcp_leases.json |
DHCP_STATIC_LEASES_FILE |
Путь к файлу со статическими арендами | static_leases.json |
Вы можете зарезервировать IP-адрес для конкретного устройства (например, для принтера или сервера). Для этого создайте или отредактируйте файл static_leases.json (или тот, что указан в DHCP_STATIC_LEASES_FILE) в корне проекта.
Файл должен быть в формате JSON, где ключ — это MAC-адрес устройства, а значение — объект с IP-адресом и, опционально, временем аренды.
Пример static_leases.json:
{
"aa:bb:cc:dd:ee:01": {
"ip": "192.168.0.50",
"lease_time": 86400
},
"aa:bb:cc:dd:ee:02": {
"ip": "192.168.0.51"
}
}- Для
aa:bb:cc:dd:ee:01будет выдан IP192.168.0.50со временем аренды 86400 секунд (24 часа). - Для
aa:bb:cc:dd:ee:02будет выдан IP192.168.0.51со временем аренды по умолчанию (изDHCP_LEASE_TIME).
Сервер автоматически загрузит этот файл при старте. Вы также можете управлять этими записями через веб-интерфейс. Важно: убедитесь, что зарезервированные IP-адреса не пересекаются с динамическим пулом, чтобы избежать конфликтов.
- Клонируйте репозиторий:
git clone <URL_ВАШЕГО_РЕПОЗИТОРИЯ> cd my_DHCP_server
- Установите зависимости:
pip3 install -r requirements.txt
- Запустите сервер:
Сервер запустится и начнет слушать DHCP-запросы. Панель управления будет доступна в браузере по адресу:
sudo python3 main.py
http://localhost:8080.
Пример запуска с кастомными настройками:
sudo DHCP_POOL_START=192.168.1.50 DHCP_POOL_END=192.168.1.150 python3 main.pyЭто рекомендуемый способ для стабильного развертывания.
-
Соберите Docker-образ:
docker build -t dhcp-server . -
Запустите контейнер: Важно: DHCP-сервер должен работать в сети хоста (
--network host), чтобы принимать широковещательные запросы от клиентов, так как стандартный сетевой режим Docker не пропускает такие пакеты.docker run --rm --network host --name my-dhcp-server dhcp-server
Панель управления также будет доступна на
http://localhost:8080хост-машины.Для передачи кастомных настроек через переменные окружения, используйте флаг
-e:docker run --rm --network host -e DHCP_POOL_START=192.168.1.50 -e DHCP_POOL_END=192.168.1.150 --name my-dhcp-server dhcp-server
Для запуска юнит-тестов выполните команду:
python3 -m unittest test_dhcp.py -v