Cisco SNMP запрос информации об интерфейсах
По SNMP можно получить информацию об именах интерфейсов, полученных IP-адресах и масках подсети, а так же ещё очень много информации. Так как я периодически выкладывал свои наработки в сети и они «расползались» под видом чужих работ, то я плюнул и удалил всё, что писал для себя и друзей. Но в последнее время меня часто просят структурировать и вернуть скрипты которые я писал. Так как я сейчас активно пользуюсь языком программирования Python, то я буду всё переписывать и адаптировать под него.
Недавно возникла необходимость написать скрипт, который будет опрашивать роутеры Cisco и узнавать у них имена интерфейсов и IP-адреса с последующей выгрузкой в JSON. Но для примера я сделаю вывод данных о полученных значениях.
#!/usr/bin/python3 # -*- coding: utf-8 -*- #project: orcinus.ru import sys from pysnmp.entity.rfc3413.oneliner import cmdgen author = 'Kurilko Ivan' version = '1.3' # Адрес источника address = 'IP роутера' # Комьюнити железяки community = 'Public' interfaces = {} # Поехали описания OID ifindex_list = '1.3.6.1.2.1.4.20.1.2' # список IfIndex ifname = '1.3.6.1.2.1.31.1.1.1.1' # названия всех интерфейсов ifcomment = '1.3.6.1.2.1.31.1.1.1.18' # комментарии к интерфейсам ifmask = '1.3.6.1.2.1.4.20.1.3' # список масок 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(ifname) if err > 0: print(data) sys.exit() else: for dataRow in data: for name, val in dataRow: # Первый раз заполняем полностью, чтобы была совместимсть с нашим JSON interfaceProp = {'name':val.prettyPrint(), 'description':'', 'ip':'', 'mask':''} interfaceIndex = name.prettyPrint() interfaceIndex = interfaceIndex.replace('SNMPv2-SMI::mib-2.31.1.1.1.1.', '') interfaces[interfaceIndex] = interfaceProp # Добавляем комментарии к интерфейсам err, data = get_smtp(ifcomment) if err > 0: print(data) sys.exit() else: for dataRow in data: for name, val in dataRow: interfaceIndex = name.prettyPrint() interfaceIndex = interfaceIndex.replace('SNMPv2-SMI::mib-2.31.1.1.1.18.', '') interfaces[interfaceIndex]['description'] = val.prettyPrint() # Добавляем IP-адреса на интерфейсах err, data = get_smtp(ifindex_list) if err > 0: print(data) sys.exit() else: for dataRow in data: for name, val in dataRow: interfaceIndex = val.prettyPrint() interfaceIp = name.prettyPrint() interfaceIp = interfaceIp.replace('SNMPv2-SMI::mib-2.4.20.1.2.', '') interfaces[interfaceIndex]['ip'] = interfaceIp # Добавляем маски к IP err, data = get_smtp(ifmask) if err > 0: print(data) sys.exit() else: int_msk_ip = {} for dataRow in data: for name, val in dataRow: interfaceMask = val.prettyPrint() interfaceIp = name.prettyPrint() interfaceIp = interfaceIp.replace('SNMPv2-SMI::mib-2.4.20.1.3.', '') int_msk_ip[interfaceIp] = interfaceMask for interface, data in interfaces.items(): if data['ip'] in int_msk_ip: interfaces[interface]['mask'] = int_msk_ip[data['ip']] print ('Список подключенных интерфейсов:') for interface, data in interfaces.items(): if data['ip'] != '': print(data['description']) print(data['name'], data['ip'], data['mask'], '\n')
В принципе, тут нет ничего сложного, обычная отправка запроса и получение результата. Самое сложное в этом деле это найти нужные MIB и IOD для оборудования Cisco. Раньше у меня было несколько файлов предоставленных самой компанией CISCO, но я их не смог найти на вскидку. Хорошо, что у меня сохранились нужные мне IOD.
На всякий случай, напомню как включить работу SNMP на Cisco.
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
Не забываем о безопасности и привязываем ACL при запуске SNMP. По умолчанию на роутерах Cisco запускается SNMP второй версии. Хочу предостеречь от использования его через открытые сети связи. Этот протокол не поддерживает шифрования и вся информация передаётся в открытом виде.
Для установки пакета pysnmp под Windows необходимо запустить вот такие команды:
python.exe -m pip install --upgrade pip pip3.exe install pysnmp
Желаю успехов в освоении автоматизации управления вашим оборудованием. Если вас, интересует, что-то конкретное, то пишите и я с удовольствием отвечу на ваш вопрос или проверю интересующую вас информацию.
Тэги: ИТ, Cisco, программирование, Питон
Отредактировано:2021-02-15 12:05:01