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.
Детали:
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, но кучу опций для настройки клиента. Самые важные:
| Опция | Что | Пример |
|---|---|---|
| 1 | Subnet mask | 255.255.255.0 |
| 3 | Default gateway | 192.168.1.1 |
| 6 | DNS servers | 8.8.8.8, 1.1.1.1 |
| 12 | Hostname | laptop-john |
| 15 | Domain name | corp.example.com |
| 26 | MTU | 1500 |
| 28 | Broadcast address | 192.168.1.255 |
| 42 | NTP servers | 10.0.0.5 |
| 50 | Requested IP | (клиент просит конкретный IP) |
| 51 | Lease time | 3600 (секунды) |
| 53 | Message type | 1=Discover, 2=Offer, 3=Request, 5=ACK, 6=NAK |
| 54 | DHCP server ID | 192.168.1.1 |
| 55 | Parameter request list | (клиент перечисляет, что хочет узнать) |
| 60 | Vendor class | (типа Microsoft Windows 11) |
| 61 | Client ID | (обычно MAC) |
| 66/67 | TFTP server / boot file | (PXE-загрузка) |
| 119 | Domain search list | corp.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:
- T0 (получение). Клиент получает IP, lease = 1 час. Хост запоминает T0 и lease.
- T1 (50% lease, 30 мин). Клиент шлёт DHCPREQUEST напрямую серверу: «продли мой IP». Если сервер ответил ACK — lease обновляется, новый T0.
- T2 (87.5% lease, 52.5 мин). Если сервер не ответил на REQUEST — клиент шлёт REQUEST broadcast’ом (вдруг сервер сменился).
- Lease expire (60 мин). Если за всё это время никто не подтвердил — клиент должен отпустить 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 в реальном времени, с каждым шагом обмена.