---
# System prepended metadata

title: Устройство DHCP \ подробный разбор протокола
tags: [UserGate, DHCP, Wireshark]

---

# Устройство 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>