This repository was archived by the owner on Sep 9, 2021. It is now read-only.
Гуляев Дмитрий, 3530901/70201, lab2 dhcp server #95
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Инструкция по использованию
Запустить скрипт командой
python3 dhcp_server.py
с нужными аргументами. Для использования порта 67 необходимо запускать программу с правами суперпользователя:sudo python3 dhcp_server.py
. Возможные аргументы:По дефолту сервер запускается по адресу 0.0.0.0, порт 67.
Описание используемого протокола.
Структура DHCP-сообщения, в скобках указана длина поля в октетах (байтах):
В данной программе поля sname и file не заполняются. При приеме и отправке сообщений используются следующие опции (помимо pad option, end option и magic cookie):
Subnet Mask:
Router Option:
Domain Name Server Option:
DHCP Message Type:
Server Identifier:
IP Address Lease Time:
Requested IP Address:
Данные опции были выбраны исходя из того, с какими опциями ходят пакеты у меня по сети на машине с ubuntu 20. Подразумевается использование только одного роутера и одного сервера имен. Важным моментом является то, что механизм аренды адресов реализован тривиально, не по RFC-стандарту. Предлагаемый/назначаемый адрес отсчитывается от адреса сервера, назначенные адреса хранятся в простом массиве, адрес выдается на максимальное время. Можно было бы создать базу данных и реализовать аренду по всем правилам стандарта, но мне показалось, что это уже выходит за рамки курса. Может быть, я был неправ.
Сервер умеет принимать сообщения типа DHCPDISCOVER, DHCPREQUEST, DHCPRELEASE и DHCPDECLINE и отвечать DHCPOFFER и DHCPACK.
Сервер проверялся в основном работой с клиентом dhclient. С проверкой сервера возникли некоторые трудности. Например, DHCPDISCOVER от клиента dhclient не воспринимался сервером, хотя все сообщения DHCPREQUEST приходили. Для проверки работы с DHCPDISCOVER потребовалось использовать утилиту nmap:
sudo nmap --script broadcast-dhcp-discover
Вывод утилиты:
Здесь видно, что предложение поступило от стандартного сервера, а не от моего, хотя сервер реагирует и отправляет сообщение по соответствующему адресу:
Для проверки DHCPREQUEST можно использовать dhclient, но ситуация примерно та же:
sudo dhclient -s 0.0.0.0 -v
Вывод dhclient:
Реакция сервера:
Здесь назначаемый адрес был взят из поля Requested IP Address опций поступившего DHCPREQUEST.