Лабораторная работа посвящена инсталляции и настройке arpwatch – программы, позволяющей обнаруживать манипуляции с протоколом ARP. Кроме того, в этой работе попутно решаются задачи обнаружения в сети новых компьютеров и поиска по известному MAC-адресу устройства порта коммутатора, к которому подключено это устройство.
Установить программу arpwatch с целью отслеживания появление новых MAC-адресов и смены соответствия IP-адреса и MAC-адреса.
Инсталляция arpwatch
Установите arpwatch так, как это делается в вашей операционной системе.
Конфигурирование arpwatch
Сонфигурируйте arpwatch следующим образом. Укажите, какой интерфейс, является для arpwatch рабочим:
Добавление arpwatch в загрузку
Сделайте добавление arpwatch в загрузку вот так:
# vi /etc/rc.conf
arpwatch_enable="YES"
Просмотр информации в журналах
Просмотрите журналы системы. В одном из них должны быть сообщения arpwatch о том, что обнаружены новые сетевые устройства.
Проверка
Удостоверьтесь в том, что выполненные действия привели к требуемому результату, и arpwatch отслеживает смену адресов и появление новых сетевых устройств.
Для этого обратитесь с какого-либо хоста к хосту с arpwatch, затем измените на этом хосте MAC-адрес и обратитесь повторно. Смена MAC-адреса должна быть зафиксирована.
Создать и проверить работу скрипта, который выполняет поиск порта коммутатора, к которому подключено устройство с заданным MAC-адресом
После того как MAC-адрес устройства, выполнившего подмену известен, необходимо найти, сетевой карте какого компьютера он принадлежит.
Если база данных MAC-адресов сетевых карт не ведётся, простейший способ найти сетевую карту – опросить коммутатор. В том случае, если существует база данных MAC-адресов сетевых карт, с информацией о том, к какому порту коммутатора они подключены, можно попробовать найти сетевую карту с её помощью. Однако, MAC-адрес устройства могу быть подменён, и тогда поиск по базе данных не увенчается успехом. В этом случае также может помочь опрос коммутатора.
Управляемые коммутаторы располагают таблицей соответствия MAC-адресов сетевых карт своим портам. В действительности, существует таких таблиц несколько, объединяя информацию из которых можно установить соответствие между MAC-адресами сетевых карт и портами коммутатора, к которым карты подключены. Точнее, они предоставляют две таблицы соответствия: таблицу соответствия MAC-адресов определённому числу-идентификатору и таблицу соответствия портов коммутатора этому же числу-идентификатору. После того как обе таблицы известны, достаточно их сопоставить, и определить, какому порту соответствует какой MAC-адрес.
Может быть и такое, что ни один MAC-адрес не соответствует порту, даже если к порту и подключён компьютер – это может произойти в том случае, если компьютер давно не отправлял пакеты, и информация о нём уже удалена из памяти коммутатора. По этой же причине, описываемый метод может не найти компьютер с определённым адресом.
Может быть и наоборот – одному порту соответствует множество адресов. Такая ситуация возможна в том случае, когда к порту подключён не один компьютер, а множество – через другой коммутатор или хаб.
Если коммутатор не один, и все они управляемые, то можно опросить все коммутаторы, и определить точно, какой порт какого коммутатора находится наиболее близко к искомой сетевой карте.
Создание скрипта.
Создайте скрипт опроса коммутаторов, представленный ниже.
# vi /usr/local/bin/get-port-by-mac
#!/usr/bin/perl -w # (c) igor chubin, 2005 my $SNMP_switch="192.168.15.200 192.168.15.121"; my $SNMP_community="public"; my $snmpwalk="/usr/local/bin/snmpwalk"; my $snmpget="/usr/local/bin/snmpget"; my $SNMP_FdbAddress =".1.3.6.1.2.1.17.4.3.1.1"; my $SNMP_FdbPort =".1.3.6.1.2.1.17.4.3.1.2"; my $SNMP_FdbIfIndex =".1.3.6.1.2.1.17.1.4.1.2"; my $SNMP_FdbIfName =".1.3.6.1.2.1.31.1.1.1.1"; my %mac_table; sub get_index_by_port_id { my $port_id = shift; my $switch = shift; my $result = `$snmpget -OnQ -v1 -c $SNMP_community $switchSNMP_FdbIfIndex.
port_id`; $result =~ s/.*= //; chomp $result; return $result; } sub get_name_by_port_index { my $port_id = shift; my $switch = shift; $result = `$snmpget -OnQ -v1 -c $SNMP_community $switchSNMP_FdbIfName.
port_id`; $result =~ s/.*= //; chomp $result; return $result; } my $mac_to_find = $ARGV[0]? $ARGV[0] : ""; my @switches = split /\s+/, $SNMP_switch; for my $switch (@switches) { open (SNMP, "$snmpwalk -OnQ -v1 -c $SNMP_community $switch $SNMP_FdbAddress|"); while(<SNMP>) { s/"//g; s/^\s*//g; s/\s*$//g; next if /^$/; my ($oid, $mac) = split /\s*=\s*/; $oid =~ s/^$SNMP_FdbAddress//; $mac =~ s/\ /:/g; $mac =~ s/([A-Z])/\l$1/g;mac_table{
mac} = `$snmpwalk -OvnQ -v1 -c $SNMP_community $switchSNMP_FdbPort
oid`; chomp $mac_table{$mac}; # $mac_table{$mac} .= "(switch $switch)"; if (!$mac_to_find) { print $mac," -> ",$mac_table{$mac}," ", get_name_by_port_index(get_index_by_port_id($mac_table{$mac}, $switch), $switch), "($switch)","\n"; } } close(SNMP); if ($mac_to_find && defined($mac_table{$mac_to_find})) { $mac = $mac_to_find; print $mac," -> ",$mac_table{$mac}," ", get_name_by_port_index(get_index_by_port_id($mac_table{$mac}, $switch), $switch), "($switch)","\n"; } }
При создании скрипта обратите внимание на значения:
Запуск скрипта на исполнение.
Запустите скрипт на исполнение.
Укажите в качестве параметра MAC-адрес устройства, которое
нужно найти (здесь 00:01:02:03:04:05
):
# get-port-by-mac 00:01:02:03:04:05
Используйте в качестве MAC-адреса адрес одной из сетевых плат хостов, присутствующих в сети.
С помощью скрипта, представленного ниже, организовать автоматическое обнаружение новых компьютеров в сети.
Как только в сети появляется новый компьютер,
информация об этом должна сразу же появляется
в файле /tmp/arp.log
(или приходить по почте пользователю, имя которого указанно
в переменной $mail_to
)
# vi /usr/local/bin/watch-for-new-devices
#!/usr/bin/perl -w # (c) igor chubin, 2005 my $mail_to = "root"; my $known_mac_addresses = "/var/known_mac_list"; my $nbtscan = "/usr/local/bin/nbtscan"; my $getport = "/usr/local/bin/get-port-by-mac"; my $arg1 = join " ", @ARGV; $arg1 =~ /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/; my $ip = defined($1) ? $1 : ""; $arg1 =~ /([0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+)/i; my $mac = defined($1) ? $1 : ""; $arg1 =~ /arpwatch:\s+([^0-9]*)\s+[0-9]/i; my $reason = defined($1) ? $1 : ""; 1 while $mac =~ s/:(.):/:0$1:/g; $mac =~ s/^(.):/0$1:/g; if ($ip) { if (!`grep -i $mac $known_mac_addresses` or $reason eq 'changed ethernet address' or $reason eq 'flip flop' ) { my $nbtscan_output; open (NBTSCAN, "$nbtscan $ip|") or $nbtscan_output="cant run nbtscan $!"; my @nbtscan = <NBTSCAN>; close(NBTSCAN); $nbtscan_output = join "", @nbtscan unless $nbtscan_output; my $port=""; $port = `$getport $mac` if $getport; # Uncoment this line if you want to write messages to file # instead of mailing to user #open (LOG, ">>/tmp/arp.log"); open (LOG, "| mail -s 'ARPWatch Logger' $mail_to"); print LOG "$arg1\n"; print LOG "ip=$ip\n"; print LOG "mac=$mac\n"; print LOG "reason=$reason\n"; print LOG "switch port=$port\n" if $port; print LOG "% nbtscan $ip\n${nbtscan_output}\n"; close(LOG); } }
© 2002-2005 Игорь Чубин |
Учебный центр Сетевые Технологии, ug-ids, 2006-06-25 |
Слушатель отсутствует, ДЕМО-ВЕРСИЯ |