Протокол DHCP
Alexandr SemenenkoОписание протокола
DHCP (Dynamic Host Configuration Protocol) — протокол, который служит для назначения IP-адресов сетевым устройствам.
Этот протокол находится на прикладном уровне моделях OSI и TCP/IP, а в качестве транспортного протокола используется — UDP.
Это клиент-серверный протокол. При этом клиент использует UDP порт 68, а сервер слушает UDP порт 67. В процессе обмена информацией клиент получает от сервера IP адрес, а также может запросить некоторую другую информацию для настройки сети.
Документация (rfc-2131) - https://www.rfc-editor.org/rfc/rfc213.
Алгоритм работы протокола DHCP
Протокол DHCP работает по очень простому алгоритму, который называется DORA. DORA — это аббревиатура состоящая из 4 первых букв сообщений, которые передаются по сети при получении сетевых настроек клиентом от DHCP сервера.

DHCP Discover. Вначале клиент не имеет своего IP-адреса. Поэтому он с IP-адреса 0.0.0.0 отправляет широковещательный (broadcast) запрос для поиска DHCP сервера. Отправляет он этот запрос на IP-адрес — 255.255.255.255 и на MAC-адрес — ff:ff:ff:ff:ff:ff. В запросе клиент сообщает информацию о себе, например: свой идентификатор, имя хоста и другую информацию. Также в запросе он указывает какую информацию, помимо IP-адреса он хочет получить от сервера. Например, маску подсети, адрес шлюза, адреса DNS-серверов, статические маршруты и другое. Если обобщить, то в этом сообщении клиент ищет DHCP сервер в локальной сети, отправляет информацию о себе и запрашивает сетевые настройки у сервера. Это сообщение получают все участники локальной сети, но отвечают на него только DHCP сервера.
DHCP Offer. DHCP сервер отвечает клиенту предложением занять определённый IP-адрес. При этом он может ответить широковещательно (если это ты запрашивал IP адрес, то можешь взять этот). Или может напрямую ответить клиенту, ведь он уже знает его MAC-адрес. Кроме IP-адреса и других запрашиваемых сетевых настроек, сервер сообщает клиенту время, на которое он может занять этот IP-адрес. При этом сервер резервирует этот IP-адрес за этим клиентом на некоторое время. Также, при настройке сервера, администратор указывает ему, какие настройки он может выдавать. Чтобы клиент получил запрашиваемую настройку, клиент должен её запросить и сервер должен быть настроен на отправку этой опции. Если сервер не настроен на выдачу определённой опции, которую запросил клиент, то ошибок не произойдет, просто клиент не получит именно эту опцию, а остальные опции он получит.
DHCP Request. Клиент получивший DHCP Offer, в ответ отправляет DHCP Request. Это сообщение отправляется широковещательно, чтобы сообщить другим DHCP серверам, что клиент начал работать с определённым сервером. Этим сообщением клиент уведомляет DHCP сервер, что принял от него IP-адрес и другие опции.
DHCP Ack. DHCP сервер получив DHCP Request, отправляет подтверждение и уведомляет клиента на сколько ему выдали IP-адрес и другие опции. Это сообщение также может быть либо прямым (Unicast), либо широковещательным (Broadcast), в зависимости от сервера.
Опции DHCP
Выше я писал, что сервер выдаёт клиенту IP-адрес и другие настройки, которые запросил клиент. Такие, другие настройки, запрашиваются в качестве DHCP опций. Клиент их запрашивает, а сервер, если может, их отправляет.
При этом разные DHCP клиенты могут запрашивать различные опции, например Linux и Windows запрашивают разный набор опций DHCP.
Для точного определения, какие опции запрашивает DHCP клиент можно использовать wireshark или tcpdump.
Вот некоторые из опций:
- 1 — Маска подсети;
- 3 — Шлюз по умолчанию (или список шлюзов);
- 4 — Список серверов времени (NTP серверов);
- 6 — Список DNS серверов;
- 15 — Имя домена;
- 33 — Список статических маршрутов;
- 119 — Поисковый домен.
Если клиент не получает какую-то сетевую настройку, то нужно проверить:
- во-первых, запрашивает ли клиент эту опцию у сервера;
- во-вторых, настроен ли сервер на выдачу информации по этой опции.
Чем отличаются DHCP Option 015 и DHCP Option 119
У хостов в сети есть:
- плоские имена (короткие), например pc-01.
- полные доменные имена (fqdn), например pc-01.test.com.
Чтобы обратиться к компьютеру по сети, мы должны преобразовать его имя в ip-адрес.
Задачу разрешения имен в IP адреса призван решать DNS-сервер, но он не работает с плоскими именами. Поэтому нужно научить DNS-клиент правильно дополнять плоские имена до FQDN и для этого предназначена опция DHCP 015 (DNS Domain Name), которая задает имя домена используемое при разрешении имен на DNS-сервере.
Если мы передали в этой опции домен test.com, то любое плоское имя будет дополнено:
pc-01 => pc-01.test.com.
После чего запрошенное имя будет легко разрешено обслуживающим зону DNS-сервером.
Но DHCP 015 не предусматривает передачу нескольких DNS суффиксов. Поэтому была введена опция DHCP 119 (Domain Search List), которая содержит список доменов используемых для разрешения имен. Это может понадобится если test.com это ваш домен, а test2.com это домен филиала.
С помощью DHCP 119 мы можем передать в нем как test.com, так и test2.com. DNS-клиент будет выполнять поиск в порядке следования доменов в списке, поэтому ваш домен указывайте первым. И условный хост с именем test-pc будет разрешен вначале так: test-pc.test.com., затем так: test-pc.test2.com.
Желательно не использовать эти опции одновременно. Если домен поиска один то используйте 015, а если несколько то 119.
Несколько DHCP серверов в локальной сети
Если в одном широковещательном домене появляется несколько DHCP серверов, то клиент примет настройки от того DHCP сервера, который ему первее ответит. При этом, разные DHCP сервера могут выдавать разные сетевые настройки и IP-адреса из разных подсетей. Получится ситуация, что одни клиенты получат одни сетевые настройки, а другие — другие сетевые настройки. При этом локальная сеть ломается и сетевому администратору нужно понять — почему.
Представьте ситуацию, вы администрируете локальную сеть, у вас в сети есть 1 настроенный DHCP сервер и всё работает хорошо. Затем кто-то приносит из дома роутеры (которые тоже являются DHCP серверами) и подключает их к общему коммутатору. Получается следующая картина:

При этом, каждый компьютер может получить сетевые настройки от любого DHCP сервера. Эти настройки не согласованы друг с другом. Клиенты перестают видеть друг друга в сети. Некоторые клиенты теряют доступ к интернету. В общем — проблема за проблемой.
Чтобы избежать подобной ситуации, на современных (умных) коммутаторах можно включить опцию — DHCP snooping. А затем указать доверенные порты, к которым могут быть подключены DHCP сервера. Все остальные порты остаются недоверенными и отбрасывают сообщения DHCP offer и DHCP Ack. При этом в сети остаётся работать 1 DHCP сервер (ведь мы его подключили к доверенному порту) и клиенты получают согласованные сетевые настройки.

На коммутаторе включена опция DHCP snooping и только DHCP Сервер 1 включен в доверенный порт.