Skip to content
This repository has been archived by the owner on Sep 9, 2021. It is now read-only.

Shelepov Vladislav. \203 lab2s #27

Closed
wants to merge 1 commit into from
Closed

Shelepov Vladislav. \203 lab2s #27

wants to merge 1 commit into from

Conversation

sh3lep
Copy link

@sh3lep sh3lep commented Nov 26, 2020

lab2s (DHCP сервер)

Взаимодействие через udp протокол было реализовано на языке Python.
DHCP - сетевой протокол, позволяющий сетевым устройствам автоматически получать IP-адрес и другие параметры, необходимые для работы в сети TCP/IP. Данный протокол работает по модели «клиент-сервер». Для автоматической конфигурации компьютер-клиент на этапе конфигурации сетевого устройства обращается к так называемому серверу DHCP и получает от него нужные параметры. Сетевой администратор может задать диапазон адресов, распределяемых сервером среди компьютеров. Это позволяет избежать ручной настройки компьютеров сети и уменьшает количество ошибок. Протокол DHCP используется в большинстве сетей TCP/IP.

Формат DHCP пакета

image

Поля пакета:

opcode - указывает нам на тип DHCP-сообщения. Если в этом поле вы видите значение 0×01, то это говорит нам о том, что сообщение является запросом от клиента к серверу. Такое сообщение еще иногда называется BOOTREQUEST. Если же в поле opCode записано значение 0×02, то это означает, что оно являет ответом DHCP-сервера
Hardware Type - Тип адреса на канальном уровне
Hardware Length (hlen) - Длина аппаратного адреса в байтах. Для протокола Ethernet и, соответственно, мак-адресов, указывается значение 0×06
Hops - Количество промежуточных маршрутизаторов, которые находятся на пути между клиентом и сервером
Transaction ID - Когда клиент начинает процесс получения IP-адреса, он генерирует значение для этого поля, чтобы сервер не перепутал конкретный процесс этого клиента с другим процессом
Seconds Elapsed - Время в секундах с момента начала процесса получения IP-адреса, это время обычно никого не интересует и обычно в нем стоят нули: 0×0000.
Flags - Поле для флагов или специальных параметров протокола DHCP
Client IP Address - Поле, в котором указывается IP-адрес клиента. Клиент заполняет его только в том случае, если у него уже есть IP-адрес и он может ответить на ARP-запрос. Такая ситуация возможно в том случае, если клиент хочет продлить время аренды IP-адреса
Your ID Address - В это поле DHCP-сервер вписывает IP-адрес, который хочет предложить клиенту
Server IP Address - IP-адрес сервера. Сервер указывает свой IP-адрес, когда делает DHCPOFFER
Gateway IP Address - Если используется схема с DHCP Relay Agent, то в этом поле передается его IP-адрес
Client Hardware Address - Если на канальном уровне используется протокол Ethernet, то в это поле записывается MAC-адрес клиента
Server Host Name - Если у сервера есть доменное имя/имя хоста, то он может сообщить его в этом поле, поле не является обязательным
Boot File - Это поле также не является обязательным и служит указателем для бездисковых рабочих станций о том, как называется файл на сервере, которые следует использовать для загрузки
Options - Поле опций, в котором передается львиная доля полезной информации для динамической конфигурации хоста
Поле опция выглядит как номер опции -> длина опции-> аргументы опции

Общий принцип работы DHCP:

  1. Устройство (клиент) рассылает широковещательный UDP запрос (DHCPDISCOVER) по всей сети с запросом «ну кто-нибудь, дайте мне IP адрес». Причем обычно (но не всегда) запрос происходит с 68 порта (источник), а назначение — 67 порт (назначение). Некоторые устройства отправляют пакеты и с 67 порта. Внутри пакета DHCPDISCOVER включен MAC адрес устройства клиента.
  2. Все сервера DHCP, находящиеся в сети (а их может быть несколько), формируют для устройства, отправившего DHCPDISCOVER, предложение DHCPOFFER с сетевыми настройками, и также широковещательно его отсылает его по сети. Идентификация кому предназначен этот пакет идет по MAC адресу клиента, предоставленного ранее в запросе DHCPDISCOVER.
  3. Клиент принимает пакеты с предложениями сетевых настроек, выбирает наиболее привлекательный (критерии могут быть различными, например, в т.ч. и по времени доставки пакета, количестве промежуточных маршрутов), и делает у понравившегося сервера DHCP «официальный запрос» DHCPREQUEST с сетевыми настройками. В этом случае пакет идет уже к конкретному серверу DHCP.
  4. Сервер, получивший DHCPREQUEST, отправляет пакет формата DHCPACK, в котором в очередной раз перечисляет сетевые настройки, предназначенные для данного клиента
    Реализация протокола.
    Так как в настоящем протоколов количество опций достаточно большое, то были реализованы только некоторые из них, которые позволяют корректно взаимодействовать с настоящими DHCP серверами и клиентами.
    Данный протокол работает на tcp сокетах.

Описание работы сервера

После старта сервер прослушивает 67 порт и ожидает посылок. После получения посылки сервер анализирует с помощью функций options_analyzer и options_handler, записывает данные клиента в определенную структуру, где ключом является мак адрес клиента и в зависимости от типа пришедшей посылки DHCPDISCOVER/DHCPREQUEST высылает определенный ответ.
В ответ на DHCPDISCOVER сервер генерирует пакет DHCPOFFER.В пакет записывается рандомный IP адрес в определенном промежутке, который есть возможность редактировать. Данный IP адрес записывается в список, чтобы при генерации следующего IP не сгенерировать такой же. Если клиент запрашивает subnetmask/router/DNS, то данные значения будут равны 255.255.255.0/192.168.0.1/8.8.8.8.
В ответ на DHCREQUEST сервер генерирует DHCPACK в котором в очередной раз перечисляет сетевые настройки, предназначенные для данного клиента

Инструкция по использованию

Тестирование клиента можно проводить без различных утилит так как если есть подключение к интернету, то в windows есть строенный DHCP сервер. Результат работы DHCP клиента:

Для проверки работы необходимо запустить в терминале

client.py

server.py

dhcp_client

dhcp_server

Для тестирования DHCP сервера использовался код клиента с github.

@sh3lep sh3lep changed the title Shelepov Vladislav. \203 Shelepov Vladislav. \203 lab2s Nov 26, 2020
@wrbbz wrbbz added the Вторая лабораторная Реальные UDP протоколы label Nov 30, 2020
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Вторая лабораторная Реальные UDP протоколы Зачтено
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants