Learning Platform
Глоссарий Troubleshooting
Урок 06.05 · 18 мин
Начальный
DHCPDORALeaseBOOTP

DHCP — как ваш ноутбук получает IP в Wi-Fi

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

DHCP (Dynamic Host Configuration Protocol) — это протокол, по которому хосты автоматически получают IP-адрес и параметры сети. В этом уроке разберём DORA (4 шага DHCP-обмена), что такое lease, какие опции передаются помимо IP, и где DHCP может сломаться.

Знать DHCP нужно DE, потому что: 1) когда у вас в локалке два DHCP-сервера, начинается ад; 2) когда виртуалка не получает IP, надо знать, где смотреть; 3) когда в Kubernetes pod’ы получают IP по своему механизму — понимать аналогии с DHCP.

Endpoints, EndpointSlices и DNS в Kubernetes

Зачем DHCP

До DHCP админы настраивали каждую машину вручную. На каждом ноутбуке, телефоне, принтере прописывали:

  • IP-адрес
  • Subnet mask
  • Default gateway
  • DNS-серверы

В компании на 100 человек — админ ходил с ноутбуком и прописывал. На сети с динамичными гостями (отель, кофейня) — невозможно.

DHCP решил это: подключился к сети -> попросил у DHCP-сервера IP -> получил. Никакой ручной настройки.

В IPv4 DHCP — де-факто стандарт. Любой роутер (домашний, офисный, корпоративный) обычно встроенно работает DHCP-сервером для своей подсети.


DORA — 4 шага DHCP

Когда новый хост подключается к сети и хочет IP, происходит обмен из четырёх сообщений: Discover, Offer, Request, Acknowledge. Аббревиатура DORA.

DHCP DORA -- 4 шага получения IP
1. DISCOVERКлиент шлёт UDP broadcast с порта 68 на порт 67. dst IP = 255.255.255.255 (limited broadcast). src IP = 0.0.0.0 (ещё нет IP). 'Кто DHCP-сервер?'
broadcast
2. OFFERDHCP-сервер отвечает: 'предлагаю тебе IP 192.168.1.42, на 1 час, gateway 192.168.1.1, DNS 8.8.8.8'. Обычно тоже broadcast (клиент ещё без IP, по unicast не дойдёт)
3. REQUESTКлиент: 'я выбираю предложение от сервера X, дайте IP 192.168.1.42'. Broadcast -- чтобы все DHCP-серверы поняли, какое предложение принято
broadcast
4. ACKСервер: 'OK, IP 192.168.1.42 твой на 3600 секунд. Используй'. Клиент назначает IP интерфейсу, начинает работать

Детали:

Discover (broadcast):

  • src MAC: ваш MAC
  • dst MAC: ff:ff:ff:ff:ff:ff
  • src IP: 0.0.0.0
  • dst IP: 255.255.255.255
  • UDP src port: 68 (DHCP client)
  • UDP dst port: 67 (DHCP server)
  • Содержимое: «я ищу DHCP, мой MAC такой-то, хочу IP»

Offer (broadcast обычно):

  • Сервер: «вот тебе IP 192.168.1.42, маска /24, gateway 192.168.1.1, DNS 8.8.8.8, lease 3600 сек»

Request (broadcast):

  • Клиент: «принимаю предложение от сервера X, IP 192.168.1.42»

Acknowledge:

  • Сервер: «подтверждаю, IP твой»

Опционально может быть NAK — сервер отказывает (например, IP уже зарезервирован за другим).

Весь обмен — 4 пакета, обычно занимает менее 100 мс.


Захват DHCP-обмена tcpdump’ом

Чтобы увидеть DORA на практике:

# В одном терминале слушаем DHCP-трафик:
sudo tcpdump -i any -n 'udp port 67 or udp port 68'

# В другом терминале симулируем -- освобождаем и берём IP заново:
sudo dhclient -r eth0     # release
sudo dhclient eth0        # renew

# Видим что-то вроде:
# 12:34:56.001 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from a4:83:e7:1a:bb:cc, length 300
# 12:34:56.005 IP 192.168.1.1.67 > 192.168.1.42.68: BOOTP/DHCP, Reply, length 300
# 12:34:56.006 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from a4:83:e7:1a:bb:cc, length 300
# 12:34:56.010 IP 192.168.1.1.67 > 192.168.1.42.68: BOOTP/DHCP, Reply, length 300

С опцией -v или -vv tcpdump покажет DHCP-options:

sudo tcpdump -i any -v 'udp port 67 or udp port 68'
# ...
#     DHCP-Message Option 53, length 1: Discover
#     Client-ID Option 61, length 7: ether a4:83:e7:1a:bb:cc
#     Parameter-Request Option 55, length 13:
#       Subnet-Mask, BR, Time-Zone, Default-Gateway, Domain-Name
#       Domain-Name-Server, Hostname, ...

Каждая «Option NN» — это структурированный DHCP-параметр.


DHCP options — больше чем IP

DHCP передаёт не только IP, но кучу опций для настройки клиента. Самые важные:

ОпцияЧтоПример
1Subnet mask255.255.255.0
3Default gateway192.168.1.1
6DNS servers8.8.8.8, 1.1.1.1
12Hostnamelaptop-john
15Domain namecorp.example.com
26MTU1500
28Broadcast address192.168.1.255
42NTP servers10.0.0.5
50Requested IP(клиент просит конкретный IP)
51Lease time3600 (секунды)
53Message type1=Discover, 2=Offer, 3=Request, 5=ACK, 6=NAK
54DHCP server ID192.168.1.1
55Parameter request list(клиент перечисляет, что хочет узнать)
60Vendor class(типа Microsoft Windows 11)
61Client ID(обычно MAC)
66/67TFTP server / boot file(PXE-загрузка)
119Domain search listcorp.example.com,internal.example.com

Особенно полезны:

  • Опция 6 (DNS) — DHCP-сервер говорит, какой DNS использовать. Если ваш роутер выдаёт 192.168.1.1 (себя) — значит он работает DNS-прокси.
  • Опция 51 (lease time) — сколько IP «ваш». После истечения нужно продлевать.
  • Опция 66/67 (PXE) — для удалённой загрузки ОС из сети. Дата-центры, корпоративные сети.

Lease — IP не навсегда

DHCP даёт IP в аренду (lease) на определённое время. По умолчанию обычно 1 час - 24 часа, в корпоративной сети могут быть дни.

Что происходит во время lease:

  1. T0 (получение). Клиент получает IP, lease = 1 час. Хост запоминает T0 и lease.
  2. T1 (50% lease, 30 мин). Клиент шлёт DHCPREQUEST напрямую серверу: «продли мой IP». Если сервер ответил ACK — lease обновляется, новый T0.
  3. T2 (87.5% lease, 52.5 мин). Если сервер не ответил на REQUEST — клиент шлёт REQUEST broadcast’ом (вдруг сервер сменился).
  4. Lease expire (60 мин). Если за всё это время никто не подтвердил — клиент должен отпустить IP и начать DORA с нуля.
DHCP lease lifecycle -- продление каждые 50%
T0: получили IPLease = 3600 сек. Клиент знает: T0 = now, expire = now + 3600
50%
T1: renewЛизинг прошёл 50% (1800 сек). Клиент шлёт REQEUST серверу, который выдал IP. Если ACK -- lease обновлён
T2: rebindПрошло 87.5%. Сервер не ответил на T1. Клиент шлёт REQUEST broadcast'ом -- любой сервер может ответить
ExpireЕсли до 100% никто не подтвердил -- IP отпускается, клиент начинает DORA заново

В обычной жизни вы не замечаете этих циклов — они происходят на фоне, прозрачно. Но если DHCP-сервер сломался — через ~30-60 мин ваш IP начнёт «потеряться».

# Посмотреть текущий lease:
cat /var/lib/dhcp/dhclient.leases    # Debian/Ubuntu
cat /var/lib/dhcpd/dhcpd.leases      # сервер
sudo nmcli connection show eth0 | grep -i dhcp4   # NetworkManager

# Освободить IP (release):
sudo dhclient -r eth0

# Запросить новый (renew):
sudo dhclient eth0

Откуда берётся DHCP-сервер

В разных средах:

1. Дома. DHCP-сервер — ваш домашний роутер. У него прописана подсеть (192.168.1.0/24), пул для динамической раздачи (192.168.1.100-200), параметры (gateway = 192.168.1.1, DNS = 192.168.1.1 или провайдерский).

2. Офис / маленькая компания. Тот же роутер или отдельная Linux/Windows-машина с isc-dhcp-server / DHCP-роль в Windows Server.

3. Корпоративная сеть. Несколько DHCP-серверов с failover. Часто Windows Server, Microsoft DHCP. Серверы могут быть в разных подсетях — тогда нужен DHCP relay на роутере (потому что DHCP broadcast не пересекает роутер сам по себе).

4. AWS VPC. DHCP-роль играет служба VPC — автоматически выдаёт IP инстансам из CIDR подсети. Параметры (DNS, gateway) настраиваются через DHCP option set.

5. Kubernetes. Поды получают IP не через DHCP, а через CNI plugin (Calico, Cilium, Flannel). Концепция похожая, но протокол свой.


Что бывает, когда DHCP ломается

1. Нет DHCP-сервера. Клиент шлёт DISCOVER, никто не отвечает. Через несколько ретраев он назначает себе APIPA-адрес 169.254.X.X (link-local). Локалка работает между такими хостами, но интернета нет.

2. Два DHCP-сервера. Оба отвечают OFFER, клиент принимает первый пришедший. Половина устройств получает IP от одного, половина — от другого. Если параметры разные — хаос. Чаще всего проблема в офисе, когда кто-то воткнул свой домашний роутер в офисную сеть.

3. Пул исчерпался. Сервер не может выдать — отказывает или молчит. Симптом: новые устройства не получают IP, старые работают. Решение — расширить пул или уменьшить lease (чтобы IP быстрее возвращались).

4. DHCP rogue. Атакующий поднимает фейковый DHCP-сервер, отвечает раньше реального. Клиенты получают gateway атакующего — весь трафик проходит через атакующего (MITM). Защита — DHCP snooping на свитчах (свитч разрешает DHCP-ответы только с известных портов).

5. Конфликт IP. Сервер выдал IP, который кто-то уже занял статически. Атака на сетевой стек: оба устройства будут думать что IP их. Симптомы хаотичные — пакеты идут то к одному, то к другому. Сервер должен делать ping/ARP перед выдачей, но не всегда.

# Симптом DHCP-проблемы:
ip addr show eth0
# inet 169.254.42.18/16 ...  -- получили APIPA, DHCP не сработал

# Или просто пусто:
# eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
# (нет inet вообще -- интерфейс up, но IP не получен)

# Принудительно попробовать ещё раз:
sudo dhclient -v eth0
# В verbose режиме увидите весь DORA-обмен и сможете понять, на каком шаге сломалось

DHCPv6 — то же самое, но для IPv6

В IPv6 есть DHCPv6 — аналогичный протокол. Но он чаще используется только для дополнительных параметров (DNS, NTP), а IP получается через SLAAC.

Stateless DHCPv6. Хост получает IP через SLAAC, а DHCPv6 даёт только опции (DNS, search domain).

Stateful DHCPv6. Полноценный аналог DHCPv4 — сервер выдаёт IP и опции.

Какой режим использовать — решает роутер через флаги в Router Advertisement.


Реальная диагностика DHCP-проблем

# 1. Понять, по какому протоколу IP получен:
nmcli connection show "Wired connection 1" | grep DHCP4
# IP4.DHCP4.OPTION[1]: requested_subnet_mask = 1
# DHCP4.OPTION[3]: dhcp_lease_time = 3600
# DHCP4.OPTION[5]: domain_name_servers = 8.8.8.8 1.1.1.1
# DHCP4.OPTION[7]: dhcp_server_identifier = 192.168.1.1

# 2. Посмотреть всю историю lease:
journalctl -u NetworkManager | grep -i dhcp | tail -20
# или
journalctl -u systemd-networkd | grep -i dhcp | tail -20

# 3. Захватить DHCP-обмен:
sudo tcpdump -i eth0 -n 'udp port 67 or udp port 68'
# Затем в другом окне: sudo dhclient -r eth0 && sudo dhclient eth0

# 4. Проверить, не два ли DHCP в сети:
# Самый простой способ -- освободить IP, запросить новый, посмотреть, сколько OFFER пришло:
sudo dhclient -r eth0
sudo tcpdump -c 5 -n -i eth0 'udp port 67' &  # слушаем 5 пакетов
sudo dhclient -v eth0
# Если в выводе видно несколько OFFER с разных IP -- два DHCP

# 5. Узнать, какой DHCP-сервер выдал IP:
cat /var/lib/dhcp/dhclient.leases | grep -E '(fixed-address|dhcp-server-identifier)'
# fixed-address 192.168.1.42;
# option dhcp-server-identifier 192.168.1.1;

Попробуй сам

# 1. Посмотреть текущий IP и параметры DHCP:
ip addr show
nmcli connection show "Wi-Fi" | grep DHCP4    # или ваше имя соединения

# 2. Освободить и запросить заново:
sudo dhclient -r eth0
sudo dhclient -v eth0  # verbose -- видно весь обмен

# 3. Посмотреть DHCP-обмен:
sudo tcpdump -i any -n -v 'udp port 67 or udp port 68' | head -50

# 4. Если у вас Docker и есть rights -- запустить мини-DHCP-сервер в виртуальной сети:
# (это сложнее, требует сетевой настройки)

# 5. Глянуть Wireshark на DHCP трафик:
# Открыть Wireshark, выбрать интерфейс, filter: bootp.option.type
# Откатить и обновить адрес в системе
# Увидите красивый разбор DORA с каждой опцией

# 6. Узнать, какой DNS вам выдал DHCP:
cat /etc/resolv.conf
# # Generated by NetworkManager
# nameserver 192.168.1.1
# или
nmcli dev show | grep DNS

# 7. Сколько lease осталось:
cat /var/lib/dhcp/dhclient.leases | tail -20
# expire 2 2026-05-18 13:30:00;  -- до этого времени IP ваш

Особенно ценен пункт 2 с -v — вы увидите полный DORA в реальном времени, с каждым шагом обмена.


Проверка знанийKnowledge check
В офисе вдруг начались проблемы: половина сотрудников получает intern IP (10.0.0.X), половина -- какой-то другой (192.168.50.X). Сеть та же физически, до этого все работали с 10.0.0.X. Что произошло и как диагностировать?
ОтветAnswer
Классический симптом двух DHCP-серверов в одном broadcast domain. Кто-то подключил в офисную сеть второй DHCP-сервер -- обычно это случается так: сотрудник принёс из дома роутер (хотел расширить Wi-Fi у себя в кабинете), воткнул в офисную розетку, не отключив DHCP-сервер на нём. Теперь когда новый хост шлёт DHCP DISCOVER (broadcast), оба сервера отвечают OFFER. Клиент принимает первый пришедший -- иногда из 10.0/8, иногда из 192.168.50/24. Хосты, получившие новый IP, не могут ходить в корпоративные ресурсы (другая подсеть, другой gateway). Диагностика: 1) Сделать tcpdump на DHCP-трафик и увидеть несколько OFFER в ответ на один DISCOVER: 'sudo tcpdump -i eth0 -n udp port 67 or udp port 68'. 2) Посмотреть src IP в OFFER-ах -- увидите два разных DHCP-сервера. 3) ARP-сканом найти, по каким MAC сидят эти IP. 4) Можно nmap'ом или arp-scan'ом найти все устройства в локалке и найти rogue. Решение долгосрочное: на managed-свитчах включить DHCP Snooping -- свитч разрешает DHCP-ответы только с trusted-портов (порт корпоративного DHCP-сервера), с остальных портов OFFER/ACK дропаются. Это полностью защищает от rogue DHCP.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Какова последовательность 4 шагов DHCP DORA?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5