Сегодня мы попытаемся восстановить IP адрес по известному нам MAC адресу.
Этот вопрос чаще возникает для сетевых устройств, таких как сетевые принтеры или сетевые телекамеры. в моем же случае это был IP телефон с веб интерфейсом. И так мы подключили наш IP телефон к сети в которой работает DHCP сервер и хотим узнать IP адрес этого устройства, но доступа к статистике DHCP сервера по какой-то причине нет или же мы раньше настраивали наше устройство и записали его MAC адрес в блокнот для дальнейшего доступа к настройкам. Так же возможен вариант, что устройстве задан статический IP адрес, но мы не помним, какой именно. При этом мы знаем MAC адрес (написан на корпусе или в файле блокнота). Этот вопрос бывает актуален и для устройств, особенно к которым нет физического доступа.
Разберем консольные команды определения IP адреса по MAC адресу разберем как они работают, также приведён пример bat файла.
Способ работает на любом Windows компьютере в сети и не требует административных полномочий. Для получения IP адреса используется информация ARP кэша, производится чтение списка и поиск нужной записи.
Просмотр ARP кэша
Командная строка просмотра ARP кэша с поиском записи по определённому MAC адресу:
arp -a | find /i "00-0B-82-4D-FD-44"
Но, выполнив эту команду, мы можем не увидеть наше устройство.
Это происходит потому, что ARP кэш в Windows хранит записи от 15 до 45 секунд, начиная с Windows Vista, подробнее можно почитать на сайте Microsoft здесь: Address Resolution Protocol (ARP) caching behavior in Windows Vista TCP/IP implementations
Наполнение ARP кэша
Поэтому перед чтением кэша необходимо заполнить его полным списком узлов сети. Это можно сделать, запустив ping на все узлы сети, например, если у нас сеть 10.3.5.1 / 255.255.255.0, то:
for /L %a in (1,1,254) do @start /b ping 10.3.5.%a -n 2 > nul
В принципе на этом можно остановиться и после выполнения команды наполнения кеша запустить команду поиска по определенному адресу MAC, выглядеть это будет примерно так:
Важно, чтобы запуск ping происходил как do @start /b ping, тогда все ping запускаются почти одновременно, и время выполнения цикла составит всего несколько секунд. Если написать просто do ping, т.е. без start, то цикл будет выполняться более 10 минут.
значок @ перед start предотвращает вывод 254 команд ping
После завершения ping нужно сразу запускать arp -a. Пауза более 15 секунд может привести к тому, что какие-то записи будут удалены из кэша. Это уже решает нашу проблему, если же нам часто прийдется выполнять эти манипуляции то можно немного автоматизировать процесс с помощью исполняемого файла. Рассмотрим как это сделать дальше.
Пакетный bat/cmd файл
То же решение в виде командного файла ip_by_mac.cmd с передачей MAC адреса в виде параметра будет выглядеть так:
@echo off
if "%1" == "" echo no MAC address & exit /b 1
for /L %%a in (1,1,254) do @start /b ping 10.3.5.%%a -n 2 > nul
ping 127.0.0.1 -n 3 > nul
arp -a | find /i "%1"
Соответственно, запускаем:
ip_by_mac.cmd 00-0B-82-4D-FD-44
и получаем:
10.3.5.48 01-23-45-67-89-ab динамический
При запуске это будет выглядеть примерно так:
Запускать исполняемый файл необходимо из директории где он лежит, в моем случае он лежит в корне диска C:\
Скачать готовый исполняемый файл можно по этой ссылке ip_by_mac.cmd
Способ работает только для тех узлов, которые отвечают на ping (icmp запросы), т.е. если у компьютера icmp echo отключен, то этот командный файл не определит его IP адрес.
Остается неудобство в том, что требуется явно указывать подсеть, а так же ограничение на подсеть – командный файл работает только для сетей 255.255.255.0.
На этом все, IP адрес моего IP телефона обнаружен, и можно смело ввалиться в его веб-интерфейс для дальнейшей конфигурации устройства