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

Trushin ivan 3530901/70203 lab2 dhcp client #79

Conversation

gedar0082
Copy link

Для всех:

Указать Фамилию Имя, № группы (можно не в теле PR, а в имени)

Поставить label соответствующий сдаваемой лабе

Для тех, кто в тело PR вставляет отчет:

Отчет должен содержать следующие элементы:

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

Инструкция по сборке/установке

Описание используемого протокола.

Данные пункты не указывают строгий формат отчета, а напоминают, что
он должен содержать.

@gedar0082
Copy link
Author

DHCP client

Описание протокола
DHCP протокол - расширяющий BOOTP протокол и имеющий с ним обратную совместимость, протокол, использующийся для выдачи IP компьютерам, подключающимся к сети, в которой у них еще нет IP. DHCP клиент, подключающийся к сети, отправляет пакет DISCOVER с уникальным числом на широковещательный адрес, где его должен поймать какой-то DHCP сервер. Этот сервер широковещательно отправляет пакет OFFER(изначально предполагалось отправлять пакет таргетировано на MAC, но может использоваться и широковещательная рассылка), где используется уникальное число, которое клиент сгенерировал, когда отправлял DISCOVER, и по этому числу клиент должен опознать OFFER. Предполагаемый IP адрес, который сервер хочет выдать клиенту, указывается в сообщении, а все остальные параметры передаются в опциях. Чтобы исключить согласие клиента с несколькими предложенными адресами сразу, клиент выбирает первый пришедший оффер, и начинается проверка. Эта проверка состоит в том, чтобы клиент отправил сообщение типа REQUEST с тем IP адресом, который ему предложил сервер в OFFER так же широковещательно. В этом случае, только тот сервер, который выслал OFFER, ответит подтверждением - ACK, или отказом - NACK, и когда сервер отправляет ACK так же широковещательно, после этого он уже считает, что у клиента тот адрес, который сервер предложил в OFFER и с которым согласился клиент в REQUEST. Клиент, получая ACK, теперь считает, что этот адрес зарезервирован за клиентом(время аренды указывается в опциях). По истечении половины срока аренды адреса клиент высылает запрос на обновление адреса на сервер, и подтверждение на обновление аренды работает почти так же, как и запрос адреса, с тем только отличием, что клиент уже имеет адрес.

Описание пакетов
Здесь я рассмотрю устройство 4х основных пакетов - DISCOVER, OFFER, REQUEST, ACKNOWLEDGMENT
Пакеты имеют одинаковую структуру из одинаковых полей с ситуативно разным наполнением. Опознание пакетов проводится через первую опцию

  • op - (1 byte) -Тип сообщения. Например может принимать значения: BOOTREQUEST (0x01, запрос от клиента к серверу) и BOOTREPLY (0x02, ответ от сервера к клиенту).
  • htype - (1 byte) - Тип аппаратного адреса. Допустимые значения этого поля определены в RFC 1700 «Assigned Numbers». Например, для MAC-адреса Ethernet это поле принимает значение 0x01.
  • hlen - (1 byte) - Длина аппаратного адреса в байтах. Для MAC-адреса Ethernet —0x06.
  • hops - (1 byte) - Количество промежуточных маршрутизаторов (так называемых агентов ретрансляции DHCP), через которые прошло сообщение. Клиент устанавливает это поле в 0x00.
  • xid - (4 byte) - Уникальный идентификатор транзакции в 4 байта, генерируемый клиентом в начале процесса получения адреса.
  • secs - (2 byte) - Время в секундах с момента начала процесса получения адреса. Может не использоваться (в этом случае оно устанавливается в 0x0000).
  • flags - (2 byte) - Поле для флагов — специальных параметров протокола DHCP.
  • ciaddr - (4 byte) - IP-адрес клиента. Заполняется только в том случае, если клиент уже имеет собственный IP-адрес и способен отвечать на запросы ARP (это возможно, если клиент выполняет процедуру обновления адреса по истечении срока аренды).
  • yiaddr - (4 byte) - Новый IP-адрес клиента, предложенный сервером.
  • siaddr - (4 byte) - IP-адрес сервера. Возвращается в предложении DHCP
  • giaddr - (4 byte) - IP-адрес агента ретрансляции, если таковой участвовал в процессе доставки сообщения DHCP до сервера.
  • chaddr - (4 byte) - Аппаратный адрес (обычно MAC-адрес) клиента.
  • sname - (16 byte) - Необязательное имя сервера в виде нуль-терминированной строки.
  • file - (64 byte) - Необязательное имя файла на сервере, используемое бездисковыми рабочими станциями при удалённой загрузке. Как и sname, представлено в виде нуль-терминированной строки.
  • options - (unknown length) - Поле опций DHCP. Здесь указываются различные дополнительные параметры конфигурации. В начале этого поля указываются четыре особых байта со значениями 99, 130, 83, 99 («волшебные числа»), позволяющие серверу определить наличие этого поля. Поле имеет переменную длину, однако DHCP-клиент должен быть готов принять DHCP-сообщение длиной в 576 байт (в этом сообщении поле options имеет длину 340 байт).

Примет пакета DISCOVER
image

Пример пакета OFFER
image

Пример пакета REQUEST
image

Пример пакета ACKNOWLEDGMENT
image

Требования к установке

  • Необходим интерпретатор Python 3

Инструкция по запуску

  • Скачать файл(не требует компиляции)
  • Запустить командой
    image

Процесс тестирования
В процессе тестирования можно воспользоваться программой wireshark, которая может отслеживать приходящие и уходящие пакеты. С помощью фильтров можно отследить только dhcp пакеты, что я и сделал

  • Запускаем wireshark и выбираем сеть, к которой мы подключены
    image

  • Настраиваем фильтр на приём dhcp пакетов и подтверждаем фильтр
    image

  • запускаем клиент
    image
    как видим, клиент отработал весь цикл DORA.

  • Проверяем пойманные пакеты в wireshark
    image
    Здесь стоит оговориться, что так как windows по умолчанию запрещает отправлять пакеты широковещательно, то я отправлял пакеты не на ff.ff.ff.ff, а на бродкаст по локальной сети - 192.168.1.255, поэтому отправлял я пакеты с Ip адреса, выданного мне в локальной сети, так как не произошло(почему-то) подмены адреса в пакете на 0.0.0.0, который должен стоять в пакете, когда у машины еще нет IP адреса.
    Но сервер мне всё же отвечает бродкастом сообщением OFFER, которое я ловлю и высылаю ему сообщение REQUEST, с которым соглашается сервер и высылает мне сообщение ACK, подтверждая выдачу мне адреса 192.168.1.250 в моей локальной сети.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants