Протокол DHCP

TL;DR: DHCP (Dynamic Host Configuration Protocol) автоматически назначает хостам IP-адрес, маску подсети, gateway и DNS-серверы. Клиент отправляет широковещательный запрос, сервер отвечает предложением — четырёхшаговый процесс DORA (Discover → Offer → Request → Acknowledge). Адрес выдаётся в аренду (lease) на ограниченный срок, клиент периодически продлевает её.

Зачем это знать

Без DHCP каждому устройству в сети пришлось бы вручную назначать IP-адрес, маску, gateway и DNS. На домашней сети с тремя устройствами это терпимо. В сети офиса на 200 машин или в кластере с динамически создаваемыми контейнерами — невозможно.

Понимание DHCP объясняет:

  • Откуда машина получает IP при загрузке (и почему иногда не получает)
  • Почему IP-адрес может измениться после перезагрузки
  • Что такое «аренда» адреса и почему адреса иногда «заканчиваются»
  • Зачем серверам назначают статический IP вместо DHCP

Проблема, которую решает DHCP

При подключении к сети хосту нужны как минимум четыре параметра:

ПараметрЗачем
IP-адресИдентификация в сети
Маска подсетиОпределение границ локальной сети
Gateway (default route)Куда отправлять пакеты за пределы подсети
DNS-серверРезолвинг имён в IP-адреса

DHCP раздаёт все четыре (и не только) автоматически. Клиенту достаточно отправить запрос — и он получает полную конфигурацию сети.

Процесс DORA

Когда хост подключается к сети без настроенного IP, происходит четырёхшаговый обмен:

Клиент                                   DHCP-сервер
(IP ещё нет)                             (напр. 192.168.1.1)
   │                                          │
   │  1. DHCP Discover (broadcast)            │
   │  src: 0.0.0.0  dst: 255.255.255.255     │
   │  "Есть тут DHCP-сервер?"                │
   │─────────────────────────────────────────→│
   │                                          │
   │  2. DHCP Offer                           │
   │  "Предлагаю 192.168.1.100,              │
   │   маска /24, gateway .1, DNS 8.8.8.8,   │
   │   аренда 24 часа"                        │
   │←─────────────────────────────────────────│
   │                                          │
   │  3. DHCP Request (broadcast)             │
   │  "Принимаю 192.168.1.100"               │
   │─────────────────────────────────────────→│
   │                                          │
   │  4. DHCP Acknowledge                     │
   │  "Подтверждаю. 192.168.1.100 — твой     │
   │   на 24 часа"                            │
   │←─────────────────────────────────────────│
   │                                          │
   ▼                                          │
Клиент настраивает интерфейс:
  ip=192.168.1.100/24
  gw=192.168.1.1
  dns=8.8.8.8

Почему Discover и Request — broadcast

У клиента ещё нет IP-адреса, поэтому он не может отправить обычный unicast-пакет. Широковещание (255.255.255.255) доставляется всем устройствам в локальной сети. DHCP работает поверх UDP (порты 67 — сервер, 68 — клиент).

Request тоже broadcast, хотя клиент уже знает адрес сервера. Причина: в сети может быть несколько DHCP-серверов. Broadcast-Request сообщает всем серверам, чьё предложение принято, а чьё — отклонено.

Аренда (Lease)

IP-адрес выдаётся не навсегда, а на определённый срок — lease time. Типичные значения: от 1 часа (публичный Wi-Fi) до 24 часов (домашняя сеть) и 7 дней (офис).

Продление аренды

Клиент не ждёт окончания аренды — он начинает продление заранее:

Lease = 24 часа
   │
   ├── 50% (12ч) → T1: unicast-запрос к серверу на продление
   │               Сервер ответил → lease обновлён на новые 24ч
   │               Сервер не ответил → ждём T2
   │
   ├── 87.5% (21ч) → T2: broadcast-запрос (может другой сервер)
   │                  Ответил → lease обновлён
   │                  Не ответил → ждём expire
   │
   └── 100% (24ч) → Lease expired
                     Клиент обязан освободить IP
                     и начать DORA заново

При нормальной работе клиент продлевает аренду на T1 — сервер отвечает, и пользователь не замечает процесса. Проблемы начинаются когда DHCP-сервер недоступен до expire.

Что выдаёт DHCP помимо IP

ОпцияDHCP optionОписание
Маска подсети1/24, /16 и т.д.
Gateway3Default route
DNS-серверы6Один или несколько
Имя домена15home.local, corp.example.com
NTP-сервер42Сервер времени
Lease time51Срок аренды (секунды)
TFTP-сервер66Для PXE-загрузки по сети

DHCP-клиенты в Linux

В Linux DHCP-клиент — это отдельная программа, которая отправляет запросы и конфигурирует интерфейс. Ядро DHCP не реализует.

КлиентГде используется
dhclientКлассический (ISC), Debian/Ubuntu (устаревает)
dhcpcdArch Linux, легковесный
NetworkManager (встроенный)Десктопы (Ubuntu Desktop, Fedora)
systemd-networkdСерверы, контейнеры (встроенный в systemd)
# Посмотреть текущую аренду
# NetworkManager
nmcli device show eth0 | grep -i dhcp
 
# systemd-networkd
networkctl status eth0
 
# dhclient
cat /var/lib/dhcp/dhclient.leases
 
# dhcpcd
cat /var/lib/dhcpcd/dhcpcd-eth0.lease
 
# Принудительно запросить новый адрес
sudo dhclient -r eth0      # освободить
sudo dhclient eth0          # запросить заново
 
# Через NetworkManager
sudo nmcli connection down "Wired connection 1"
sudo nmcli connection up "Wired connection 1"

DHCP vs статический IP

DHCPСтатический IP
НастройкаАвтоматическаяРучная
Адрес может менятьсяДа (при смене lease)Нет
Зависимость от сервераДа (нет сервера → нет IP)Нет
МасштабированиеОтлично (сотни устройств)Плохо (ручная работа)
ПрименениеРабочие станции, ноутбуки, телефоныСерверы, принтеры, сетевое оборудование

Серверам назначают статический IP, потому что их адрес должен быть предсказуемым — DNS-записи, firewall-правила, конфиги приложений ссылаются на конкретный IP.

Компромисс: DHCP Reservation (Static Lease)

DHCP-сервер закрепляет определённый IP за MAC-адресом устройства. Устройство использует DHCP (не нужна ручная конфигурация), но всегда получает один и тот же адрес. Настраивается на стороне DHCP-сервера, а не клиента.

Подводные камни

ПроблемаСимптомРешение
Нет IP после подключенияip a — нет inet на интерфейсеПроверить: интерфейс UP? DHCP-клиент запущен? Сервер доступен? journalctl -u NetworkManager
Адрес 169.254.x.x (link-local)DHCP-сервер не ответилКлиент назначил APIPA-адрес. Проверить кабель, DHCP-сервер, VLAN
IP меняется после rebootLease expired или другой адрес из пулаНастроить DHCP reservation по MAC, или перейти на static IP
Два устройства с одним IPКонфликт адресов, сеть нестабильнаОдин из хостов имеет static IP из DHCP-пула. Исключить адрес из пула или изменить static
Адреса «кончились»Новые устройства не получают IPПул исчерпан. Увеличить диапазон, уменьшить lease time, или расширить подсеть
dhclient и NetworkManager конфликтуютНепредсказуемое поведениеИспользовать что-то одно. На десктопе — NetworkManager, на сервере — systemd-networkd или netplan

Связанные материалы