аукцион / FPR / donate / услуги / RSS / распечатать / вход 
Мой мир
Вконтакте
Одноклассники

[29 января 2021 | 10 февраля 2021 | 12 февраля 2021]

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


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

Сообщайте мне о замеченных ошибках на: web@orcinus.ru. Все пожелания и советы будут учтены при дальнейшем проектировании сайта. Я готов сотрудничать со всеми желающими. В некоторых случаях, мнение автора может не совпадать с мнением автора! Phone: +7-902-924-70-49.

Top.Mail.Ru
Top.Mail.Ru LiveInternet Rambler's Top100 Яндекс.Метрика