Я планирую добавить в наш продукт новую функцию для поддержки локальной сети. Поскольку установка будет выполняться относительно нетехническими людьми (это для лодок), я подумал, что было бы полезно автоматически определять, нужно ли нам предоставлять DHCP-сервер или нет, в зависимости от того, какой из них уже был в сети. Есть ли официальный способ проверить, есть ли уже DHCP-сервер (или более одного) в сети?
Мы используем в продукте встроенный Linux.
В репозиториях Fedora есть следующий пакет "dhcp_probe"
Описание: dhcp_probe пытается обнаружить серверы DHCP и BootP в напрямую подключенной сети Ethernet. Сетевой администратор может использовать этот инструмент для обнаружения неавторизованных серверов DHCP и BootP.
Похоже на man dhcp_probe
содержит несколько хороших указателей для стратегии обнаружения DHCP, на которые стоит обратить внимание, даже если вы решили заняться созданием пакетов самостоятельно.
ПАКЕТЫ
Ни один пакет запроса вряд ли вызовет ответ от всех возможных серверов BootP и DHCP. Некоторые серверы могут отвечать только на BootP или DHCP, но не на оба сразу. Некоторые серверы могут быть настроены для ответа только небольшому набору известных клиентов. Некоторые DHCP-серверы предоставляют аренду только небольшому набору известных клиентов, но могут быть готовы ответить (отрицательно) неизвестным клиентам, которые запрашивают продление аренды с неподходящего IP-адреса. Таким образом, dhcp_probe на самом деле отправляет не один, а пять различных пакетов запросов в надежде вызвать отклики от большего количества неизвестных серверов.
$ rpm -qil dhcp_probe
Name : dhcp_probe
Version : 1.3.0
Release : 8.fc15
Architecture: x86_64
Install Date: Mon 30 Apr 2012 12:20:46 AM BST
Group : System Environment/Daemons
Size : 133600
License : GPLv2+ and MIT
Signature : RSA/SHA256, Thu 28 Jul 2011 11:45:40 AM BST, Key ID 067f00b6a82ba4b7
Source RPM : dhcp_probe-1.3.0-8.fc15.src.rpm
Build Date : Tue 08 Feb 2011 01:58:57 PM GMT
Build Host : x86-18.phx2.fedoraproject.org
Relocations : (not relocatable)
Packager : Fedora Project
Vendor : Fedora Project
URL : http://www.net.princeton.edu/software/dhcp_probe/
Summary : Tool for discover DHCP and BootP servers
Description :
dhcp_probe attempts to discover DHCP and BootP servers on a directly-attached
Ethernet network. A network administrator can use this tool to locate
unauthorized DHCP and BootP servers.
/etc/dhcp_probe.cf
/etc/rc.d/init.d/dhcp_probe
/usr/sbin/dhcp_probe
/usr/share/doc/dhcp_probe-1.3.0
/usr/share/doc/dhcp_probe-1.3.0/AUTHORS
/usr/share/doc/dhcp_probe-1.3.0/COPYING
/usr/share/doc/dhcp_probe-1.3.0/COPYING.GPL
/usr/share/doc/dhcp_probe-1.3.0/COPYING.LIB
/usr/share/doc/dhcp_probe-1.3.0/NEWS
/usr/share/doc/dhcp_probe-1.3.0/README
/usr/share/doc/dhcp_probe-1.3.0/TODO
/usr/share/man/man5/dhcp_probe.cf.5.gz
/usr/share/man/man8/dhcp_probe.8.gz
Не будем путать слово «официальный» с понятием «общепринятый метод».
Один из общепринятых методов - отправить пакет DHCPDiscover и найти ответ.
Если у вас установлен «dhcpcd», вы можете использовать флаг «-T», чтобы получить «тестовый» режим, который просто повторяет настройки, но фактически не устанавливает IP-адрес и шлюз.
dhcpcd -T
и вывод:
emily ~ # dhcpcd -T wlan0
dhcpcd[6205]: version 5.2.12 starting
dhcpcd[6205]: wlan0: broadcasting for a lease
dhcpcd[6205]: wlan0: offered 192.168.2.194 from 192.168.2.1
interface=wlan0
pid=6205
reason=TEST
skip_hooks=lookup-hostname
new_broadcast_address=192.168.2.255
new_dhcp_lease_time=86400
new_dhcp_message_type=2
new_dhcp_server_identifier=192.168.2.1
new_domain_name_servers='192.168.2.1 193.189.160.13 193.189.160.23'
new_ip_address=192.168.2.194
new_network_number=192.168.2.0
new_routers=192.168.2.1
new_subnet_cidr=24
new_subnet_mask=255.255.255.0
Вы можете сделать свой собственный DHCPDISCOVER, чтобы увидеть, настроено ли что-нибудь для ответа, но если DHCP-сервер заблокирован для определенных MACS, вы можете не получить ответа.
Теоретически вы могли бы выполнить сканирование порта UDP для UDP67 и UDP68, но я не уверен, что это отличная идея, так как он с большей вероятностью будет отмечен как потенциально вредоносное поведение.
Вообще говоря, продукты, не являющиеся сетевым оборудованием, не должны предлагать DHCP. Это усложняет работу настоящего системного администратора, особенно если он имеет тенденцию включаться по умолчанию при потере своих настроек.
Это то, что всегда приводило меня в замешательство по поводу старых дрянных конвертеров «сервер печати» от Hawking Ethernet в USB.
Отправьте запрос DHCP и подождите, чтобы увидеть, получите ли вы предложение DHCP.
Более простой метод - настройте сетевой адаптер так, чтобы он получал IP-адрес через DHCP, а затем через некоторое время проверяет, получает ли он адрес APIPA. Если он получает адрес APIPA, маловероятно, что к данной сети подключен существующий DHCP-сервер.