Определить IP адрес по MAC адресу

Оригинал здесь

Эта статья рассказывает, как узнать, какой IP адрес имеет сетевое устройство с известным MAC адресом.

Этот вопрос чаще возникает для сетевых устройств, таких как сетевые принтеры или сетевые телекамеры. Например, мы подключили сетевой принтер или сетевую телекамеру к сети с DHCP и хотим узнать IP адрес этого устройства, но доступа к статистике DHCP сервера нет. Или на устройстве задан статический IP адрес, но мы не помним, какой именно. При этом мы знаем MAC адрес (написан на корпусе). Этот вопрос бывает актуален и для компьютеров, особенно к которым нет физического доступа.

Консольные команды определения IP адреса представлены на картинке, а далее описано, почему команды должны быть именно такими и как они работают, также приведён пример bat файла:
Способ работает на любом Windows компьтере в сети и не требует административных полномочий. Используется информация ARP кэша, производится чтение списка и поиск нужной записи.

Просмотр ARP кэша

Командная строка просмотра ARP кэша с поиском записи по определённому MAC адресу:

arp -a | find /i "01-23-45-67-89-ab"

Но, выполнив эту команду, мы можем не увидеть наше устройство.

Это происходит потому, что ARP кэш в Windows хранит записи от 15 до 45 секунд, начиная с Windows Vista: Address Resolution Protocol (ARP) caching behavior in Windows Vista TCP/IP implementations.

Наполнение ARP кэша

Поэтому перед чтением кэша необходимо заполнить его полным списком узлов сети. Это можно сделать, запустив ping на все узлы сети, например, если у нас сеть 192.168.1.1 / 255.255.255.0, то:

for /L %a in (1,1,254) do @start /b ping 192.168.1.%a -n 2 > nul

Важно, чтобы запуск 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 192.168.1.%%a -n 2 > nul
ping 127.0.0.1 -n 3 > nul
arp -a | find /i "%1"

Соответственно, запускаем:

ip_by_mac 01-23-45-67-89-ab

и получаем:

  192.168.1.221         01-23-45-67-89-ab     динамический

Ограничения

Способ работает только для тех узлов, которые отвечают на ping (icmp запросы), т.е. если у компьютера icmp echo отключен, то этот командный файл не определит его IP адрес.

Остается неудобство в том, что требуется явно указывать подсеть, а так же ограничение на подсеть – командный файл работает только для сетей 255.255.255.0.

Пример выполнения команд