Протокол DHCP: автоматическая выдача сетевых параметров, процедура DORA, таймеры аренды, DHCP Relay и защита через DHCP Snooping.
Какие параметры, помимо IP-адреса, может выдать DHCP-сервер?
Что произойдёт по истечении таймера T1 (T/2 от срока аренды)?
Как DHCP Snooping защищает от ложных DHCP-серверов?
Какую проблему решает DHCP Relay?
Из каких четырёх шагов состоит процедура получения адреса по DHCP (DORA)?
Почему ложный DHCP-сервер в сети опасен?
Протокол DHCP: процедура DORA, таймеры аренды и Relay — одна тема в двух курсах
DHCPv6 — версия DHCP для IPv6 с режимами Stateful/Stateless и Prefix Delegation
DHCP в контексте коммутируемых сетей: DHCP Relay и особенности DHCPv6 на коммутаторах
Следующий протокол, который мы рассмотрим, -- это DHCP, Dynamic Host Configuration Protocol. Ещё один служебный протокол, необходимый в сетях Ethernet для того, чтобы поверх них нормально работал протокол IP. По названию понятно: протокол, который помогает динамически конфигурировать хосты.
DHCP умеет раздавать практически всё, что необходимо в современном мире:
Понятное дело, что такие опции нужно, чтобы кто-то умел читать. Выдать опцию вы можете, но будет ли конкретный софт её поддерживать -- вопрос открытый. Тем не менее, в протоколе такая возможность есть.
Если у вас есть интерфейс, похожий на Ethernet, и вроде бы в него можно отправлять IP-пакеты по полтора килобайта. Но внутри коммутируемой сети есть устройство, которое добавляет дополнительные заголовки. И после этих заголовков пакет проходит через ещё один коммутатор, который тоже пропускает только полтора килобайта. Поэтому вы не должны отправлять IP-пакеты больше, чем, допустим, 1492 байта. Чтобы сказать всем конечным узлам одновременно "не отправляйте IP-пакеты больше 1492 байт", вам поможет опция указания MTU интерфейса.
Всё, что DHCP делает, можно настроить вручную. Но чем больше узлов и параметров, тем больше вероятность ошибки: где-то ошибиться, где-то недоделать, где-то прокосячить. Ручная настройка большого количества параметров обычно неэффективна.
Основная функция DHCP -- это управление IP-адресами. Без DHCP вам потребуется система управления адресами: хотя бы записывать в тетрадочку, кому какие адреса вы дали. Иначе велика вероятность конфликта -- когда один и тот же адрес выдан двум узлам.
Вам нужно будет:
Самый плохой вариант -- не вести никакой системы учёта вообще. Назначать IP-адреса "от балды" и пытаться угадать: свободен ли 192.168.0.100? Нет? А 200? Пингуется, значит, тоже занят. А 232? Наверно, свободен. Такой подход работает, когда узлов 5--10, но перестаёт работать в корпоративной сети.
IPAM (IP Address Management) -- системы учёта адресов. Начинаются обычно с Excel, но дальше заканчиваются специализированным продуктом. В Windows Server 2012 появилась штатная роль IPAM, которая умеет собирать информацию с DHCP-сервера, DNS-сервера и других источников.
Но все эти системы ведутся руками и достаточно дороги в обращении -- не потому что за них нужно платить, а потому что бардак ведёт к трате времени на разбирательства.
Было бы здорово иметь систему, которая сама, без вашего участия, заведует всеми IP-адресами: выдаёт, когда нужно, и забирает, когда не нужно. Протокол DHCP как раз решает эту задачу.
DHCP является логическим развитием протокола BootP и обратно совместим с ним. Формат сообщения DHCP -- это фактически формат BootP. DHCP-сообщения -- это BootP-сообщения, просто по-другому трактуемые. Во многих случаях вы передаёте лишние данные именно для обеспечения обратной совместимости.
BootP, в свою очередь, развился как логическое продолжение протокола RARP (Reverse ARP). BootP и RARP не совместимы между собой -- они решали одну и ту же задачу (получить IP из MAC-адреса), но BootP использовал принципиально другие сообщения.
DHCP оброс такой штукой, как опции -- и именно они позволили DHCP "взлететь".
Все адреса в DHCP выдаются на время, то есть даются в аренду (lease). Клиент теоретически должен вернуть адрес через определённое время. Но то, что адреса выдаются в аренду, не означает, что они всегда будут разные.
Есть три разных механизма, как DHCP может выдавать адреса.
Самый известный и популярный механизм. Есть пул свободных IP-адресов. Клиент приходит, просит адрес -- сервер выдаёт свободный из пула. Когда адрес больше не нужен, сервер забирает его обратно. При этом совершенно не факт, что адрес будет одинаковым: сегодня вам дали один, завтра -- другой.
Администратор привязывает конкретный MAC-адрес к конкретному IP-адресу. Например, принт-сервер с MAC 00:01:02:03:04:05 всегда получает один и тот же IP. Этот адрес больше никому не выдаётся.
Когда приходит новый незнакомый клиент, ему выдаётся IP из пула, после чего он становится "знакомым" -- и привязка запоминается в базе.
Клиент не знает, каким механизмом ему выбран адрес. Он просто говорит "дай адрес", а сервер выдаёт. Независимо от механизма, адрес всегда выдаётся на определённое время.
DHCP использует вложение в UDP, который вкладывается в IP.
Специальные IP-адреса:
| Адрес | Назначение |
|---|---|
0.0.0.0 |
Адрес источника, когда клиент ещё не знает свой адрес |
255.255.255.255 |
Local broadcast -- широковещательная рассылка в пределах канала |
DHCP broadcast, как и ARP, не проходит через маршрутизаторы. Но в отличие от ARP, DHCP вкладывается в IP, поэтому теоретически можно заставить роутеры перекладывать пакеты из одной канальной среды в другую (через DHCP Relay).
Основные сообщения DHCP:
| Сообщение | Направление | Описание |
|---|---|---|
| DHCP Discover | Клиент -> Broadcast | Клиент ищет серверы: "Дайте адрес!" |
| DHCP Offer | Сервер -> Broadcast | Сервер предлагает адрес |
| DHCP Request | Клиент -> Broadcast | Клиент выбирает предложение |
| DHCP ACK | Сервер -> Broadcast | Сервер подтверждает аренду |
Все четыре сообщения посылаются broadcast:
В Discover клиент может указать пожелания -- например, адрес, который был у него в прошлый раз.
Вместе с ACK идёт финальное согласование опций: маска подсети, NTP-серверы и всё остальное, что клиент и сервер договорились использовать.
Все адреса передаются в аренду -- даже статические (зарезервированные). Время аренды обозначается буквой T.
Если сервер не отвечает на T1, клиент продолжает попытки каждый раз после половины оставшегося срока:
Клиент может послать DHCP Release, чтобы сервер знал -- адрес больше не нужен и его можно выдать другому.
Сервер тоже может принудительно отобрать адрес: посылает DHCP Force Renew, клиент отвечает Request, а сервер отправляет DHCP NAK. Но на практике Force Renew в большинстве реализаций отсутствует.
Формат пакета -- наследие BootP, содержит много полей:
| Поле | Размер | Описание |
|---|---|---|
| Op | 1 байт | Тип операции: 1 -- BootRequest, 2 -- BootReply |
| HType | 1 байт | Тип аппаратного адреса (1 = Ethernet) |
| HLen | 1 байт | Длина аппаратного адреса (6 для MAC) |
| Hops | 1 байт | Количество relay-агентов |
| XID | 4 байта | Идентификатор транзакции (случайное число) |
| Secs | 2 байта | Секунды с начала получения адреса (обычно 0) |
| Flags | 2 байта | Флаги (в т.ч. broadcast) |
| CIAddr | 4 байта | Client IP -- заполняется при продлении аренды |
| YIAddr | 4 байта | Your IP -- адрес, предлагаемый сервером |
| SIAddr | 4 байта | Server IP |
| GIAddr | 4 байта | Gateway/Relay Agent IP |
| CHAddr | 16 байт | Аппаратный адрес клиента (MAC + padding) |
| SName | 64 байта | Имя сервера (null-terminated строка) |
| File | 128 байт | Имя файла для удалённой загрузки |
| Options | переменная | Опции, начинаются с Magic Cookie |
Поле CHAddr -- 16-байтовое для совместимости с BootP. MAC-адрес занимает 6 байт, остальные 10 забиваются нулями. Для определения реальной длины используется поле HLen.
Поле опций всегда начинается с Magic Cookie -- числа 0x63825363. Любой DHCP-пакет с опциями начинается с этого значения.
Размер поля опций ограничен размером IP-пакета. Для совместимости со старыми PPP-соединениями (MTU 576 байт) на опции приходится порядка 340 байт. Обычно этого достаточно.
| Код | Название | Описание |
|---|---|---|
| 1 | Subnet Mask | Маска подсети, 4 байта |
| 3 | Router | Шлюз по умолчанию. Можно указать несколько (кратно 4 байтам), первый -- наивысший приоритет |
| 6 | DNS Servers | Адреса DNS-серверов, кратно 4 байтам |
| 12 | Hostname | Имя хоста клиента (null-terminated строка) |
| 23 | Default TTL | TTL по умолчанию для IP-пакетов |
| 26 | Interface MTU | MTU интерфейса |
| 33 | Static Routes | Статические маршруты (классовые, устаревшая; в бесклассовом мире -- маршрут на /32 хост + шлюз, 8 байт) |
| 35 | ARP Cache Timeout | Время жизни кэша ARP |
| 50 | Requested IP Address | Запрашиваемый клиентом адрес |
| 51 | Lease Time | Время аренды (T) |
| 55 | Parameter Request List | Список опций, которые клиент поддерживает и хочет получить |
| 58 | Renewal Time (T1) | Время до первой попытки продления |
| 59 | Rebinding Time (T2) | Время до начала broadcast-продления |
| 61 | Client Identifier | Идентификатор клиента (FQDN, имя машины и т.д.) |
| 66 | TFTP Server Name | DNS-имя TFTP-сервера для загрузки |
| 121 | Classless Static Routes | Бесклассовые маршруты (замена опции 33) |
| 150 | TFTP Server Address | IP-адрес TFTP-сервера для загрузки |
| 255 | End | Конец списка опций |
Особенно полезны для IP-телефонов, которые загружаются с TFTP-сервера. Вы указываете адрес Call Manager, и телефоны тянут с него конфигурацию и прошивку.
Имя файла для загрузки в этих опциях не указывается -- клиент (телефон) сам знает, какой файл ему нужен.
Опция 82 добавляется агентом ретрансляции (relay agent) и содержит:
Особенно полезна для провайдеров. Пример: в жилом доме стоит коммутатор, каждый порт -- отдельная квартира. Клиент кричит "дайте адрес", коммутатор запоминает номер порта, оборачивает запрос в unicast и отправляет на центральный DHCP-сервер. Сервер проверяет по биллингу: если Вася Петечкин не заплатил -- выдаёт ему адрес с маршрутом только на страницу "заплати деньги".
В 2001 году была предложена опция DHCP Authentication, которая не позволяла неавторизованным серверам выдавать адреса. Но опция не взлетела: она была сложной в реализации и требовала ручной настройки на клиентах. Смысл в автоматическом протоколе, который требует ручной настройки, -- никакой.
Если вы штатно размещаете два сервера, есть два подхода:
Непересекающиеся диапазоны. Левый сервер раздаёт первую половину адресов, правый -- вторую. Можно подшаманить задержкой: один сервер отвечает сразу, другой -- через 0.1 секунды.
Синхронизация базы. Оба сервера раздают один диапазон, но синхронизируют состояние между собой. В Windows Server 2012 появилась возможность настроить два сервера с общей базой. До этого требовался полноценный кластер с общей дисковой полкой -- дорого и неудобно.
Типичная ситуация: сотрудник приносит из дома домашний роутер, подключает LAN-порт к корпоративной сети -- и этот роутер начинает раздавать адреса из своего пула вместо правильных корпоративных.
Механизма на уровне протокола для защиты от этого нет. Варианты:
Атакующий посылает множество DHCP-запросов с разными идентификаторами, исчерпывая пул адресов. Защита -- коммутатор отслеживает количество DHCP-запросов с порта. Если больше определённого порога (например, 10 пакетов в секунду) -- блокирует запросы или порт целиком.
Сотрудник может уйти в отпуск на месяц. Если срок аренды истечёт за это время, его адрес может быть выдан другому. Рекомендация: срок аренды больше максимального периода неактивности (например, 2 месяца).
Также важно, чтобы DHCP-сервер не забывал свою базу при перезагрузке. Windows Server хранит базу в MDB-файле и не теряет данные. Если же сервер -- это Cisco-роутер, после сброса питания он забудет все выданные адреса.
Для машин, которым обязательно нужен постоянный адрес, лучше использовать ручное размещение (резервирование по MAC или клиентскому идентификатору).
В кафе, переговорках, публичных зонах люди приходят на 15--60 минут. Рекомендация: срок аренды 15 минут. Клиент несколько раз продлит аренду и ничего не заметит, а после ухода адрес быстро вернётся в пул.
Когда клиент и сервер находятся в разных канальных средах, используется DHCP Relay (агент ретрансляции):
Типичная ситуация для небольших компаний и домашних сетей -- роутер одновременно является DHCP-сервером. Логика: без роутера сеть не работает, поэтому нет смысла разделять точки отказа. Домашний D-Link DIR-300 -- он же и DHCP-сервер.
Технически можно выстроить цепочку из нескольких relay, но на практике в этом нет необходимости -- одного посредника, который из broadcast делает unicast, всегда достаточно.
Клиент отправляет запрос из-под порта 68 на порт 67:
0x01B7)0.0.0.0 (адреса ещё нет)0.0.0.00x63825363Перед отправкой Offer сервер проверяет: свободен ли адрес на самом деле? Он посылает ARP-запрос с адресом, который собирается предложить. Если ответа нет -- адрес действительно свободен.
Сервер предлагает адрес:
10.0.0.5)255.255.255.0, статические маршруты (опция 33), и другие запрошенныеСервер не обязан отдавать все запрошенные опции. Если опции у него нет -- он молча её игнорирует.
Клиент подтверждает выбор: указывает идентификатор сервера (10.0.0.1) и запрашиваемый адрес (10.0.0.5). Сервер отвечает ACK -- адрес зафиксирован.
После получения ACK клиент на всякий случай проверяет адрес -- посылает Gratuitous ARP с полученным IP. Если никто не возражает, клиент начинает использовать адрес. Gratuitous ARP отправляется дважды и заодно обновляет ARP-кэш у всех остальных узлов.
Затем клиент посылает обычный ARP-запрос: "кто такой 10.0.0.1?" -- чтобы заполнить свой ARP-кэш записью о сервере (ведь всё предыдущее взаимодействие шло через broadcast).
DHCP и ARP -- два очень полезных протокола, которые позволяют нормально существовать в сети без ручной настройки всех узлов. Без них количество необходимых настроек растёт квадратично: для 100 узлов нужно было бы прописать порядка 10 000 связей вручную. DHCP + ARP автоматизируют всё это настолько, что мы даже не замечаем, как они работают.