SNMP мониторинг сетевого оборудования: настройка и ловушки

Основы протокола SNMP для сетевого администратора

Протокол SNMP (Simple Network Management Protocol) остаётся де-факто стандартом для мониторинга сетевого оборудования. Несмотря на появление gNMI, NETCONF и REST API, подавляющее большинство коммутаторов, маршрутизаторов, точек доступа и ИБП по-прежнему опрашиваются именно по SNMP. Протокол работает по модели «менеджер — агент»: станция управления (NMS) отправляет запросы GET/SET к агенту на устройстве, а агент может асинхронно генерировать уведомления (trap/inform).

Существуют три версии протокола. SNMPv1 — устаревшая, использует community string в открытом виде. SNMPv2c — наиболее распространённая в корпоративных сетях: добавляет GetBulk для массового опроса и улучшенную обработку ошибок, но аутентификация по-прежнему на основе community. SNMPv3 — единственная версия с реальной безопасностью: поддерживает аутентификацию (authNoPriv, authPriv) и шифрование (DES, AES-128/256).

Каждый управляемый параметр устройства представлен OID (Object Identifier) — числовой иерархией вида 1.3.6.1.2.1.2.2.1.10. Человекочитаемые имена (например, ifInOctets) определяются в MIB-файлах. Стандартные MIB описаны в RFC (IF-MIB, HOST-RESOURCES-MIB), а вендоры предоставляют приватные MIB для специфичных метрик — температура процессора, состояние вентиляторов, уровень PoE и т.д.

Порты и транспорт

SNMP использует UDP-порт 161 для запросов (GET/SET) и UDP-порт 162 для приёма trap-уведомлений. В SNMPv3 с inform-сообщениями используется подтверждение доставки на уровне протокола, что делает inform надёжнее обычных trap-ов. На межсетевых экранах необходимо открывать именно UDP, а не TCP:

# iptables — разрешить SNMP-опрос с NMS 10.0.1.50
iptables -A INPUT -p udp -s 10.0.1.50 --dport 161 -j ACCEPT
iptables -A INPUT -p udp --dport 162 -j ACCEPT

В средах с NAT SNMP trap-ы часто теряются — агент отправляет trap на IP менеджера, который может быть за NAT. Решение — настраивать trap destination на реальный маршрутизируемый адрес или использовать inform, чтобы хотя бы получить retransmit при потере.

Установка SNMP-утилит и загрузка MIB

На сервере мониторинга (Ubuntu/Debian) установите пакет snmp для клиентских утилит и snmp-mibs-downloader для стандартных MIB-файлов:

apt update
apt install -y snmp snmp-mibs-downloader libsnmp-dev

# Загрузить стандартные MIB
download-mibs

# Раскомментировать строку для автозагрузки MIB
sed -i 's/^mibs :$/# mibs :/' /etc/snmp/snmp.conf

После этого утилиты snmpwalk, snmpget, snmpbulkwalk начнут показывать человекочитаемые имена вместо числовых OID. Вендорские MIB-файлы (Cisco, MikroTik, Huawei) скачиваются с сайта производителя и помещаются в /usr/share/snmp/mibs/ или ~/.snmp/mibs/.

Проверка связи с устройством

Первый шаг диагностики — убедиться, что агент на устройстве отвечает:

# SNMPv2c — опрос sysDescr
snmpget -v2c -c public 192.168.1.1 sysDescr.0

# Полный обход дерева интерфейсов
snmpwalk -v2c -c public 192.168.1.1 ifDescr

# BulkWalk — значительно быстрее для больших таблиц
snmpbulkwalk -v2c -c public -Cr25 192.168.1.1 ifTable

Если устройство не отвечает, проверьте: 1) включён ли SNMP на устройстве; 2) совпадает ли community string; 3) не фильтрует ли ACL на устройстве адрес вашего NMS; 4) проходит ли UDP 161 через межсетевой экран. Полезно запустить tcpdump -i eth0 udp port 161 на обеих сторонах для захвата трафика.

Работа с MIB Browser

Для навигации по дереву OID удобно использовать консольный snmptranslate:

# Найти OID по имени
snmptranslate -On IF-MIB::ifInOctets
# .1.3.6.1.2.1.2.2.1.10

# Найти имя по OID
snmptranslate -Of .1.3.6.1.2.1.2.2.1.10
# iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifInOctets

# Показать дерево потомков
snmptranslate -Tp IF-MIB::ifTable

Для графического просмотра используйте iReasoning MIB Browser (кроссплатформенный, бесплатная версия достаточна) или веб-инструмент oidref.com для быстрого поиска стандартных OID.

Настройка SNMPv3 на оборудовании

Для продакшн-среды категорически рекомендуется SNMPv3 с аутентификацией и шифрованием (authPriv). Community string в SNMPv2c передаётся в открытом виде, что позволяет перехватить его при MITM-атаке и получить доступ к чтению (а иногда и записи) конфигурации устройства.

Пример настройки SNMPv3 на Cisco IOS:

! Создаём view — какие OID доступны
snmp-server view MONITORING iso included

! Создаём группу с authPriv
snmp-server group MONITOR-GRP v3 priv read MONITORING

! Создаём пользователя (SHA + AES128)
snmp-server user monitor-user MONITOR-GRP v3 auth sha MyAuthPass123 priv aes 128 MyPrivPass456

! Trap destination
snmp-server host 10.0.1.50 version 3 priv monitor-user

На MikroTik RouterOS:

/snmp set enabled=yes
/snmp community remove [find]
/snmp set trap-community="" trap-version=3

# Создаём SNMPv3 пользователя
/snmp community add name=v3user security=private \
  authentication-protocol=SHA1 authentication-password=MyAuthPass123 \
  encryption-protocol=AES encryption-password=MyPrivPass456 \
  addresses=10.0.1.50/32

Проверка SNMPv3 с клиента

После настройки проверьте связь утилитой snmpwalk с указанием параметров безопасности:

# authPriv — полная защита
snmpwalk -v3 -u monitor-user -l authPriv \
  -a SHA -A MyAuthPass123 \
  -x AES -X MyPrivPass456 \
  192.168.1.1 sysUpTime.0

# authNoPriv — только аутентификация без шифрования
snmpwalk -v3 -u monitor-user -l authNoPriv \
  -a SHA -A MyAuthPass123 \
  192.168.1.1 sysDescr.0

Типичная ошибка — несовпадение Engine ID при настройке inform-сообщений. Engine ID агента можно узнать командой snmpget -v3 -u monitor-user -l authPriv -a SHA -A pass -x AES -X pass 192.168.1.1 snmpEngineID.0. На Cisco IOS Engine ID генерируется автоматически из IP-адреса, но на некоторых платформах его нужно задавать вручную.

Настройка SNMP Trap и Inform

SNMP trap — это асинхронное уведомление от устройства к NMS. Ключевое отличие от polling: trap приходит немедленно при событии (link down, высокая температура, ошибка питания), а polling обнаружит проблему только при следующем опросе. Trap-ы критически важны для быстрого реагирования.

На сервере мониторинга настройте демон snmptrapd:

# /etc/snmp/snmptrapd.conf

# Для SNMPv2c
authCommunity log,execute,net public

# Для SNMPv3
createUser -e 0x80001F88043139322E3136382E312E31 monitor-user SHA MyAuthPass123 AES MyPrivPass456
authUser log,execute monitor-user

# Логирование в файл
[snmptrapd] logoption f /var/log/snmptrapd.log

# Обработчик — вызов скрипта при получении trap
traphandle default /usr/local/bin/trap_handler.sh

Запуск демона:

systemctl enable snmptrapd
systemctl start snmptrapd

# Проверка — отправить тестовый trap
snmptrap -v2c -c public 127.0.0.1 '' .1.3.6.1.4.1.99999 \
  .1.3.6.1.4.1.99999.1 s "Test trap message"

Скрипт обработки trap-уведомлений

Скрипт-обработчик получает данные trap через stdin:

#!/bin/bash
# /usr/local/bin/trap_handler.sh

LOGFILE="/var/log/snmp_traps_processed.log"
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')

# Читаем hostname и IP
read HOST
read IP

# Читаем OID/value пары
VARBINDS=""
while read OID VAL; do
  VARBINDS="$VARBINDS $OID=$VAL"
done

echo "[$TIMESTAMP] Host=$HOST IP=$IP $VARBINDS" >> $LOGFILE

# Отправка в Telegram при критических trap-ах
if echo "$VARBINDS" | grep -q 'linkDown\|coldStart\|authenticationFailure'; then
  curl -s -X POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/sendMessage" \
    -d chat_id="${TG_CHAT_ID}" \
    -d text="🚨 SNMP Trap: $HOST ($IP) — $VARBINDS"
fi

Не забудьте сделать скрипт исполняемым: chmod +x /usr/local/bin/trap_handler.sh.

Ключевые OID для мониторинга оборудования

При настройке мониторинга важно знать, какие OID опрашивать. Вот основные группы для типичного сетевого устройства:

МетрикаOIDMIB
Описание устройства1.3.6.1.2.1.1.1.0 (sysDescr)SNMPv2-MIB
Uptime1.3.6.1.2.1.1.3.0 (sysUpTime)SNMPv2-MIB
Имя интерфейса1.3.6.1.2.1.2.2.1.2 (ifDescr)IF-MIB
Статус интерфейса1.3.6.1.2.1.2.2.1.8 (ifOperStatus)IF-MIB
Входящий трафик1.3.6.1.2.1.31.1.1.1.6 (ifHCInOctets)IF-MIB
Исходящий трафик1.3.6.1.2.1.31.1.1.1.10 (ifHCOutOctets)IF-MIB
Ошибки входящие1.3.6.1.2.1.2.2.1.14 (ifInErrors)IF-MIB
Загрузка CPU (Cisco)1.3.6.1.4.1.9.9.109.1.1.1.1.8 (cpmCPUTotal5minRev)CISCO-PROCESS-MIB
Свободная RAM (Cisco)1.3.6.1.4.1.9.9.48.1.1.1.6 (ciscoMemoryPoolFree)CISCO-MEMORY-POOL-MIB
Температура (Cisco)1.3.6.1.4.1.9.9.13.1.3.1.3 (ciscoEnvMonTemperatureValue)CISCO-ENVMON-MIB

Для 64-битных счётчиков трафика (ifHCInOctets/ifHCOutOctets) обязательно используйте SNMPv2c или v3 — SNMPv1 не поддерживает Counter64. На загруженных интерфейсах (1 Гбит/с и выше) 32-битные счётчики переполняются за несколько секунд, давая ложные данные.

Расчёт скорости из счётчиков

Счётчики ifHCInOctets/ifHCOutOctets — монотонно возрастающие числа. Чтобы получить скорость, нужно вычислить дельту между двумя опросами:

# Формула:
# speed_bps = (counter_now - counter_prev) * 8 / interval_seconds

# Пример на Python:
import time
from pysnmp.hlapi import *

def get_counter(host, community, oid):
    iterator = getCmd(
        SnmpEngine(),
        CommunityData(community),
        UdpTransportTarget((host, 161)),
        ContextData(),
        ObjectType(ObjectIdentity(oid))
    )
    errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
    if errorIndication:
        raise Exception(str(errorIndication))
    return int(varBinds[0][1])

oid_in = '1.3.6.1.2.1.31.1.1.1.6.1'  # ifHCInOctets, ifIndex=1
c1 = get_counter('192.168.1.1', 'public', oid_in)
time.sleep(60)
c2 = get_counter('192.168.1.1', 'public', oid_in)

speed_mbps = (c2 - c1) * 8 / 60 / 1_000_000
print(f"Входящая скорость: {speed_mbps:.2f} Мбит/с")

Интеграция SNMP с Zabbix

Zabbix — наиболее популярная система мониторинга с встроенной поддержкой SNMP. Для массового мониторинга сетевого оборудования используется SNMP discovery (обнаружение интерфейсов) и шаблоны.

Порядок подключения устройства:

  1. В Zabbix Frontend создайте хост, укажите SNMP interfaces (IP, порт 161)
  2. На вкладке Macros задайте {$SNMP_COMMUNITY} или SNMPv3-параметры
  3. Привяжите шаблон — например, Template Net Cisco IOS SNMPv2
  4. Zabbix автоматически обнаружит интерфейсы через LLD (Low-Level Discovery)

Для SNMPv3 в макросах хоста задаются:

{$SNMPV3_USER}       = monitor-user
{$SNMPV3_AUTH_PASS}  = MyAuthPass123
{$SNMPV3_PRIV_PASS}  = MyPrivPass456
{$SNMPV3_AUTH_PROTO} = SHA
{$SNMPV3_PRIV_PROTO} = AES

Оптимизация SNMP-опроса в Zabbix

При мониторинге сотен устройств с тысячами интерфейсов нагрузка на SNMP poller возрастает. Ключевые настройки в /etc/zabbix/zabbix_server.conf:

# Количество SNMP poller процессов (по умолчанию 1!)
StartSNMPTrapper=1
StartPollers=10

# Bulk-запросы — запрашивать несколько OID за один пакет
# Настраивается на уровне элемента данных: Use bulk requests = Yes

# Таймаут SNMP (по умолчанию 3 сек — много для LAN)
Timeout=5

Для приёма trap-ов в Zabbix необходимо настроить snmptrapd для записи в файл, а Zabbix будет его читать:

# /etc/snmp/snmptrapd.conf
authCommunity log public
format2 %V\n%v\n
outputOption s

# Перенаправление в файл для Zabbix
[snmptrapd] logoption f /var/log/snmptrap/snmptrap.log

В конфиге Zabbix Server: SNMPTrapperFile=/var/log/snmptrap/snmptrap.log

Типичные проблемы и отладка SNMP

При внедрении SNMP-мониторинга администраторы сталкиваются с рядом характерных проблем:

  • Timeout: No Response — самая частая ошибка. Проверьте community/credentials, ACL на устройстве, firewall между NMS и агентом, и работает ли SNMP-сервис на устройстве
  • Counter32 wrap-around — 32-битные счётчики переполняются на быстрых интерфейсах. Используйте ifHCInOctets (Counter64) вместо ifInOctets
  • Index mismatch после перезагрузки — ifIndex может измениться после рестарта устройства. Используйте ifName или ifAlias для привязки вместо индекса
  • Высокая нагрузка на CPU устройства — слишком частый polling (каждые 10 сек) для устройства со слабым CPU. Увеличьте интервал до 60-300 сек для некритичных метрик

Отладка с помощью tcpdump и snmpwalk

При проблемах с SNMP полезно видеть реальный трафик:

# Захват SNMP-пакетов на сервере мониторинга
tcpdump -i eth0 -nn udp port 161 -vv -X

# Verbose-режим snmpwalk — показывает raw PDU
snmpwalk -v2c -c public -d 192.168.1.1 sysDescr

# Проверка доступности конкретного OID
snmpget -v2c -c public -r 3 -t 5 192.168.1.1 .1.3.6.1.2.1.1.1.0
# -r 3 — три повтора
# -t 5 — таймаут 5 секунд

# Массовая проверка всех коммутаторов из файла
while read IP; do
  RESULT=$(snmpget -v2c -c public -r 1 -t 2 $IP sysName.0 2>&1)
  if echo "$RESULT" | grep -q 'Timeout'; then
    echo "FAIL: $IP"
  else
    echo "OK: $IP — $RESULT"
  fi
done < switches.txt

Безопасность SNMP в корпоративной сети

SNMP — потенциально опасный протокол: через SNMP SET можно изменить конфигурацию устройства, а через GET — получить полную информацию о топологии сети. Рекомендации по защите:

  1. Используйте SNMPv3 authPriv — минимум SHA + AES128. MD5 и DES считаются слабыми
  2. Ограничьте ACL на устройствах — SNMP-запросы должны приниматься только с IP-адресов NMS
  3. Отключите SNMP write — если не используете SET, оставьте только read-only доступ
  4. Изолируйте management VLAN — SNMP-трафик не должен ходить через пользовательские сети
  5. Мониторьте authenticationFailure trap — это индикатор попыток подбора community string
# Cisco IOS — ACL для SNMP
ip access-list standard SNMP_ACL
 permit 10.0.1.50
 permit 10.0.1.51
 deny any log

snmp-server community s3cretRO RO SNMP_ACL
snmp-server community s3cretRW RW SNMP_ACL

# Включить trap при неудачной аутентификации
snmp-server enable traps snmp authentication

В идеале весь SNMP-трафик должен проходить через выделенный management-интерфейс устройства, а не через data-plane интерфейсы. Это особенно критично для маршрутизаторов, доступных из интернета.

Часто задаваемые вопросы

Trap — это «отправил и забыл»: агент отправляет UDP-пакет и не знает, дошёл ли он. Inform — надёжная версия trap: агент ожидает подтверждения (acknowledgement) от NMS и повторяет отправку при потере. Inform доступен в SNMPv2c и v3. Используйте inform для критичных уведомлений (link down, power failure), а trap — для информационных событий с допустимой потерей.

Зависит от метрики. Трафик и загрузка интерфейсов — каждые 60 секунд для точных графиков. Состояние портов (up/down) — каждые 30-60 секунд, но лучше дополнить trap-ами для мгновенного обнаружения. Температура и CPU — каждые 120-300 секунд. Инвентаризация (sysDescr, firmware) — раз в час или реже. Слишком частый опрос перегружает устройства со слабым CPU (например, бюджетные коммутаторы).

Да, SNMP работает через любой IP-канал, включая VPN. Однако UDP-пакеты могут теряться при нестабильном VPN-соединении, что приведёт к ложным срабатываниям (Timeout). Увеличьте количество retries и таймаут в NMS. Для trap-ов через VPN используйте inform вместо trap — inform будет повторять отправку. Также учитывайте MTU: SNMP-ответы с большими таблицами могут превышать MTU туннеля и фрагментироваться.

MIB-файлы не загружены или не подключены. Установите пакет snmp-mibs-downloader и выполните download-mibs. Затем в файле /etc/snmp/snmp.conf закомментируйте строку mibs : (именно так, с двоеточием). Для вендорских MIB — скачайте файлы с сайта производителя и поместите в /usr/share/snmp/mibs/. Проверьте командой snmptranslate -IR ifInOctets — она должна вернуть числовой OID.

Нужна помощь с настройкой?

Специалисты АйТи Фреш помогут с внедрением и настройкой — 15+ лет опыта, обслуживание от 15 000 ₽/мес

📞 Связаться с нами
#SNMP мониторинг#snmpwalk#SNMP trap#SNMPv3 настройка#мониторинг коммутаторов#OID сетевого оборудования#snmptrapd#MIB файлы
Комментарии 0

Оставить комментарий

загрузка...