Поиск хоста по MAC-адресу

Материал из Xgu.ru

(Перенаправлено с Host by MAC)
Перейти к: навигация, поиск
stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Если вы считаете, что её стоило бы доработать как можно быстрее, пожалуйста, скажите об этом.


Автор: Игорь Чубин
Короткий URL: Host_by_MAC

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

Содержание

[править] Задача

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

Для управляемых коммутаторов существует более простое и элегантное решение: узнать у самого коммутатора к какому его порту подключён хост с известным MAC-адресом.

Другая задача, которая имеет непосредственное отношение к этой — раздача DHCP-сервером IP-адресов основываясь на номерах портов коммутатора, к которым подключены хосты.

Поиск порта коммутатора: http://www.cisco.com/en/US/tech/tk648/tk362/technologies_tech_note09186a00801c9199.shtml

Можно находить хост даже в том случае, если он изменил MAC-адреса сетевой карты. Поиск порта коммутатора

После того как MAC-адрес устройства, выполнившего подмену известен, необходимо найти, сетевой карте какого компьютера он принадлежит.

Если база данных MAC-адресов сетевых карт не ведётся, простейший способ найти сетевую карту — опросить коммутатор. В том случае, если существует база данных MAC-адресов сетевых карт, с информацией о том, к какому порту коммутатора они подключены, можно попробовать найти сетевую карту с её помощью. Однако, MAC-адрес устройства могу быть подменён, и тогда поиск по базе данных не увенчается успехом. В этом случае также может помочь опрос коммутатора.


[править] Таблица MAC-адресов на коммутаторе

Точнее, они предоставляют две таблицы соответствия: таблицу соответствия MAC-адресов определённому числу-идентификатору и таблицу соответствия портов коммутатора этому же числу-идентификатору. После того как обе таблицы известны, достаточно их сопоставить, и определить, какому порту соответствует какой MAC-адрес.

собственно таблицы соответствия

Может быть и такое, что ни один MAC-адрес не соответствует порту, даже если к порту и подключён компьютер – это может произойти в том случае, если компьютер давно не отправлял пакеты, и информация о нём уже удалена из памяти коммутатора. По этой же причине, описываемый метод может не найти компьютер с определённым адресом.

Может быть и наоборот – одному порту соответствует множество адресов. Такая ситуация возможна в том случае, когда к порту подключён не один компьютер, а множество – через другой коммутатор или хаб.

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

[править] Обнаружение новых хостов

В закрытых сетях, где новые сетевые устройства появляются редко, может иметь смысл задача автоматического обнаружения новых хостов в сети. Как только в сети появилось устройство с неизвестным MAC-адресом, администратору отправляется оповещение, содержащее максимум информации об устройстве.

Программа arpwatch ведет собственную базу данных MAC-адресов, и она самостоятельно может обнаруживать появление новых компьютеров. Однако, в том случае, если в сети работает несколько систем arpwatch одновременно, каждая из них будет заново обнаруживать хост с новым MAC-адресом, даже если остальные системы его уже обнаружили ранее.

про централизованную БД

Далее администратор решает, что делать с этим устройством. В том случае, если устройство появилось в сети законно, администратор может подтвердить его появление, что предотвратит появление новых сообщений, при повторном обнаружении устройства другими инсталляциями arpwatch.

Очевидно, метод будет работать и в том случае, если устройство просто изменило MAC-адрес на новый, отсутствовавший в сети ранее.

/usr/local/bin/syslog-ng-arpwatch <sh/>

  1. !/bin/sh

PATH=$PATH:/usr/local/bin

while read line do mac="$(echo $line | grep 'changed ethernet address' | awk '{print $10}')" [ -z "$mac"] && continue ( echo POSSIBLY ARP-SPOOFING FROM:; mac2port | grep "$mac" )| logger -t arp-spoofing done


Скрипт, который автоматически выключает порт коммутатора:

#!/bin/sh
PATH=$PATH:/usr/local/bin

shutport () 
{ 
    INT=$1;
    SWITCH=192.168.15.99;
    PASSWORD=procurve;
    ( sleep 5;
    echo ${PASSWORD};
    sleep 1;
    echo;
    sleep 1;
    echo conf;
    sleep 1;
    echo int $INT disable;
    sleep 1;
    echo end;
    sleep 1;
    echo exit;
    sleep 1;
    echo exit;
    sleep 1;
    echo y ) | socat - EXEC:"ssh ${SWITCH}",setsid,pty,ctty
}

main()
{
while read line
do
mac="$(echo $line | egrep 'changed ethernet address|reused old ethernet address' | awk '{print $10}')"
[ -z "$mac"] && continue
port_line="$(mac2port | grep "$mac" )"
port=$(echo $port_line | sed "s/.*->//")
echo POSSIBLY ARP-SPOOFING FROM: $port_line | logger -t arp-spoofing
shutport $port
done
}

main

<perl/>

  1. !/usr/bin/perl

our $community = "public"; our $switch = "192.168.15.100";

open(SNMP,"snmpwalk -On -OQ -v2c -c $community $switch .1.3.6.1.2.1.17.4.3.1.1|")

or die "Can't run snmpwalk";

while (<SNMP>) {

       chomp;
       s@.1.3.6.1.2.1.17.4.3.1.1@@;
       my ($oid, $mac) = split /=\s*/;
       $_=$mac;
       s@"@@g; s@\s*$@@; s@ @:@g; s@(.)@\l\1@g; s@^0@@; s@:0@:@g;
       $mac_table{$_}=$oid;

} close(SNMP);

open(SNMP,"snmpwalk -On -OQ -v2c -c $community $switch .1.3.6.1.2.1.17.4.3.1.2|")

or die "Can't run snmpwalk";

while (<SNMP>) {

       chomp;
       s@.1.3.6.1.2.1.17.4.3.1.2@@;
       my ($oid, $port) = split /=/;
       $ports_table{$oid}=$port;

} close(SNMP);


for $oid (keys %mac_table) {

       print "$oid -> ".$ports_table{$mac_table{$oid}}."\n"; 

}

[править] OID таблицы MAC-адресов в разных коммутаторах

У других коммутаторов MAC-адреса хранятся в других местах дерева OID.

Для коммутаторов Asotel:

 .1.3.6.1.4.1.655.5.5.1.4.1.1.1.2 
 .1.3.6.1.4.1.655.5.21.1.4.1.1.1.2


[править] См. также