Блог‎ > ‎

Полезные мелочи 1: как определить IP-адрес сетевого устройства

Отправлено 17 мар. 2014 г., 03:52 пользователем Константин Ханкин
Представьте, что у вас в руках оказалась неизвестная (или известная, но забытая) железка, которой вы очень хотите поуправлять, но для управления требуется знать её IP-адрес (например, для входа через web-интерфейс или telnet). А железка 100 лет провалялась на складе / вам её подарили / вы другим образом забыли настройки IP. Как быть?

Лучший вариант решения этой проблемы - чтение документации. Там обычно есть и настройки IP по умолчанию, и описываются способы сброса до заводстких настроек. Возможно, устройство имеет порт для подключения последовательного терминала. В этом случае ваши шансы на успех равны 95%, 5% остаются на неисправность консольного порта и кривоту документации.

Но что делать, если документация писана криворукими индокитайцами или отсутствует вовсе, а железка относится к той категории, в которой и говорить о консольном порту неприлично?

Как везде, тут есть 2 способа: активный и пассивный. Начнём с пассивного, он проще и быстрее.

Нам поможет tcpdump. Подключаетесь напрямую к сетевому порту устройства и натравливаете tcpdump -vn на соответствующий интерфейс. Варианты могут быть следующими:
  • устройство настроено на получение адреса по DHCP, тогда после перезагрузки его вы увидите пакеты DHCP Discovery;
  • устройство настроено на участие в multicast-группе (например, используется протокол OSPF). Периодически в эфире будут появляться пакеты IGMP;
  • устройство настроено на участие в широковещательном протоколе (например, NetBIOS или IAPP).
Могут быть и другие варианты, но все они сводятся к предыдущим: либо мультикаст, либо броадкаст, другого не дано, уникасты вы не перехватите, потому что им взяться неоткуда.

Если пассивный метод не помогает, приходится переходить к активному. В случае IPv4 активный метод может дать гарантированный результат за приемлемое время (а чего вы хотели? Не помогает анализ - остаётся только полный перебор). В случае IPv6 множество вариантов существенно мощнее, поэтому предлагаемый метод не сработает.

Предлагаемый метод будет более эффективным, если можно сделать какие-то предположения об IP-адресе. Так, например, для популярного частного диапазона 192.168.0.0/16 можно использовать следующий сценарий:
#!/bin/sh
ifconfig eth0 192.168.0.1 netmask 255.255.0.0
nmap -sP 192.168.0-255.2-254 | grep up

В данном сценарии используется протокол ARP для поиска соседей по локальной сети.

Естественно, чем менее точно вы можете сделать предположение об адресе, тем большее множество адресов придётся перебирать. В худшем случае придётся делать полный перебор. Не забывайте, что в этом случае перед сканированием вам надо будет сменить IP-адрес устройства так, чтобы этот адрес принадлежал опрашиваемому на данной итерации диапазону..
Comments