Подавление DHCP серверов
Сегодня на просторах интернета наткнулся на весьма интересную программу. Наверняка, если вы пользовались сетью, хоть раз возникала ситуации что при настройке сетевого соединения по DHCP, в сети ненароком появлялись "левые" DHCP-сервера и сбивали вам все настроки. Обычно такое случается, если кто-то покупает роутер и включает его без настройки, по умолчанию в них включен DCHP-сервер.
Кроме того, данная программа является хорошим диагностическим инструментом для проверки работоспособности 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 адрес (если в параметрах не задано иное поведение), и отправляет его в интерфейс.
После чего переходит к ожиданию ответа (DHCPOFFER) сервера. Если получен ответ с предложением аренды IP адреса, то в интерфейс отправляется следующий DHCP запрос (DHCPREQUEST) на который сервер отвечает DHCPACK-пакетом подтверждающим возможность использования данного IP адреса клиентом. На этом операция получения аренды на предложенный сервером IP адрес завершена. Программа изменяет MAC адрес источника и вновь посылает DHCPDISCOVER, после чего все вышеуказанные операции по получению аренды нового IP адреса повторяются. Стоит обрать внимание что программа изменяет не только MAC адрес клиента в DHCP сообщении, но и MAC адрес в заголовке Ethernet-фрейма. Данная возможность максимально приближает работу программы к работе реального DHCP клиента (а так же позволяет обойти DHCP snooping). Цикл получения IP адресов с сервера завершается, когда получено заданное параметром максимальное число IP адресов, либо в случае исчерпания динамического пула сервера. Во втором случае можно праздновать победу. В первом, если всё же имеется цель подавить данный DHCP сервер, то есть смысл указать иное значение параметра максимального числа арендуемых адресов. Описание опций программы В FreeBSD программу необходимо запускать с правами пользователя root (исключая случай просмотра справки -h), если вы об этом забудете, то она непременно об этом напомнит.
Подробное описание: * -h - показывает help-сообщение. * -D - просмотр списка имён и индексов сетевых интерфейсов. * -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 сервера dhcdrop сообщает полученную от сервера информацию о предлагаемом IP адресе и спрашивает о необходимости подавления данного сервера. Получив отрицательный ответ - продолжает поиск серверов в сети игнорируя обнаруженный ранее сервер. В случае получения утвердительного ответа - начинает процесс подавления сервера указанным выше способом. Режим автоматического подавления всех серверов кроме легитимного. В случае если мы знаем (а обычно мы знаем) MAC адрес легального DHCP сервера в нашей сети, операцию подавления ложных серверов можно упростить:
В подобном варианте использования dhcdrop подавляет любой сервер кроме указанного опцией -l сервера, не задавая дополнительных вопросов (благодаря использованию опции -y). Тестовый режим. Тестовый режим (-t) удобно использовать для выполнения программы из скриптов, в автоматизированном режиме. Ниже приведён пример простейшего скрипта:
В строке 4 выполняется запуск dhcdrop в тестовом режиме, с указанием опции легального для сети DHCP сервера (-l), опцией режима тестирования (-t) и опцией задающей максимальное число попыток отправки DHCPDISCOVER в режиме поиска сервера (-m). Если ни на один из отправленных запросов не придёт ответа - программа завершается с кодом 0. Если приходит ответ от сервера не заданного опцией -l, программа завершается с кодом 200, что вызывает последующий запуск программы с параметрами определяющими подавление любого DHCP сервера в сети, кроме легального. Использование агрессивного режима получения адресов. Как можно догадаться из описания протокола DHCP - если клиент уже получил конфигурационный набор данных от нелегального DHCP сервера, то сервер не выдаст повторно этот набор другому клиенту пока не истечёт срок аренды. Следовательно простое исчерпание пула IP адресов не спасёт клиентов уже получивших не верные конфигурационные данные - сервер будет выдавать эти адреса только изначально запросившим их клиентам и будет игнорировать запросы от dhcdrop. При следующей попытке обновления адреса клиенты вновь получат информацию от нелегального DHCP сервера, и так будет продолжаться пока не отключат нелегальный DHCP сервер. Для решения подобных проблем в dhcdrop начиная с версии 0.5. добавлен агрессивный режим получения IP адресов. Включается опцией -L указывающей легитимную IP подсеть для данного Ethernet сегмента сети. Алгоритм его работы следующий: 1. dhcdrop запускает обычный режим подавления и исчерпывает весь пул свободных IP адресов нелегального DHCP сервера. 2. Анализирует первый DHCPOFFER полученный от нелегального DHCP. При помощи сетевой маски и IP адреса клиента выданных сервером получает адрес IP сети обслуживаемой этим сервером. 3. Запускает ARP-сканирование полученной подсети с целью выявить хосты получившие не правильную конфигурационную информацию. По умолчанию число сканируемых хостов ограничено числом 512 (можно изменить опцией -M) - некоторые сервера выдают конфигурационные наобры с маской /8, что соответствует примерно 16 млн. хостов - сканирование такого адресного диапазона займёт очень большое время. 4. Отправляет DHCP серверу сообщения DHCPRELEASE от каждого из найденных хостов (исключая сам сервер). 5. Ожидает 60 секунд (значение по умолчанию, может быть изменено опцией -w) после чего перезапускает процесс получения IP адресов. В качестве примера запустим dhcdrop с теми же параметрами что и в предыдущем примере, но дополнительно укажем легальную IP сеть 10.7.7.0.
Пояснения к результатам работы программы. После вывода надписи "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:
Опция -s задаёт IP адрес сервера, -F - IP адрес DHCPклиента, 00:2D:1C:80:ED:12 - Ethernet адрес клиента. В результате в сеть отправлен пакет вида:
Сканирование сегмента сети. Вы можете использовать ARP сканирование сети для поиска клиентов получивших не верную конфигурационную информацию. Осуществляется при помощи опции -S:
Как следует из предупреждения напечатанного программой - при запуске не был задан IP адрес источника, потому dhcdrop выбирает случайный IP адрес из диапазона адресов указанной подсети. Если вам нужно указать адрес источника - используйте опцию -F. Для данного типа сканирования не важны фактические настройки маршрутизации в вашей сети. Всегда будет использоваться интерфейс заданный опцией -i из расчёта что хосты указанной подсети находятся в одном Ethernet сегменте с хостом на котором запущен dhcdrop. Так же, данная опция позволяет обнаружить дублирование IP адресов в одном сегменте сети, даже если сканирование производится с хоста чей IP адрес дублируется другим хостом. Вот такая вот утилитка - возьмите на заметку, пригодится. |
Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь. Мы рекомендуем Вам зарегистрироваться либо зайти на сайт под своим именем.