Skip to content

bin2738/DHCP_server

Repository files navigation

DHCP Сервер на Python

Этот проект представляет собой простой и экспериментальный 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)

Вы можете зарезервировать 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 будет выдан IP 192.168.0.50 со временем аренды 86400 секунд (24 часа).
  • Для aa:bb:cc:dd:ee:02 будет выдан IP 192.168.0.51 со временем аренды по умолчанию (из DHCP_LEASE_TIME).

Сервер автоматически загрузит этот файл при старте. Вы также можете управлять этими записями через веб-интерфейс. Важно: убедитесь, что зарезервированные IP-адреса не пересекаются с динамическим пулом, чтобы избежать конфликтов.

Запуск

Локальный запуск

  1. Клонируйте репозиторий:
    git clone <URL_ВАШЕГО_РЕПОЗИТОРИЯ>
    cd my_DHCP_server
  2. Установите зависимости:
    pip3 install -r requirements.txt
  3. Запустите сервер:
    sudo python3 main.py
    Сервер запустится и начнет слушать DHCP-запросы. Панель управления будет доступна в браузере по адресу: http://localhost:8080.

Пример запуска с кастомными настройками:

sudo DHCP_POOL_START=192.168.1.50 DHCP_POOL_END=192.168.1.150 python3 main.py

Запуск с помощью Docker

Это рекомендуемый способ для стабильного развертывания.

  1. Соберите Docker-образ:

    docker build -t dhcp-server .
  2. Запустите контейнер: Важно: 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

About

Lightweight & Experimental DHCP Server written in Python. Features lease persistence, background cleanup, Docker support, and a built-in Web Management UI/API.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors