1

Существует ли быстрый и надежный способ использования 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 ,

3 ответа3

1

Не используйте arp . Используйте arping .

https://en.wikipedia.org/wiki/Arping

Arping - это компьютерный программный инструмент для обнаружения и исследования хостов в компьютерной сети. Arping проверяет хосты на подключенном сетевом канале, отправляя кадры канального уровня, используя метод запроса протокола разрешения адресов (ARP), адресованный хосту, идентифицированному его MAC-адресом сетевого интерфейса.

Служебная программа может использовать ARP для разрешения IP-адреса, предоставленного пользователем. Функция arping аналогична утилите ping для проверки сети с помощью протокола управляющих сообщений Интернета (ICMP) на интернет-уровне пакета интернет-протоколов.

Это в основном то, что делает arp , но без целого бизнеса ARP-кэширования ОС, то есть просто отправляет буквально одноразовые запросы arp по проводам.

PS Помните, что весь этот бизнес ARP будет работать только в одной локальной подсети, если вам нужен более широкий охват, вам придется запустить его на маршрутизаторе (ах).

PPS Вы можете просто использовать короткую аренду DHCP (например, от 1 минуты до 5 минут). Конечно, устройства Apple известны тем, что не подчинялись спецификации DHCP в прошлом, но это не должно быть так плохо в наши дни. Я надеюсь.

PPPS Даже arping не будет 100% надежным (хотя оно должно быть свыше 99%). Некоторые устройства игнорируют незапрошенные входящие запросы arp, так же как некоторые устройства игнорируют эхо-запросы. Да, это нарушает IETF, но игнорирует пинг ...

Гав.

0

Существует Android-приложение под названием Fing, которое в основном сканирует и отображает информацию (включая IP-адреса и MAC-адреса) обо всех устройствах в сети.

Я не знаю, какие протоколы он использует, но он обнаруживает устройства Apple. Вы можете использовать что-то в качестве Wireshark, чтобы попытаться реконструировать приложение, и использовать ту же технику в своем инструменте. (Кто-то уже пробовал это на связанном сайте Stack Exchange)

0

Вы были правы в использовании ARP. Поскольку вы не хотите полагаться на устройство, сообщающее о своем подключении к сети, что является другим способом, вы можете сделать это самостоятельно. ARP может облегчить это, и не только даст вам MAC-адрес, но и IP-адрес, который они используют в сети. Когда вы очистите arpcache, он будет заполняться по мере необходимости. Это означает, что он будет заполнять кеш только теми адресами, с которыми ему приходилось общаться в сети.

Лучшее решение: если вы уже знаете mac-адреса клиентов, вы можете назначить им статические IP-адреса в сети. Это решит вашу проблему кеширования до такой степени, что кеш периодически становится устаревшим. Это означает, что в следующий раз, когда ваш сетевой интерфейс будет взаимодействовать с устройством, он выполнит другой поиск. Теперь, поскольку у вас есть проблема с тем, что устройства Apple не отправляют ответный сигнал, я собирался пинговать ваши широковещательные сети. так, например, если ваш шлюз - 192.168.1.1, широковещательная передача - 192.168.1.255, и если вы отправили на него эхо-запрос, все устройства, принимающие эхо-запросы, ответят вам.

Таким образом, чтобы перефразировать, вы можете просто очистить кэш arp, так как он будет надежно переполнен, так как это необходимо для протокола TCP/IP для обмена пакетами между компьютерами и маршрутизаторами и т.д., Однако это просто нагрузит ваш сетевой интерфейс. , Или в приложении: определите, когда оно подключается к сети компании, и отправьте пинг на ваш сервер с порта, отличного от icmp по умолчанию, попросите сервер прослушать указанные пинги, и вы сможете задокументировать все, что вам нужно. Или просто приложение пингует ваш сервер время от времени. То, что устройство не принимает пинг, не означает, что оно не может отправлять один.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .