Вывести список mac адресов

ARP: определение MAC адресов в локальной сети

ARP (англ. Address Resolution Protocol — протокол определения адреса) — протокол в компьютерных сетях, предназначенный для определения MAC-адреса по IP-адресу другого компьютера. Существуют следующие типы сообщений ARP: запрос ARP (ARP request) и ответ ARP (ARP reply). Система-отправитель при помощи запроса ARP запрашивает физический адрес системы-получателя. Ответ (физический адрес узла-получателя) приходит в виде ответа ARP.

Компьютер А (IP-адрес 192.168.1.1) и компьютер Б (IP-адрес 192.168.1.2) соединены сетью Ethernet. Компьютер А желает переслать пакет данных на компьютер Б, IP-адрес компьютера Б ему известен. Компьютеру А для осуществления передачи через Ethernet требуется узнать MAC-адрес компьютера Б в сети Ethernet. Для этой задачи и используется протокол ARP.

Компьютер А отправляет широковещательный запрос, адресованный всем компьютерам в одном с ним широковещательном домене. Суть запроса: «компьютер с IP-адресом 192.168.1.2, сообщите свой MAC-адрес компьютеру с МАС-адресом . ». Этот запрос доставляется всем устройствам в том же сегменте Ethernet. Компьютер Б отвечает компьютеру А на запрос и сообщает свой MAC-адрес.

Протокол имеет буферную память (ARP-таблицу), в которой хранятся пары адресов (IP-адрес, MAC-адрес) с целью уменьшения количества посылаемых запросов, следовательно, экономии трафика и ресурсов. Записи ARP-таблицы бывают двух вид видов: статические и динамические. Статические добавляются самим пользователем, динамические же — создаются и удаляются автоматически. При этом в ARP-таблице всегда хранится широковещательный физический адрес FF:FF:FF:FF:FF:FF.

Команда arp в Windows

Позволяет просмотреть ARP-таблицу, добавить в нее новую запись или удалить существующую:

Читайте также:  Что такое вывести за штат организации

Создать запись в ARP-таблице:

Вывести записи ARP-таблицы:

Команда arp в Linux

Позволяет просмотреть ARP-таблицу, добавить в нее новую запись или удалить существующую:

Создать запись в ARP-таблице:

Вывести записи ARP-таблицы:

Альтернативный способ просмотра записей таблицы — команда

Источник

Получить все MAC адреса устройств в локальной сети

Итак, перед Вами поставлена задача, провести соответствие устройств с их MAC адресами в локальной сети, как бы вы поступили? Вопрос номер два: а для чего все это нужно, таким образом, я преследую несколько целей:

  • Составить список всех зарегистрированных устройств
  • Настроить авторизацию в сети только тех устройств из первого списка, которые реально определяют те устройства, которые реально работают и я их знаю, в общем как то так, позже обобщу все-то чего я хочу добиться этим пунктом.

План исполнения поставленной задачи:

  1. Просканировать локальную сеть по маске, используемой на предприятии, но может быть, что машины закрыты фаерволом, поэтому нужно посылать arp request ’ы.
  2. Посредством ARP запрос проверить каждый узел сети на получение его MAC адреса, уникального идентификатора устройства.

MAC адрес – это, к примеру:

C:\Users\ekzorchik>ping -n 1 192.168.0.1

Обмен пакетами с 192.168.0.1 по с 32 байтами данных:

Ответ от 192.168.0.1: число байт=32 время=2мс TTL =128

C:\Users\ekzorchik>arp -a 192.168.0.1

Интерфейс: 192.168.0.186 — 0 xb

адрес в Интернете Физический адрес Тип

192.168.0.1 00-15-5 d -0 a -06-00 динамический -> вот это и есть MAC адрес устройства, где первые 6 байт: 00-15-5 d это идентификатор производителя, вычисляется он по полной базе (Задача: прикрутить к скрипту опознавание кто это), а следующие 6 байт – это уникальный идентификатор сетевого адаптера установленного в системе.

Как я бы решал поставленную задачу:

Т.к. я преимущественно отожествляю себя, как Ubuntu специалист, то и средство на котором я буду разбирать пути решения – это система Ubuntu 12.04.5 серверная редакция:

Получить результат можно следующими способами:

А) Утилита arpscan – данная утилита может просканировать все сеть и получить заветные значения: IP & MAC

$ sudo apt-get install arp-scan –y

Запускаю утилиту на сканирование текущей сети, в которой сетевой адаптер получил от DHCP сервера IP адрес:

$ arp-scan —interface=eth0 —localnet

You need to be root, or arp-scan must be SUID root, to open a link-layer socket.

link _ open : Operation not permitted

Как видно выше и из документации ( arpscan – help ) утилита может работать только с правами root , поэтому задействуем утилиту sudo для предоставления ей таких прав на запуск:

$ sudo arp-scan —interface=eth0 —localnet

Interface: eth0, datalink type: EN10MB (Ethernet)

Starting arp-scan 1.8.1 with 256 hosts (http://www.nta-monitor.com/tools/arp-sca n/)

192.168.0.1 00:15:5d:0a:06:00 Microsoft Corporation

192.168.0.2 00:15:5d:0a:06:01 Microsoft Corporation

192.168.0.3 00:50:56:9c:25:c3 VMware, Inc.

192.168.0.5 00:21:91:fb:c9:45 D-Link Corporation

192.168.0.6 00:22:64:0a:e0:e8 Hewlett Packard

192.168.0.7 00:15:17:fa:a6:ac Intel Corporate

192.168.0.9 00:15:5d:0a:06:0d Microsoft Corporation

192.168.0.10 00:0c:29:34:c4:b4 VMware, Inc.

192.168.0.11 00:0c:29:c2:ee:15 VMware, Inc.

192.168.0.12 d8:eb:97:d0:5d:0d (Unknown)

Здесь я прерываю список, т.к. он очень большой, что теперь я могу сделать:

Сохранить его в txt

Открыть в программе LibreOffice Calc и произвести с ним некоторое форматирование, добавив такие колонки, как: Сервис на этом IP адресе, местонахождение устройства.

На заметку: Также можно использовать данную утилиту не для всего пула устройства в сети, а для конкретных IP адресов:

$ sudo arp-scan —interface=eth0 192.168.0.1 192.168.0.20 192.168.0.10

Interface: eth0, datalink type: EN10MB (Ethernet)

Starting arp-scan 1.8.1 with 3 hosts (http://www.nta-monitor.com/tools/arp-scan/)

192.168.0.20 00:15:17:73:be:84 Intel Corporate

192.168.0.1 00:15:5d:0a:06:00 Microsoft Corporation

192.168.0.10 00:0c:29:34:c4:b4 VMware, Inc.

6 packets received by filter, 0 packets dropped by kernel

Ending arp-scan 1.8.1: 3 hosts scanned in 0.106 seconds (28.30 hosts/sec). 3 responded

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

$ sudo arp-scan —interface=eth0 192.168.0.0/24

$ sudo arp-scan —interface=eth0 192.168.0.0:255.255.255.0

Просканировать локальную сеть, огранив результаты, указанным диапозоном IP адресов:

$ sudo arp-scan —interface=eth0 192.168.0.1-192.168.0.10

Interface: eth0, datalink type: EN10MB (Ethernet)

Starting arp-scan 1.8.1 with 10 hosts (http://www.nta-monitor.com/tools/arp-scan/)

192.168.0.1 00:15:5d:0a:06:00 Microsoft Corporation

192.168.0.2 00:15:5d:0a:06:01 Microsoft Corporation

192.168.0.3 00:50:56:9c:25:c3 VMware, Inc.

192.168.0.6 00:22:64:0a:e0:e8 Hewlett Packard

192.168.0.5 00:21:91:fb:c9:45 D-Link Corporation

192.168.0.7 00:15:17:fa:a6:ac Intel Corporate

192.168.0.9 00:15:5d:0a:06:0d Microsoft Corporation

192.168.0.10 00:0c:29:34:c4:b4 VMware, Inc.

11 packets received by filter, 0 packets dropped by kernel

Ending arp-scan 1.8.1: 10 hosts scanned in 0.363 seconds (27.55 hosts/sec). 8 responded

В комплекте с утилитой идет также утилита : arpfingerprint – которая по своей базе отпечатком может косвенно определить, к какому типу операционных систем принадлежит тот или иной IP адрес:

$ sudo arp-fingerprint -o «—interface=eth0 —numeric» 192.168.0.1

192.168.0.1 11110100000 FreeBSD 5.3, 7.0, DragonflyBSD 2.0, Win98, WinME, NT4, 2000, XP, 2003, Catalyst IOS 12.0, 12.1, 12.2, FortiOS 3.00

$ sudo arp-fingerprint -o «—interface=eth0 —numeric» 192.168.0.10

192.168.0.10 01010100000 Linux 2.2, 2.4, 2.6, Vista, 2008, Windows7

Из обоих примеров, я вынес для себя, что получаемые результаты слишком расплывчаты и не могут со 100% точностью характеризовать систему.

Также очень интересным считаю, это выявление факта того, что в сети каким либо образом появляется двойник (конфликт) с точно таким же IP адресом как и у зарегистрированного клиента:

$ sudo arp-scan —interface=eth0 —arpspa=dest 192.168.0.10

За дополнительными параметрами следует обращаться к справочной информации: man arp — scan

Б) Вторым способом получения, точно такого же результата, как выше из утилиты arpscan является сетевой сканер безопасности: — nmap

$ sudo apt-get install nmap –y

На заметку: обозначение опций используемых для получения результата: IP = MAC

— sP -> Пинг сканирование — просто определить, работает ли хост

— PR -> Задействовать проверку ARP Ping ,т.е. по хосту определить производителя сетевой карточки.

$ sudo nmap -sP -PR 192.168.0.* | head -n 20

Starting Nmap 5.21 ( http://nmap.org ) at 2015-02-09 09:34 MSK

Nmap scan report for server.dsplit.local (192.168.0.1)

Host is up (0.0030s latency).

MAC Address: 00:15:5D:0A:06:00 (Microsoft)

Nmap scan report for ekt-ts10.dsplit.local (192.168.0.2)

Host is up (0.0027s latency).

MAC Address: 00:15:5D:0A:06:01 (Microsoft)

Nmap scan report for tserver.dsplit.local (192.168.0.3)

Host is up (0.0027s latency).

MAC Address: 00:50:56:9C:25:C3 (VMware)

Nmap scan report for vmw1.dsplit.local (192.168.0.5)

Host is up (0.0082s latency).

MAC Address: 00:21:91:FB:C9:45 (D-Link)

Nmap scan report for 192.168.0.6

$ sudo nmap -sP 192.168.0.1/24 | grep ‘MAC’ | awk ‘

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

В) Третьим способом это использование расширенной версии стандартной утилиты ping , а именно утилита fping которая проверяет доступность систем в сети путем отправки ICMP ECHO _ REQUEST пакетов, но с указанием нескольких узлов или тектового файла со списком узлов

$ sudo apt-get install fping –y

Определить список хостов, которые находятся online в сети:

$ fping -g 192.168.0.1/24 2>&1 | grep alive

192.168.0.1 is alive

192.168.0.2 is alive

192.168.0.3 is alive

192.168.0.5 is alive

192.168.0.6 is alive

Определить все живые хосты в сети и произвести их опрос на предмет, какой сетевой адаптер установлен на этой системе:

$ fping -r0 -g 192.168.0.1/24 2>&1 | grep alive | arp –a

$ fping -r0 -g 192.168.0.1/24 2>&1 | grep alive | arp -a | grep -v «incomplete»

npi04e51e (192.168.0.199) at bc:5f:f4:af:c6:c5 [ether] on eth0

? (192.168.0.130) at 00:09:45:58:04:be [ether] on eth0

constr-i7 (192.168.0.65) at 14:14:4b:1e:25:f9 [ether] on eth0

? (192.168.0.158) at 00:09:45:58:03:9e [ether] on eth0

ws13 (192.168.0.93) at 8c:89:a5:29:38:67 [ether] on eth0

meb-015 (192.168.0.154) at e0:cb:4e:82:95:0e [ether] on eth0

? (192.168.0.24) at d8:eb:97:d2:ae:c2 [ether] on eth0

? (192.168.0.89) at 00:09:45:59:27:ae [ether] on eth0

? (192.168.0.150) at 00:0b:82:25:75:9f [ether] on eth0

android-2c8fcfe7f74b52e1 (192.168.0.85) at a0:b3:cc:ca:07:71 [ether] on eth0

holml (192.168.0.146) at 00:0c:29:21:16:82 [ether] on eth0

, где значение наиболее нужных в пояснение ключей:

grep — v « incomplete « –> исключить из вывода строки содержащие слово “ incomplete ”

Также можно и так:

Определяем широковещательный адрес в сети:

$ ifconfig | grep «Bcast»

inet addr:192.168.0.10 Bcast:192.168.0.255 Mask:255.255.255.0

Делаем запрос к широковещательному адресу в сети:

$ pinb -b -c1 192.168.0.255

А теперь производим запрос к локальному кэшу для извлечения информации по IP адресам и их MAC адресам:

? (192.168.0.89) at 00:09:45:59:27:ae [ether] on eth0

? (192.168.0.187) at 00:09:45:59:cb:96 [ether] on eth0

? (192.168.0.170) at 00:09:45:58:03:86 [ether] on eth0

? (192.168.0.62) at 34:08:04:16:31:36 [ether] on eth0

? (192.168.0.157) at 00:09:45:58:03:9c [ether] on eth0

client4 (192.168.0.66) at 00:09:45:5a:a3:4c [ether] on eth0

? (192.168.0.57) at 00:09:45:5a:f4:5e [ether] on eth0

tserver.dsplit.local (192.168.0.3) at 00:50:56:9c:25:c3 [ether] on eth0

c377a6442 (192.168.0.40) at 14:14:4b:b1:76:90 [ether] on eth0

pc (192.168.0.134) at 00:09:45:59:f8:16 [ether] on eth0

? (192.168.0.192) at f8:d1:11:88:21:1c [ether] on eth0

ws17 (192.168.0.175) at 00:09:45:58:04:c6 [ether] on eth0

npi05c1a0 (192.168.0.51) at 2c:44:fd:05:c1:a0 [ether] on eth0

? (192.168.0.158) at 00:09:45:58:03:9e [ether] on eth0

rpcws (192.168.0.182) at 00:09:45:5a:a2:64 [ether] on eth0

? (192.168.0.58) at 00:09:45:58:03:96 [ether] on eth0

Вывод: утилита также отрабатывает поставленную задачу, после конечно загруженный вывод в программу LibreOffice Calc позволит привести результаты к упорядоченному представлению.

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

На этом считаю, данную заметку завершенной, я добился решения поставленной задачи по первому пункту, второй же предусматривает тонкую настройку оборудования, посредством которого будет ограничиваться доступ, а это уже тема отдельной заметки. В последствии я, конечно же покажу, как я это делал. А пока все, с уважением – автор блога ekzorchik.

Источник

Получаем списки mac-адресов на портах управляемых свичей в Zabbix

Сбор информации и теория

В поисках информации о том, как это сделать, был спрошен Гугл, и после непродолжительных поисков был найден чудесный документ за авторством Cisco, описывающий алгоритм получения искомых адресов и определения портов, на которых они фигурируют.
Беглое изучение выводов snmpwalk со свича 3Com 4200G показало, что в моем случае даже не требуется определять vlan, и достаточно всего трех шагов для определения MAC-адресов по портам.

Как вы можете понят из документации, нам всего-то надо:
1) получить список адресов командой
$snmpwalk -c public -v 2c hostname .1.3.6.1.2.1.17.4.3.1.1

17.4.3.1.1.0.0.12.7.172.8 = Hex: 00 00 0C 07 AC 08
17.4.3.1.1.0.1.2.27.80.145 = Hex: 00 01 02 1B 50 91
17.4.3.1.1.0.1.3.72.77.90 = Hex: 00 01 03 48 4D 5A
17.4.3.1.1.0.1.3.72.221.191 = Hex: 00 01 03 48 DD BF
.

2) получить спискок портов командой
$snmpwalk -c public -v 2c hostname .1.3.6.1.2.1.17.4.3.1.2
17.4.3.1.2.0.0.12.7.172.8 = 13
17.4.3.1.2.0.1.2.27.80.128 = 13
17.4.3.1.2.0.1.2.27.80.145 = 13
17.4.3.1.2.0.1.2.163.145.225 = 13
.

Если мы опрашиваем простой свич, то вот этот чудесный номер (13 в примере) — это и есть наш порт на свиче.

3) Осталось только найти соответствие между номерами OIDов, и мы увидим, что OIDы, оканчивающиеся на 12.7.172.8 дадут нам mac и номер порта, на котором этот mac висит.

Переходим от теории к практике

Чтобы это все дело автоматизировать, я набросал простенький скрипт на перле (UPDATE0: код обновлен по совету gescheit; UPDATE1: код еще раз обновлен по совету FreeLSD)

use strict;
use Net::SNMP qw ( snmp_dispatcher oid_lex_sort ) ;

my $show_vendor = 1 ;
my $script = «/usr/share/zabbix/scripts/mac.sh -s» ;
my $debug = 0 ;
my $file_name = «/tmp/ $ARGV [0]-getmac.tmp» ;
my $interval = 90 ; #refresh rate
my $new = 0 ;
my @ list;
my $write_secs = ( stat ( $file_name ) ) [ 9 ] ;
if ( $debug == 1 ) <
print «file $file_name updated at » , scalar ( localtime ( $write_secs ) ) , » \n » ;
> ;
if ( $write_secs + $interval time ) < #file updated less then $interval seconds ago
if ( $debug == 1 ) < print "generating new mac table \n " ; >
$new = 1 ;
open FH, «> $file_name » or die «can’t open ‘ $file_name ‘: $!» ;
> else <
if ( $debug == 1 ) < print "using old mac table \n " ; >
open FR, » $file_name » or die «can’t open ‘ $file_name ‘: $!» ;
while ( my $line = FR > ) <
chomp ( $line ) ;
my ( $p , $m ) = split / ; / , $line ;
@ list [ $p ] = «@list[ $p ] $m , » ;
>
>
#=====================================
my $session ;
my $error ;
my $port = $ARGV [ 1 ] ;
if ( $new == 1 ) <
#=== Setup session to remote host ===
( $session , $error ) = Net::SNMP- > session (
-hostname = > $ARGV [ 0 ] || ‘localhost’ ,
-community = > ‘public’ ,
-version = > ‘2c’ ,
-translate = > [ -octetstring = > 0 ] ,
-port = > 161
) ;
#=== Was the session created? ===
if ( ! defined ( $session ) ) <
printf ( «ERROR: %s \n » , $error ) ;
exit 1 ;
>
> ;
#==================================

#=== OIDs queried to retrieve information ====
my $TpFdbAddress = ‘1.3.6.1.2.1.17.4.3.1.1’ ;
my $TpFdbPort = ‘1.3.6.1.2.1.17.4.3.1.2’ ;
#=============================================
my $result ;
my @ tmp;
my $x ;
if ( $new == 1 ) <
if ( defined ( $result = $session — > get_table ( $TpFdbAddress ) ) ) <
foreach ( oid_lex_sort ( keys ( % < $result >) ) ) <
$x = unpack ( ‘H*’ , $result — > < $_ >) ;
$x =

s / ( .. ( ? ! \Z ) ) / \ 1 : / g;
push ( @ tmp, $x ) ;
>
> else <
if ( $debug == 1 ) <
printf ( «ERROR: %s \n \n » , $session — > error ( ) ) ;
>
>
#==========================================
#=== Print the returned MAC ports ===
$result ;
if ( defined ( $result = $session — > get_table ( -baseoid = > $TpFdbPort ) ) ) <
my $i = 0 ;
my $out = «» ;
my $res = 0 ;
my $tmp_port ;
my $tmp_mac_list = «» ;
foreach ( oid_lex_sort ( keys ( % < $result >) ) ) <
if ( $result — > < $_ >== $port ) <
$res = 1 ;
if ( $show_vendor == 1 ) <
$out = ` $script $tmp [ $i ] ` ;
printf ( «%s(%s)» , $tmp [ $i ] , $out ) ;
> else <
printf ( «%s» , $tmp [ $i ] ) ;
> ;
print «, » ;
> ;
if ( $show_vendor == 1 ) <
$out = ` $script $tmp [ $i ] ` ;
printf FH ( «%s;%s(%s) \n » , $result — > < $_ >, $tmp [ $i ] , $out ) ;
> else <
printf FH ( «%s;%s \n » , $result — > < $_ >, $tmp [ $i ] ) ;
> ;
$i ++;
>
if ( $res == 0 ) <
print «null» ;
> ;
> else <
if ( $debug == 1 ) <
printf ( «ERROR: %s \n \n » , $session — > error ( ) ) ;
> else <
print «null» ;
> ;
>
> else <
if ( @ list [ $port ] ) <
print «@list[ $port ]» ;
> else <
print «null» ;
> ;
>
print » \n » ;
#=============================================
#=== Close the session and exit the program ===
if ( $new == 1 ) <
$session — > close;
close FH;
> else <
close FR;
>
exit 0 ;

Код очень бесхитростный, если нет файлика с уже полученными OIDами, то мы получаем OIDы с mac-адресами, и пишем в массив. А потом в такой же последовательности получаем OIDы с портами, что дает нам соответствие n-го значения в массиве n-му значению полученного OIDа с номером порта. Затем скидываем полученные данные в файлик.
Если же файлик при старте скрипта уже есть, и он не старше $interval, который в моем случае составляет 90 секунд — то берем данные из него. Это позволило использовать всего 2 snmp запроса на свич.
Скрипт принимает на вход два параметра, первый из которых это адрес устройства (такова специфика zabbix, для внешних скриптов всегда первым параметом будет адрес узла сети), а вторым параметром — интересующий нас номер порта. Если на этом порту адресов нет, скрипт вернет строку с текстом «null». В новой версии мы еще можем узнавать производителя устройства по mac-адресу. Для включения этой возможности существует переменная $show_vendor, при значении которой, равном единице, скрипт пытается получить данные о производителе от другого скрипта, указанного в переменной script. Этому скрипту передается mac-адрес утройства. Для себя, я реализовал довольной простой скрипт на sh, вся суть которого сводится к запуску одной строки:

Таинственный файлик, скрывающийся под переменной $filename, получается по ссылке, и содержит все нужные нам данные, заботливо вобранные ieee.

Я эту одну строчку слегка доработал, добавив даже режим «обновления», выкачивающий самую свежу версию списка производителей. Вот что получилось в итоге:

#!/bin/sh
#get vendor from mac-address
if [ -z «$1» ] ; then
echo «no args specified, exiting! Use $0 [-option] mac»
echo «where [-option] can be -u (update databse and exit) or -s (silent mode, just show vendor)»
exit 1
fi
#don’t forget that Zabbix don’t set $PATH when running scripts
filename = / usr / share / zabbix / scripts / oui.txt
tmpfile = / tmp / oui.txt
link =http: // standards.ieee.org / develop / regauth / oui / oui.txt
sed = / bin / sed
awk = / bin / awk

case $ 1 in
-s )
silent = 1
mac =$ 2
if [ -z «$2» ] ; then
echo «no mac specified, exiting!»
exit 1
fi
;;
-u )
wget $link -O $tmpfile
if [ $? -gt 0 ] ; then
echo «download error, exiting»
exit 1
else
echo «Download ok!»
echo «Moving $tmpfile to $filename . »
mv -f $tmpfile $filename
if [ $? -gt 0 ] ; then
echo «Error!»
else
echo «Success!»
fi
exit 0
fi
;;
* )
mac =$ 1
;;
esac
if [ ! -f $filename ] ; then
if [ -z $silent ] ; then
echo «no mac list file, dowload it? [y/n]»
else
exit 1
fi
while :
do
read INPUT_STRING
case $INPUT_STRING in
y )
echo «Trying to download from $link »
wget $link -O $filename
if [ $? -gt 0 ] ; then
echo «download error, exiting»
exit 1
else
echo «Download ok!»
fi
break
;;
n )
echo «exiting!»
exit 0
;;
* )
echo «wrong input, use [y/n]»
;;
esac
done
fi
if [ $ <#mac>-lt 8 ] ; then
mac = ` echo » $mac » | $sed ‘s/^\(..\)\(..\)\(..\)/\1-\2-\3/’ `
else
mac = ` echo » $mac » | $sed -e ‘s/:/-/g’ `
fi
mac = $
if [ -z $silent ] ; then
echo «Searching for $mac . »
fi
result = ` $awk —assign IGNORECASE = 1 ‘/hex/ && /’ $mac ‘/ if [ -z » $result » ] ; then
result = «no info»
fi
echo -n $result

Запустим скрипт, выдающий нам производителя, для проверки на работоспособность:

$./mac.sh «000000»
no mac list file, dowload it? [y/n]
y
Trying to download from standards.ieee.org/develop/regauth/oui/oui.txt
—2011-10-06 14:20:16— standards.ieee.org/develop/regauth/oui/oui.txt
Распознаётся proxy.organization.ltd. 192.168.0.1
Устанавливается соединение с proxy.organization.ltd|192.168.0.1|:3128. соединение установлено.
Запрос Proxy послан, ожидается ответ. 200 OK
Длина: 2493060 (2,4M) [text/plain]
Saving to: «oui.txt»

2011-10-06 14:20:26 (784 KB/s) — «oui.txt» saved [2493060/2493060]

Download ok!
Searching for 00-00-00.
XEROX CORPORATION

Если все работает, двигаемся дальше.

Теперь надо в конфиге zabbixa настроить время выполнения скрипта, увеличив его до нужных значений. Если выбранного вами значения таймаута будет недостаточно, вы сразу это поймете, поскольку элементы данных, отражающие mac-адреса, будут один за одним переходить в категорию «неподдердживаемые» с описанием ошибки вроде «script execution timeout».
Правим конфиг:
#vim /etc/zabbix/zabbix-server.conf

Ищем там такие строки
### Option: Timeout
# Specifies how long we wait for agent, SNMP device or external check (in seconds).
# Range: 1-30

и раскомментируем и меняем на нужное значение
Timeout=5

Там же ищем
### Option: ExternalScripts
# Location of external scripts
ExternalScripts=/usr/share/zabbix/scripts/

и при необходимости меняем на правильный путь к скриптам.
Вот по этому пути мы наш скрипт на перле и располагаем. Я его назвал бесхитростно — get_mac.pl

Теперь мы в Zabbix настроим в шаблоне для свича нужный тип данных:

И так для всех портов.

После этого, вы можете получать данные об адресах на портах свича прямо в zabbix.
У меня это выглядит так (обновленный скриншот с именами производителей выложить не могу, поскольку хабрасторадж не работает без флеша, а с гуглохромовским флешем не работает тоже):

Не пугайтесь, глядя на 16 порт — это аплинк.

Данная методика проверена и успешно работает уже месяц на девяти свичах марки 3Com: 4200G, 4210, 2916, 2924. Версия Zabbix 1.8.5, недавно обновил на 1.8.7. Учитывая, что я писал все это по документации Cisco, для свичей Cisco проблем также быть не должно.

Источник

Оцените статью