Есть ли быстрый и надежный способ использовать MAC-адрес устройства, чтобы определить, подключено ли оно в данный момент к сети с ПК/сервера Windows? Если нет, то с сервера Ubuntu?
- arp -a не работает сама по себе, так как элементы остаются в кэше слишком долго.
- arp -a в сочетании с очисткой кэша каждые 5 минут может сработать, но кажется неэффективным и работает только если кэш полностью заполняется заново в течение 5 минут. Будет ли это работать?
Предыстория: Мне надоело отмечаться на работе, поэтому я написал быстрое приложение, которое работает как служба Windows, периодически проверяет, присутствует ли мой телефон в корпоративной сети, регистрирует эти данные в базе данных, а затем размещает веб-сайт, позволяющий просматривать время моего пребывания в офисе, суммируя данные по заданному диапазону (удивительно, чего можно добиться с помощью правильных библиотек за несколько часов).
Прошла примерно неделя, прежде чем компания решила, что все, где это возможно, должны использовать приложение вместо нашей системы учета рабочего времени.
Первоначально я использовал резервирование DHCP и периодически пинговал свой телефон Android, чтобы обнаружить его. Однако при расширении я быстро столкнулся с проблемой, что iPhone не отвечают на пинги. Кроме того, пинги медленные. Надежное подтверждение наличия телефона через пинг занимает около секунды.
Я пробовал запустить arp -a и прочесать результат на предмет совпадений MAC, но элементы остаются в кэше arp практически бесконечно. Я рассматривал возможность чтения кэша, а затем его очистки, но не знаю, будет ли он надежно заполнен со временем. Это потенциальное решение, если так и будет, хотя мне не нравится идея очистки кэша arp каждые пять минут.
Мое текущее решение — провести опрос SNMP на наших точках доступа, чтобы собрать их подключенных клиентов, а затем проанализировать его, чтобы посмотреть, смогу ли я найти совпадения MAC. Это быстро и надежно, но это очень специфично для рассматриваемых точек доступа. Если мы отключим точки доступа, то следующие могут не перечислить своих подключенных клиентов через SNMP. Даже если они это сделают, мне нужно будет перенастроить опросы SNMP.
Я думаю, что если есть известный порт, который принимает соединения на любом телефоне, я мог бы открыть TCP-соединение с ним, а затем закрыть его вместо ping, но я чувствую, что где-то здесь должно быть быстрое решение уровня 2.
решение1
Не используйте arp
. Используйте arping
.
https://en.wikipedia.org/wiki/Арпинг
Arping — это компьютерный программный инструмент для обнаружения и проверки хостов в компьютерной сети. Arping проверяет хосты на подключенном сетевом соединении, отправляя кадры канального уровня с использованием метода запроса Address Resolution Protocol (ARP), адресованного хосту, идентифицированному по его MAC-адресу сетевого интерфейса.
Утилита может использовать ARP для разрешения IP-адреса, предоставленного пользователем. Функция arping аналогична утилите ping для зондирования сети с помощью протокола управляющих сообщений Интернета (ICMP) на уровне Интернета пакета протоколов Интернета.
По сути, это то, что arp
делает, но без всего кэширования ARP ОС, т.е. просто отправляет буквальные, одноразовые ARP-запросы по сети.
P.S. Помните, что весь этот ARP-процесс будет работать только в одной локальной подсети. Если вам нужен более широкий охват, вам придется запустить его на маршрутизаторе(ах).
PPS Вы могли бы просто использовать короткие аренды DHCP (например, от 1 до 5 минут). Конечно, устройства Apple известны тем, что не подчиняются спецификации DHCP в прошлом, но в наши дни это не должно быть так плохо. Я надеюсь.
PPPS Even arping
не будет на 100% надежным (хотя он должен быть выше 99%). Некоторые устройства игнорируют незапрошенные входящие запросы arp так же, как некоторые устройства игнорируют пинги. Да, это нарушает IETF, но то же самое касается и игнорирования пингов...
Гав.
решение2
Вы были правы, используя ARP. Поскольку вы не хотите полагаться на то, что устройство сообщит вам, что оно в сети, что является другим способом, вы можете сделать это самостоятельно. ARP может облегчить это, и он не только даст вам mac-адрес, но и даст вам ip-адрес, который они используют в сети. Когда вы очищаете arpcache, он будет заполняться заново по мере необходимости. То есть он будет заполнять кэш только теми адресами, с которыми ему приходилось взаимодействовать в сети.
Лучшее решение, если вы уже собираетесь знать MAC-адреса клиентов, вы можете назначить им статические IP-адреса в сети. Это решит вашу проблему кэширования в той степени, поскольку кэш периодически устаревает. Это означает, что в следующий раз, когда ваш сетевой интерфейс должен будет связаться с устройством, он выполнит еще один поиск. Теперь, поскольку у вас есть проблема с устройствами Apple, которые не отвечают на пинг, я собирался предложить, вы всегда можете пинговать широковещательную сеть. Так, например, если ваш шлюз 192.168.1.1, широковещательная передача — 192.168.1.255, и если вы отправите пинг на него, все устройства, которые принимают пинги, ответят вам.
Итак, чтобы подвести итог, вы можете просто продолжать очищать кэш arp, поскольку он будет надежно заполняться заново по мере необходимости для протокола TCP/IP для обмена пакетами между компьютерами и маршрутизаторами и т. д. Однако это просто увеличит нагрузку на ваш сетевой интерфейс. Или в приложении сделайте так, чтобы оно определяло, когда оно подключается к корпоративной сети, и отправляло пинг на ваш сервер на порт, отличный от порта по умолчанию icmp, чтобы ваш сервер прослушивал указанные пинги, и вы можете документировать все, что вам нужно. Или просто сделайте так, чтобы приложение пинговало ваш сервер время от времени. То, что устройство не принимает пинги, не означает, что оно не может их отправлять.
решение3
Существует приложение для Android под названием Fing, которое по сути сканирует и отображает информацию (включая IP- и MAC-адреса) обо всех устройствах в сети.
Я не знаю, какие протоколы он использует, но он обнаруживает устройства Apple. Вы можете использовать что-то вроде Wireshark, чтобы попытаться провести обратную разработку приложения, и использовать ту же технику на вашем инструменте. (Кто-то уже пробовал этона соответствующем сайте Stack Exchange)