Протокол 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 и т.д. |
| Gateway | 3 | Default route |
| DNS-серверы | 6 | Один или несколько |
| Имя домена | 15 | home.local, corp.example.com |
| NTP-сервер | 42 | Сервер времени |
| Lease time | 51 | Срок аренды (секунды) |
| TFTP-сервер | 66 | Для PXE-загрузки по сети |
DHCP-клиенты в Linux
В Linux DHCP-клиент — это отдельная программа, которая отправляет запросы и конфигурирует интерфейс. Ядро DHCP не реализует.
| Клиент | Где используется |
|---|---|
dhclient | Классический (ISC), Debian/Ubuntu (устаревает) |
dhcpcd | Arch 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 меняется после reboot | Lease expired или другой адрес из пула | Настроить DHCP reservation по MAC, или перейти на static IP |
| Два устройства с одним IP | Конфликт адресов, сеть нестабильна | Один из хостов имеет static IP из DHCP-пула. Исключить адрес из пула или изменить static |
| Адреса «кончились» | Новые устройства не получают IP | Пул исчерпан. Увеличить диапазон, уменьшить lease time, или расширить подсеть |
dhclient и NetworkManager конфликтуют | Непредсказуемое поведение | Использовать что-то одно. На десктопе — NetworkManager, на сервере — systemd-networkd или netplan |
Связанные материалы
- networking — стек TCP/IP, IP-адреса, подсети, маршрутизация
- configure-network — nmcli, netplan, статический IP, DNS
- 05-networking-basics — практика: ip, ping, ss, ssh