Как определить dhcp сервер в сети
Иногда системному администратору необходимо выявить паразитные DHCP-сервера, которые нарушают работу сети. Для этой цели можно воспользоваться утилитой dhcploc. Эта утилита входит в состав Resource Kit для Windows.
Утилита Dhcploc (dhcploc.exe) помогает обнаруживать неавторизованные DHCP-серверы. В команде указывается список IP-адресов серверов DHCP, затем утилита Dhcploc опрашивает серверы и возвращает список ответов. Команда
dhcploc -p 192.168.1.20 ‘192.168.1.1
192.168.20.1′
выполняется с компьютера, имеющего IP-адрес 192.168.1.20. Первым в командной строке обычно стоит адрес машины, на которой вводится команда. IP-адреса в кавычках — адреса авторизованных серверов. Если ответившие серверы не указаны в списке авторизованных серверов, то они являются нарушителями. Параметр -p позволяет утилите Dhcploc не отображать ответы от серверов, названных в списке. Таким образом, любые принятые ответы — ответы нарушителей. Когда Dhcploc их обнаруживает, утилита посылает предупреждения определенным пользователям (через указанные интервалы времени). Для рассылки предупреждений используют параметры -a и -I. Команда
dhcploc -p 192.168.1.20 ‘192.168.1.1
192.168.20.1′ -a:’administrator’ -I:1800
посылает сигнал тревоги администратору (параметр -а) каждые 30 мин (параметр -I — значение в секундах). Утилита Dhcploc использует широковещательные пакеты для получения ответов от DHCP-серверов. Способ пересылки по сети таких широковещательных пакетов может ограничить эффективность использования утилиты. В маршрутизируемой сети настраивать сетевые маршрутизаторы нужно так, чтобы пакеты с запросами к серверам DHCP рассылались во все подсети, где могут быть нарушители. Если сеть достаточно сложной конфигурации, то для выполнения утилиты Dhcploc на рабочей станции каждой подсети можно использовать такой инструмент, как планировщик NT.
Пример вывода команды dhcploc (при нажатии Enter после запуска утилита выводит подсказку по горячим клавишам d, q и h):
Как найти IP-адрес DHCP-сервера через командную строку в Windows?
Linux имеет простые команды для поиска IP-адреса DHCP-сервера через командную строку.
есть ли что-нибудь для Windows?
3 ответов
DHCP-сервер, используемый для получения адреса, включается в вывод ipconfig /all .

Если ваш компьютер имеет статический IP, то ipconfig /all не будет показывать DHCP-сервер в вашей сети. В этом случае можно использовать следующую командную строку для ее отображения.
Вопрос — как узнать сервер DHCP?
Есть сетка, в которой клиентам адреса раздаются по DHCP.
Естественно, админ вне доступа (ибо пятница), а надо посмотреть настройки и текущие выданные адреса.
Как можно узнать, какой из 7ми серверов является dhcp?
ЗЫ. просмотр оснастки mmc ничего не дал (или я не увидел)
(0) ipconfig /all тебя спасёт 🙂
ЗЫ.. если не поймёшь что к чему — выложи сюда результат
чорд.
Доступные мне сейчас клиенты все имеют
Dhcp включен. . . . . . . . . . . : нет
А надо таки. просто есть пара узлов, которые получают именно по дхцп. И вот к ним понадобилось лезть 🙁
(4) должен увидеть что-то типа такого:
Описание. . . . . . . . . . . . . : Atheros L1 Gigabit Ethernet 10/100/1000Ba
-T Controller
Физический адрес. . . . . . . . . : 00-1А-8C-BB-56-E4
DHCP включен. . . . . . . . . . . : Да
Автонастройка включена. . . . . . : Да
Локальный IPv6-адрес канала . . . : fe80::f5аc:bb1c:ed23:db4d%10(Основной)
IPv4-адрес. . . . . . . . . . . . : 192.168.1.3(Основной)
Маска подсети . . . . . . . . . . : 255.255.255.0
Аренда получена. . . . . . . . . . : 27 августа 2010 г. 15:09:51
Срок аренды истекает. . . . . . . . . . : 28 августа 2010 г. 18:44:00
Основной шлюз. . . . . . . . . : 192.168.1.1
DHCP-сервер. . . . . . . . . . . : 192.168.1.1
IAID DHCPv6 . . . . . . . . . . . : 234888844
DUID клиента DHCPv6 . . . . . . . : 00-01-00-01-12-7B-96-FА-00-1E-8C-BB-56-E4
DNS-серверы. . . . . . . . . . . : 192.168.1.1
Основной WINS-сервер. . . . . . . : 192.168.1.1
NetBios через TCP/IP. . . . . . . . : Включен
Обнаружить DHCP
Доброго времени суток! Озадачили меня тут: надо проверить из программы (C++) работает ли dhcp или сеть сконфигурирована с постоянным адресом. Гуглеж дал лишь советы проверять leases в /var/lib/dhcpd/dhcpd.leases. Ubuntu 12.04,

Можно послать DHCPDISCOVER и найти таким образом DHCP-серверы.
Ещё можно узнать адрес сервера у NetworkManager, распарсив вывод команды:
($UUID — это UUID соединения).
Вместо запуска команды лучше получить нужную информацию напрямую через D-Bus.

лучше получить нужную информацию напрямую через D-Bus
а вот с этого места поподробнее, пожалуйста.
В общем случае это невозможно, так как настройки, полученные от DHCP, принципиально ничем не отличаются от настроек, заданных «руками».
А ещё наличие/отсутствие DHCP никак не коррелирует с «постоянством» IP-адреса.

А мне не надо настройки получать, нужно лишь определить наличие DHCP сервера.
А мне не надо настройки получать, нужно лишь определить наличие DHCP сервера.
- На клиентской машине: определить, получены ли настройки по DHCP, или заданы локально.
- На клиентской машине: определить, работает ли в локальной сети DHCP-сервер.
- На сервере: определить, работает ли DHCP-сервер на этой же системе.
Что именно из этого тебе нужно?

На клиентской машине: определить, работает ли в локальной сети DHCP-сервер
Именно это. Пардон муа, что не оговорил сразу.
Почитай описание работы DHCP, посмотри снифером какие пакеты шлют dhcp-клиенты при поиске серверов и посмотри исходники dhcp-клиентов.
Тебе нужно отправить в сеть DHCPDISCOVER (насколько я помню) и подождать ответа от сервера (или нескольких серверов). Если ответ придёт — DHCP-сервер работает.
а вот с этого места поподробнее, пожалуйста.
NetworkManager виден как org.freedesktop.NetworkManager. Сначала в /org/freedesktop/NetworkManager вызываем org.freedesktop.NetworkManager.GetDevices, получаем там список путей, соответствующих устройствам. Для каждого из этих путей вызываем org.freedesktop.NetworkManager.Device.Interface, находим, какому устройству соответствует нужный интерфейс. На нужном устройстве вызываем org.freedesktop.NetworkManager.Device.Dhcp4Config, получаем путь. Если это /, тогда DHCP не использовался, иначе на этом пути можно вызвать org.freedesktop.NetworkManager.DHCP4Config.Options и получить словарь с конфигурацией DHCP.
Это был вариант, если нужно проверить, использовался ли DHCP для конкретного интерфейса. Также можно раскрутить это через org.freedesktop.NetworkManager.ActiveConnections. Полное описание API здесь: http://projects.gnome.org/NetworkManager/developers/api/09/spec.html
Но если таки нужно определить наличие DHCP-сервера, а не факт его использования клиентом, но нужно посылать DHCPDISCOVER.

Спасибо!
и наилучшие пожелания 🙂

Премного благодарен! Кажется, это то, что мне надо.
А вот я не уверен. Если таки нужно это:
На клиентской машине: определить, работает ли в локальной сети DHCP-сервер
то нужно посылать DHCPDISCOVER и ждать ответа.
Если же сгодится и это:
На клиентской машине: определить, получены ли настройки по DHCP, или заданы локально.
тогда действительно можно опрашивать NetworkManager.

Я не говорил, что уверен. Там ведь «кажется», не?
А за помощь — спасибо. Я думаю, что смогу обойтись вариантом опроса NetworkManager.

думаю, что смогу обойтись вариантом опроса NetworkManager.
Не рекомендовал бы зацикливаться на NetworkManager’е, так как:
во-первых, существуют и другие менеджеры сети (например, wvdial),
во-вторых, сеть может работать и без менеджеров (в дебиане, например, может задаваться через /etc/network/interfaces).
Ну и в-третьих, даже если на этой машине стоит NetworkManager и настройки заданы вручную, в сети могут быть работоспособные dhcp-сервера.

Согласен
Ибо уже по граблям прошел. NetworkManager работает, а файла сервиса нет. Придется искать другие пути. Кстати, там где надо определяться, в /etc/network/interfaces практически пусто. С чем еще посоветуете повозиться?

Погуглируй по слову DHCPDISCOVER как и советовали.
Т.е. тебе нужно посылать в сеть по протоколу UDP специально сформированный широковещательный запрос. И слушать ответы на 67/68 портах UDP.
Возможно, тебе придется изучить работу с udp-пакетами, а также формат запросов. А может быть тебе повезет, и найдешь готовую C++ библиотеку для работы с DHCP. Ищи 😉


Спасибо.
Читал, читаю и буду читать. Только давайте посмотрим на задачу с другой стороны. В /etc/network/interfaces нет адреса, заданного явно. NeworkManager работает, в сети есть dhcp-сервер. Можно ли узнать (и как), какой ip у машины? Пропала связь, через некоторое время восстановилась, какой адрес получен?

В /etc/network/interfaces нет адреса, заданного явно
Эммм. Почему-то ты всё время говоришь о файлах и о службах.
Мне кажется тебе нужно делать упор на системные функции из системных библиотек.
Я не писал на C++, но уверен, что из «приплюснутых ссей» есть вызов сетевых системных функций, в том числе и определение поднятых на данный момент интерфейсов и ip-адресов.
Работай через системные функции.
p.s. Сам пишу на Ruby, тут всё проще 🙂

Работай через системные функции.
есть вызов сетевых системных функций

тогда действительно можно опрашивать NetworkManager.
Которого вполне может не быть

А ещё наличие/отсутствие DHCP никак не коррелирует с «постоянством» IP-адреса.
вообще-то коррелирует — если DHCP есть, то клиент от него получает IP, а если его нет, то использует свой IP из своих настроек. Конечно IRL возможны варианты.
Вот в этом и есть одна из проблем линукса — существует куча велосипедов, делающих одно и то же и конфликтующих друг с другом, и на компьютере пользователя запущен абсолютно произвольный набор программ, одинаковое будет только ядро. Как новой программе взаимодействовать с этим всем зоопарком, непонятно, потому что недостаточно стандартизированы уровни абстракции. Было бы гораздо лучше, если бы такие уровни абстракции существовали. Например, где-то был бы описан стандарт, каким должен быть API, через который настраивается сеть. Тогда программы, которым необходимо получить или изменить какие-либо настройки, связанные с сетью, использовали бы только этот API, а программа, делающая настройки сети, вызывая методы ядра, предоставляла бы этот API, и было бы гораздо проще разрабатывать программы. Но сейчас таких стандартов нет, есть только попытки создания подобных API (одна их этих попыток — NetworkManager, пример конкурирующих разных API для одной цели — logind и ConsoleKit). Конечно, есть небольшое число стандартизированных вещей (например, стандарты xdg и freedesktop), но они необязательны и их недостаточно. И одна из причин этого — свободное ПО, для которого очень трудно сделать такие стандарты, потому что тот, кто не захочет им подчиняться, может форкнуть проект и забить на эти стандарты (пример этому — два недавно появившихся форка udev), и это очень сильно тормозит развитие линукса.