# Устройство DHCP \ подробный разбор протокола ###### tags: `DHCP` `Wireshark` `UserGate` Процесс получения IP-адреса состоит из четырех этапов ![](https://i.imgur.com/HbMBdcw.png) ![](https://i.imgur.com/DNs54MT.png) ## 1. DHCP DISCOVER :::spoiler **Клиент, отправляет широковещательное сообщение Обнаружения DHCP** В этот момент передается номер транзакции - **xid**, MAC-адрес устройства - **chaddr**, также в опциях передается последний присвоенный клиенту IP-адрес ![](https://i.imgur.com/gYEcHC1.png) :::info :question:**А что такое 55 (Parameter Request List)**:question: Это список опции запрашиваемых клиентом. :pushpin:*ОПЦИИ ВСЕГДА ЗАПРАШИВАЮТСЯ КЛИЕНТОМ.* ::: ## 2. DHCP OFFER :::spoiler **Серверы DHCP, формируют сообщение Предложения DHCP** Предложение содержит сетевую конфигурацию, если сервер не один, предложений будет несколько. Клиент выбирает одну конфигурацию (ту что получил первой). ![](https://i.imgur.com/0UciHXR.png) Предлагаемый клиенту адрес хранится в поле **yiaddr**, в **siaddr** хранится адрес DHCP-сервера. :::info :pushpin: Иногда по MAC адресу DHCP сервер отправляет OFFER напрямую **(unicast)**, DHCP в Windows server иногда отправляет broadcast::: Остальные параметры передаются через опции 1, 3, 6 - маска, шлюз и DNS сервер соответственно ![](https://i.imgur.com/4Sb1Ea3.png) ::: ## 3. DHCP REQUEST :::spoiler **Клиент официально запрашивает у сервера данную конфигурацию, отправив broadcast Запрос DHCP** Запрос повторяет по структуре сообщение Discover, только добавив **опцию 54** с адресом сервера, конфигурацию которого клиент принял. **Опция 50** содержит предложенный сервером IP-адрес. ![](https://i.imgur.com/JCg47ba.png) :::info :pushpin: Request рассылается широковещательно для того, чтобы остальные DHCP-сервера понимали, что их предложение отвергнуто. ::: ## 4. DHCP ACK :::spoiler **Получив запрос сервер направляет клиенту в ответ Подтверждение DHCP** После этого клиент должен применить сетевую конфигурацию. По структуре Ask практически не отличается Offer, за исключением поля **siaddr** здесь адрес DHCP-сервера НЕ заполняется, но его адрес передается в **опции 54**. ![](https://i.imgur.com/I32ikr8.png)::: ::: ## DHCP DECLINE :::info :pushpin: **Если адрес занят клиент выдаст сообщение Отказа DHCP (DHCP DECLINE)** ::: Получив адрес клиент проверяет его на занятость через broadcast ARP-запроса, **если адрес занят** (например назначен вручную), то клиент посылает широковещательное **сообщение Отказа DHCP (DHCP DECLINE)** и начинает процесс получения адреса заново. Сервер, получив сообщение отказа, должен пометить указанный адрес как недоступный и уведомить администратора о возможной проблеме в конфигурации (например, записью в логе). ## DHCP RELEASE :::info :pushpin: **Отказ клиента от выданного IP адреса с помощью сообщения DHCP RELEASE.** ::: Клиент может самостоятельно отказаться от адреса, сообщение Освобождения DHCP (DHCP RELEASE), в отличии от других сообщений, RELEASE направляется юникастом серверу, выдавшему адрес. Получив его, сервер помечает адрес как доступный, но на всякий случай оставляет запись о клиенте, если он захочет получить адрес повторно. Это поведение не является обязательным, но реализовано в большинстве DHCP-серверов. :::warning :warning: Важно понимать что **DHCP DISCOVER это широковещательный запрос**, и как любой broadcast он **ограничен своим широковещательным доменом** и выходить за его пределы не сможет. Т.е. раздавать адреса из сети 192.168.1.0/24 в сеть 192.168.100.0/24 без изменения маски не получится.---Но если очень нужно... ::: ## Функция DHCP Relay **Функция DHCP Relay** Option 82 [(стандарт RFC 3046)](https://datatracker.ietf.org/doc/html/rfc3046) применяется для предоставления DHCP-серверу данных о полученном запросе из других сетей разделённых своим широковещательным доменом или VLAN. В частности, к этим данным можно отнести: * Адрес DHCP-ретранслятора, с которого шёл запрос; * Номер порта ретранслятора, через который поступил запрос; При настройке, например, коммутатора в режиме **DHCP Relay** можно значительно повысить эффективность сети за счёт сокращения количества DHCP-серверов, которые при другой схеме понадобились бы для каждой подсети. В данном случае коммутатор сам переадресует DHCP-запрос от клиента к удалённому DHCP-серверу и добавит указанные выше данные. :::info :pushpin: В общем случае, назначение опции DHCP Relay Option 82 — это привязка IP-адреса, выдаваемого DHCP-сервером, к порту коммутатора, к которому подключён клиент, либо к ретранслятору, с которого поступил запрос, что может помочь с систематизацией IP-адресов в локальной сети при использовании DHCP-сервера. ::: ### DHCP Relay на примере UTM UserGate v5 На UserGate DHCP relay настраивается на интерфейсе в сети которого расположен непосредственно DHCP сервер. ![](https://i.imgur.com/iVbLZcS.png) * В конфигурации интерфейса во вкладке DHCP-relay, активируем галочку "включено" * В поле "Адрес User-Gate" указываем IP адрес интерфейса в котором находятся клиенты DHCP. ![](https://i.imgur.com/vJQYWWJ.png) * В поле "Серверы DHCP" указать список серверов DHCP из сети конфигурируемого интерфейса. После настройки, UserGate начнёт перенаправлять пакеты с DHCP запросами непосредственно на сам сервер из сети с клиентами. ``` ``` :::success :alien: Системный администратор ### Паламарчук Антон :e-mail: Email: mrpalamarchuk93@gmail.com :airplane: Telegram Channel [@ipraptor_blog](https://t.me/ipraptor_blog) :incoming_envelope: Telegram [@IPraptor](https://t.me/IPraptor) ::: <style> .button { border-radius: 4px; color: rgb(0, 41, 123); display:block; text-align: center; font-family: Arial, Helvetica, sans-serif; font-size: 100%; padding: 10px 25px; margin-top: 1%; margin-left: 1%; text-decoration: none; background-color: rgb( 213, 233, 255); border: none; display:inline-block; } a.back{ border-radius: 4px; color: black; display:block; width:157px; text-align: center; font-weight:bold; font-family: Arial, Helvetica, sans-serif; font-size: 14px; padding: 8px 16px; margin: left; margin-top: 50px; text-decoration: none; background-color: rgb(255,237,55); } </style> <a href="https://hackmd.io/@IPraptor " class="back">К списку заметок</a>