Cisco SNMP получение MAC-адресов на интерфейсе роутера
Для получения списка MAC-адресов на том или ином интерфейсе роутера Cisco можно зайти на роутер и дать команду show arp. В результате нам будут показаны все адреса со всех интерфейсов роутера. А если взять случай с сетью в которой имеется около полусотни роутеров, да ещё вспомнить, что в каждой из сетей пара сотен компьютеров. А ещё в некоторых сетях по три или десять VLAN. Вот тогда ручная задача будет крайне затруднительна. И нам на помощь приходит Python. Раньше нечто аналогичное я делал с использованием библиотеки pexpect, с помощью которой я подключался по SSH к каждому роутеру и потом анализировал полученные данные. Но с использованием SNMP на Cisco и библиотеки pysnmp можно одним запросом получить список IP-адресов и MAC-адресов на интересующих интерфейсах.
Для запроса используется OID: 1.3.6.1.2.1.4.22.1.2.N, где N это номер интерфейса. Конечно, можно взять уровень выше и запросить MAC со всех интерфейсов: 1.3.6.1.2.1.4.22.1.2. Я не буду публиковать огромную портянку, которая опрашивает кучу устройств используя данные со SQL-сервера, иначе статья займёт катастрофический объём и ограничусь выводом заранее прописанного IP-адреса роутера. А дальше вы подправите под свои нужды.
#!/usr/bin/python3 # -*- coding: utf-8 -*- #project: orcinus.ru from pysnmp.entity.rfc3413.oneliner import cmdgen author = 'Kurilko Ivan' version = '1.0' # Адрес источника address = 'IP роутера' # Комьюнити железяки community = 'public' # Поехали описания OID ip_int_mac = '1.3.6.1.2.1.4.22.1.2' # MAC-адреса на интерфейсе def get_smtp(getvar): # Создание обьекта для запросов ComGeneretion = cmdgen.CommandGenerator() # Получаем список ответов на запрос errIndication, errStatus, errIndex, Data = ComGeneretion.nextCmd(cmdgen.CommunityData(community),cmdgen.UdpTransportTarget((address, 161)),getvar) if errIndication: return 1, errIndication else: if errStatus: return 2, errStatus.prettyPrint() else: return 0, Data err, data = get_smtp(ip_int_mac) if err > 0: print(data) sys.exit() else: for dataRow in data: for name, val in dataRow: names = name.prettyPrint() names = names.replace('SNMPv2-SMI::mib-2.4.22.1.2.', '') int_n = names[0:names.find('.')] names = names[names.find('.')+1:len(names)+1] vals = val.prettyPrint() vals = vals[2:6]+'.'+vals[6:10]+'.'+vals[10:14] print('Interface: %s IP: %s MAC: %s' % (int_n, names, vals))
Эта программа выведет номер интерфейса, IP-адресс и MAC-адресс устройств подключенных к маршрутизатору. Ещё раз напомню как включить SNMP на чтение для вашего роутера.
ip access-list standard SNMP_ACCESS_RO permit 192.168.192.21 permit 192.168.192.22 snmp-server community public RO SNMP_ACCESS_RO snmp-server ifindex persist
Результат работы скрипта:
Для установки пакета pysnmp под Windows необходимо запустить вот такие команды:
python.exe -m pip install --upgrade pip pip3.exe install pysnmp
Вы можете модифицировать этот скрипт для того, чтобы мониторить подключение и отключение оборудования в сети. Так же эту информацию можно использовать для инвентаризации сетевых устройств. Мне же потребовалось найти одно устройство среди всех филиалов, зная только MAC-адресс устройства.
Тэги: ИТ, Cisco, программирование, Питон
Отредактировано:2021-02-15 12:14:34