惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Engineering at Meta
Engineering at Meta
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
量子位
腾讯CDC
The Cloudflare Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
云风的 BLOG
云风的 BLOG
Vercel News
Vercel News
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
L
LangChain Blog
aimingoo的专栏
aimingoo的专栏
The Hacker News
The Hacker News
T
The Exploit Database - CXSecurity.com
B
Blog
S
SegmentFault 最新的问题
P
Privacy & Cybersecurity Law Blog
T
Threatpost
博客园 - 聂微东
T
Tailwind CSS Blog
The Last Watchdog
The Last Watchdog
C
Check Point Blog
N
Netflix TechBlog - Medium
D
DataBreaches.Net
爱范儿
爱范儿
IT之家
IT之家
S
Secure Thoughts
M
MIT News - Artificial intelligence
NISL@THU
NISL@THU
C
Cisco Blogs
TaoSecurity Blog
TaoSecurity Blog
有赞技术团队
有赞技术团队
A
Arctic Wolf
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
Spread Privacy
Spread Privacy
Schneier on Security
Schneier on Security
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
雷峰网
雷峰网
Project Zero
Project Zero
博客园 - Franky
H
Heimdal Security Blog
A
About on SuperTechFans
Security Latest
Security Latest
Webroot Blog
Webroot Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hugging Face - Blog
Hugging Face - Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Использование SNMP Trap/Inform сообщений в мониторинге сети
Волков Олег · 2026-05-28 · via Все публикации подряд на Хабре

Средний

18 мин

9.9K

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

SNMP протокол задумывался как универсальное средство мониторинга и управления сетевыми устройствами, и изначально позволял как опрашивать устройство (агент), так и отправлять устройством (агентом) событие на сервер.

Для этого существует два сообщения - Trap и Inform.
И если трапы еще худо-бедно используются то про inform многие даже не слышали.

Но давайте по порядку, что же вообще может дать прием трапов или информов такого, чего не может дать опрос?

Сразу начну с интересного а потом перейдем к подробностям.

Представьте очень простую схему, есть коммутатор, и к нему подключен еще один коммутатор, пускай для упрощения это будет просто один линк.
Что-то случилось и связь с коммутатором пропала, разумеется, опрос его состояния по SNMP невозможен.

В какой-то момент связь восстановилась, и вот тут, если у вас правильно настроена отправка Inform сообщений на сервер, вам приходят сообщения с информацией а что же происходило в период отсутствия связи.

Конечно, можно посмотреть логи на устройстве, но это не одно и то же.

Или другой пример, у вас происходит кратковременное событие, ну к примеру, загрузка ЦПУ растет до 100% и затем снижается, но происходит это между опросами.
Можно конечно уменьшить интервал опроса но это тоже может быть нежелательно.

Можно настроить syslog с транспортом TCP но на большинстве устройств это никак делу не поможет, так как после восстановления связи сессия установится новая, и туда будут отправлены новые сообщения, а вот старые придется смотреть в локальном журнале на оборудовании.

Есть еще одна причина, по которой SNMP Trap/Inform предпочтительнее Syslog сообщений в некоторых случаях, и причина эта безопасность.

Большая часть сетевого оборудования, отправляет Syslog сообщения в незашифрованном виде.
Некоторое оборудование позволяет отправлять зашифрованные Syslog сообщения (используется TLS).

SNMP трапы же можно зашифровать если использовать версию 3 протокола, а SNMP версии 3 поддерживается практически повсеместно, в отличие от Syslog over TLS.

Однако в случае использования Trap/Inform сообщений версии 3, резко увеличивается сложность настройки как оборудования (агента) так и сервера.

Так как протокол SNMP версии 3, для формирования ключевого материала для шифрования/расшифровки сообщений использует параметр Engine ID а также пароли шифрования и аутентификации, то для того чтобы сервер мог расшифровать сообщение, он должен знать о том, какие параметры использовать для его расшифровки.

И во многих случаях это нужно заранее указать в файле настройки.

Зачастую нужно обязательно указывать engine id, имя пользователя, протоколы аутентификации и шифрования и пароли.

Рассмотрим случай:

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

Предположим, у нас есть основная группа коммутаторов и маршрутизаторов, на которых задан SNMP v3 пользователь snmpuser с протоколом аутентификации SHA и протоколом шифрования AES-128.

Также есть группа устаревшего оборудования, которое поддерживает только протоколы MD5 и DES, на нем мы настроили того же пользователя snmpuser, но с протоколами MD5/DES.

Есть оборудование доступное только через внешние каналы, на нем мы настроили пользователя snmpuser256256, с протоколами sha256/aes256a.

И есть стороннее оборудование, администрируемое не нами, нам передали адреса оборудования и имя пользователя, пароли и протоколы.

Что же может пойти не так?

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

В случае же приема трапов, если приемник один, то он должен принимать, аутентифицировать и расшифровать тот или иной трап.

Для очень многих приемников трапов это может быть проблемой, особенно в случае с одинаковыми именами.

Многие опираются на уникальный Engine ID но это не очень удобно использовать.

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

Итак, сложность приема трапов – организовать прием одним приемником, трапов разных версий протокола, трапов с разными учетными данными и протоколами.

Теперь поговорим про Inform.

Первая сложность — это настроить его отправку с устройства, но этого мы слегка коснемся чуть позже.

Вторая сложность это если на агенте не указан Engine ID сервера, то некоторые агенты так попросту не работают, а некоторые попробуют определить Engine ID сервера, отправив ему запрос с пустым Engine ID, на что сервер ответит сообщением Report с указанием того, что он получил запрос с неверным Engine ID и заполненным правильным Engine ID а также временем работы и количеством перезагрузок.
Получив такой Report, агент отправит уже валидный Inform и дождется подтверждения от сервера что тот его получил.

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

Теперь перейдем к тому, как я решил большую часть этих проблем:

Приемник трапов/информов, при приеме трапа, сначала разбирает только незашифрованную часть сообщения с именем пользователя, Engine ID и еще некоторой информацией.

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

Причем ищет сначала с учетом адреса от кого оно получено, и если такого нет, то только по имени.

Это позволяет настроить общие учетные данные, и персональные для некоторых устройств, при этом имя пользователя может быть одно и то же.

Если все параметры найдены, производится попытка аутентификации и дешифровки.
Если все успешно, то производится запись данных, например в файл для Zabbix.

Если же это был Inform, то после успешной расшифровки будет отправлено подтверждение приема.

Если же это попытка определить наш Engine ID, то будет отправлен Report с нашим Engine ID.

Я выложил демонстрационный приемник тут: https://github.com/OlegPowerC/zabbixtraps
На нем и продемонстрирую возможности.

Нужно заполнить файл settings.json необходимыми данными.
У меня он выглядит вот так:

    {
    "logfile": "snmptrap.log",
    "timezone": "Europe/Moscow",
    "debugmode": true,
    "users": [
        {
        "username": "snmpuser",
        "authproto": "sha",
        "privproto": "aes",
        "auth": "auth12345",
        "priv": "priv12345"
        },
        {
        "username": "testuser1",
        "authproto": "sha",
        "privproto": "aes",
        "auth": "auth12345",
        "priv": "priv12345"
        },
        {
        "username": "testuser1",
        "authproto": "md5",
        "privproto": "aes256a",
        "auth": "authmd512345",
        "priv": "privdes12345",
        "ipaddr": "192.168.0.106"
        },
        {
        "username": "snmpuser192",
        "authproto": "sha",
        "privproto": "aes192a",
        "auth": "auth12345",
        "priv": "priv19212345"
        },
        {
        "username": "snmpuser256256",
        "authproto": "sha256",
        "privproto": "aes256a",
        "auth": "auth25612345",
        "priv": "priv25612345"
        }
    ]
}

Теперь проведем тест.

В качестве подопытного коммутатора выступит Cisco Catalyst IE-3000-8TC.

Работать мы будем с адресами IPv6.

На ПК настроен адрес 2001:DB8:1::121/64
На тестовом коммутаторе 2001:DB8:1::120/64

Настроим на нем отправку Inform и включим трапы:

Первое что нам нужно это настроить view, группу и пользователя:

snmp-server view SNMPv3-V iso included  
snmp-server group SNMPv3-G v3 priv read SNMPv3-V notify SNMPv3-V  

Теперь важно указать remote engineid с адресом нашего приемника, так как Cisco отправляет inform сразу, не делая discovery процедуру.

snmp-server engineID remote 2001:DB8:1::121 800000090300682C7B370001  

Engine ID 800000090300682C7B370001 взят для примера

И создадим пользователя, для inform необходимо создавать его вот так:

snmp-server user snmpuser SNMPv3-G remote 2001:DB8:1::121 v3 auth sha auth12345 priv aes 128 priv12345  

То есть с указанием удаленного узла на который будут отправлены Trap/Inform сообщения.

Однако традиционным методом, пользователя тоже надо создать, но при этом можно задавать разные параметры аутентификации и шифрования.

Для примера мы намеренно так и сделаем:

snmp-server user snmpuser SNMPv3-G v3 auth md5 authmd12345 priv des privdes12345  

Теперь нужно включить трапы (это относится как к трапам так и сообщениям информ)

snmp-server enable traps  

И указать, куда и от какого пользователя слать inform

snmp-server host 2001:DB8:1::121 informs version 3 priv snmpuser  

А все вместе выглядит так:

snmp-server view SNMPv3-V iso included
snmp-server group SNMPv3-G v3 priv read SNMPv3-V notify SNMPv3-V
snmp-server engineID remote 2001:DB8:1::121 800000090300682C7B370001
snmp-server user snmpuser SNMPv3-G remote 2001:DB8:1::121 v3 auth sha auth12345 priv aes 128 priv12345
snmp-server user snmpuser SNMPv3-G v3 auth md5 authmd12345 priv des privdes12345
snmp-server host 2001:DB8:1::121 informs version 3 priv snmpuser
snmp-server enable traps

Теперь посмотрим пользователей snmp командой show snmp user:

    User name: snmpuser
    Engine ID: 800000090300682C7B370001
    storage-type: nonvolatile        active
    Authentication Protocol: SHA
    Privacy Protocol: AES128
    Group-name: SNMPv3-G

    User name: snmpuser
    Engine ID: 800000090300C07BBCF9BB03
    storage-type: nonvolatile        active
    Authentication Protocol: MD5
    Privacy Protocol: DES
    Group-name: SNMPv3-G

И изменим количество повторных посылок, таймауты и количество сообщений в очереди:

snmp-server inform retries 10 timeout 30 pending 1000

Выходим в exec режим и смотрим что у нас происходило:

show snmp И смотрим самую нижнюю секцию:

SNMP informs: enabled
    Informs in flight 0/1000 (current/max)
    Logging to 2001:DB8:1::121.162
        1 sent, 0 in-flight, 0 retries, 0 failed, 0 dropped

Видим, что пока мы конфигурировали повторы, один inform был успешно отправлен.
Смотрим в консоль приемника и видим:

received trap/inform version: 3 User/Community snmpuser
Source IP: [2001:db8:1::120]:55259
Message Type: INFORM (send ACK)
RequestID:    1
VarBinds:     5
Boots: 0, Time: 0, EngineID 800000090300682c7b370001
Auth protocol: sha
Priv protocol: aes
Authenticated message
Encrypted message
Message to file: 05-26-26 11:21:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
1.3.6.1.2.1.1.3.0 = 31m14.94s : TIMETICKS
1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.4.1.9.9.43.2.0.1 : Universal OID
1.3.6.1.4.1.9.9.43.1.1.6.1.3.4 = 1 : Universal INTEGER
1.3.6.1.4.1.9.9.43.1.1.6.1.4.4 = 2 : Universal INTEGER
1.3.6.1.4.1.9.9.43.1.1.6.1.5.4 = 3 : Universal INTEGER

Это сообщение говорит о том, что изменился running конфиг.

А теперь перейдем к тестированию самого интересного, повторных посылок, когда наш приемник по каким-то причинам недоступен.

У меня к тестируемому коммутатору подключен ПК, сейчас порт поднят:

Fa1/7                        connected    1          a-full  a-100 10/100BaseTX

Мы его отключим, когда приемник будет недоступен, и проверим получим ли мы информацию о том, что этот порт упал, после того как приемник восстановится:

Запускаем WireShark, включаем фильтр snmp и останавливаем приемник.

Вынимаем кабель из порта и смотрим в Wireshark а также вводим в консоль команду show snmp pending

Также вводим show snmp и смотрим нижнюю секцию:

SNMP informs: enabled
    Informs in flight 3/1000 (current/max)
    Logging to 2001:DB8:1::121.162
        4 sent, 3 in-flight, 0 retries, 0 failed, 0 dropped

Запускаем приемник и наблюдаем, как приходят сообщения:

    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    10
    VarBinds:     3
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 11:55:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 1h3m41.28s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.2.1.17.0.1 : Universal OID
    1.3.6.1.4.1.9.9.46.1.3.1.1.1.1.1 = 1 : Universal INTEGER

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    11
    VarBinds:     6
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 11:57:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 1h3m7.28s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.3 : Universal OID
    1.3.6.1.2.1.2.2.1.1.10007 = 10007 : Universal INTEGER
    1.3.6.1.2.1.2.2.1.2.10007 = FastEthernet1/7 : Universal OCTET STRING
    1.3.6.1.2.1.2.2.1.3.10007 = 6 : Universal INTEGER
    1.3.6.1.4.1.9.2.2.1.1.20.10007 = down : Universal OCTET STRING

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    12
    VarBinds:     7
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 11:57:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 1h3m8.28s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.4.1.9.9.41.2.0.1 : Universal OID
    1.3.6.1.4.1.9.9.41.1.2.3.1.2.3 = LINK : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.3.3 = 4 : Universal INTEGER
    1.3.6.1.4.1.9.9.41.1.2.3.1.4.3 = UPDOWN : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.5.3 = Interface FastEthernet1/7, changed state to down : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.6.3 = 1h3m8.28s : TIMETICKS

Что же мы наблюдаем в Wireshark:

WireShrkInform1.jpg

WireShrkInform1.jpg

На скриншоте хорошо видны попытки доставить Inform сообщения, и завершение попыток после получения подтверждения о приеме от сервера.

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

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

*Mar  1 07:08:53.924: %LINEPROTO-5-UPDOWN: Line protocol on Interface Vlan1, changed state to down
*Mar  1 07:08:54.923: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet1/5, changed state to down
*Mar  1 07:08:55.921: %LINK-3-UPDOWN: Interface FastEthernet1/5, changed state to down

посмотрим что коммутатор пытается отправить show snmp pending

req id: 137, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 16 secs
req id: 138, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 16 secs
req id: 139, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 17 secs
req id: 140, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 18 secs

Так же можно посмотреть show snmp:

    SNMP informs: enabled
        Informs in flight 4/1000 (current/max)
        Logging to 2001:DB8:1::121.162
            48 sent, 4 in-flight, 92 retries, 0 failed, 0 dropped

Со временем сообщений которые находятся “в полете” станет немного больше, спустя две с половиной минуты видим такое:

req id: 145, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 13 secs
req id: 146, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 13 secs
req id: 147, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 14 secs
req id: 148, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 15 secs
req id: 151, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 23 secs
req id: 152, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 23 secs
req id: 153, dest: 2001:DB8:1::121.162, V3 user: snmpuser, Expires in 55 secs
    SNMP informs: enabled
    Informs in flight 7/1000 (current/max)
    Logging to 2001:DB8:1::121.162
        52 sent, 7 in-flight, 93 retries, 0 failed, 0 dropped

Подключаем кабель обратно, и спустя некоторое время принимаем информ сообшения с request id со 153 по 161:

WireShrkInform2.jpg

WireShrkInform2.jpg

    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [fe80::c27b:bcff:fef9:bb40%Ethernet]:55259
    Message Type: INFORM (send ACK)
    RequestID:    153
    VarBinds:     7
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:02:05 ZBXTRAP fe80::c27b:bcff:fef9:bb40 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h11m35.15s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.4.1.9.9.41.2.0.1 : Universal OID
    1.3.6.1.4.1.9.9.41.1.2.3.1.2.15 = LINK : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.3.15 = 4 : Universal INTEGER
    1.3.6.1.4.1.9.9.41.1.2.3.1.4.15 = UPDOWN : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.5.15 = Interface FastEthernet1/5, changed state to up : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.6.15 = 7h11m35.15s : TIMETICKS

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    154
    VarBinds:     6
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:02:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h11m36.16s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.4 : Universal OID
    1.3.6.1.2.1.2.2.1.1.10005 = 10005 : Universal INTEGER
    1.3.6.1.2.1.2.2.1.2.10005 = FastEthernet1/5 : Universal OCTET STRING
    1.3.6.1.2.1.2.2.1.3.10005 = 6 : Universal INTEGER
    1.3.6.1.4.1.9.2.2.1.1.20.10005 = up : Universal OCTET STRING

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    155
    VarBinds:     4
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:02:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h8m53.92s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.2.1.17.0.2 : Universal OID
    1.3.6.1.4.1.9.9.46.1.3.1.1.1.1.1 = 1 : Universal INTEGER
    1.3.6.1.2.1.31.1.1.1.1.10005 = Fa1/5 : Universal OCTET STRING

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    156
    VarBinds:     6
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:02:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h8m53.93s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.3 : Universal OID
    1.3.6.1.2.1.2.2.1.1.1 = 1 : Universal INTEGER
    1.3.6.1.2.1.2.2.1.2.1 = Vlan1 : Universal OCTET STRING
    1.3.6.1.2.1.2.2.1.3.1 = 53 : Universal INTEGER
    1.3.6.1.4.1.9.2.2.1.1.20.1 = down : Universal OCTET STRING

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    157
    VarBinds:     6
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:02:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h8m54.92s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.3 : Universal OID
    1.3.6.1.2.1.2.2.1.1.10005 = 10005 : Universal INTEGER
    1.3.6.1.2.1.2.2.1.2.10005 = FastEthernet1/5 : Universal OCTET STRING
    1.3.6.1.2.1.2.2.1.3.10005 = 6 : Universal INTEGER
    1.3.6.1.4.1.9.2.2.1.1.20.10005 = down : Universal OCTET STRING

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    158
    VarBinds:     7
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:02:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h8m55.92s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.4.1.9.9.41.2.0.1 : Universal OID
    1.3.6.1.4.1.9.9.41.1.2.3.1.2.14 = LINK : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.3.14 = 4 : Universal INTEGER
    1.3.6.1.4.1.9.9.41.1.2.3.1.4.14 = UPDOWN : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.5.14 = Interface FastEthernet1/5, changed state to down : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.6.14 = 7h8m55.92s : TIMETICKS

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    159
    VarBinds:     4
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:02:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h12m3.16s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.2.1.17.0.2 : Universal OID
    1.3.6.1.4.1.9.9.46.1.3.1.1.1.1.1 = 1 : Universal INTEGER
    1.3.6.1.2.1.31.1.1.1.1.10005 = Fa1/5 : Universal OCTET STRING

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    160
    VarBinds:     6
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:02:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h12m3.17s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.4 : Universal OID
    1.3.6.1.2.1.2.2.1.1.1 = 1 : Universal INTEGER
    1.3.6.1.2.1.2.2.1.2.1 = Vlan1 : Universal OCTET STRING
    1.3.6.1.2.1.2.2.1.3.1 = 53 : Universal INTEGER
    1.3.6.1.4.1.9.2.2.1.1.20.1 = up : Universal OCTET STRING

    ----------------------------------------------------------
    ----------------------------------------------------------
    received trap/inform version: 3 User/Community snmpuser
    Source IP: [2001:db8:1::120]:55259
    Message Type: INFORM (send ACK)
    RequestID:    161
    VarBinds:     7
    Boots: 0, Time: 0, EngineID 800000090300682c7b370001
    Auth protocol: sha
    Priv protocol: aes
    Authenticated message
    Encrypted message
    Message to file: 05-26-26 18:03:05 ZBXTRAP 2001:db8:1::120 VARBINDS:
    1.3.6.1.2.1.1.3.0 = 7h11m35.15s : TIMETICKS
    1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.4.1.9.9.41.2.0.1 : Universal OID
    1.3.6.1.4.1.9.9.41.1.2.3.1.2.15 = LINK : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.3.15 = 4 : Universal INTEGER
    1.3.6.1.4.1.9.9.41.1.2.3.1.4.15 = UPDOWN : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.5.15 = Interface FastEthernet1/5, changed state to up : Universal OCTET STRING
    1.3.6.1.4.1.9.9.41.1.2.3.1.6.15 = 7h11m35.15s : TIMETICKS

    ----------------------------------------------------------

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

Коммутатор отправил первое сообщение о том что порт поднялся, еще и с адреса Link Local.
При этом у всех сообщений разные и MsgID и request-id.
Это специфический для нашего лабораторного теста случай, связано это с тем, что на тестовом коммутаторе упали вообще все порты, и соответственно упал интерфейс Vlan 1, на котором был настроен адрес 2001:DB8:1::120/64.
После того как интерфейс поднялся, ему автоматически назначается Link Local адрес, а затем присваивается адрес, назначенный в конфигурации, но за это время он успел отправить с него Inform.

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

Как понять что произошло раньше а что позже, опираться на порядок пришедших сообщений ненадежно?

Для начала стоит порадоваться, что мы получили лишнее сообщение, а не потеряли что-то, а во-вторых каждый Trap/Inform обязательно содержит данные о времени работы оборудования с момента включения:

    1.3.6.1.2.1.1.3.0 = 7h11m35.15s : TIMETICKS

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

Статья получилась довольно длинная поэтому тут я очень коротко приведу пример настройки Zabbix исключительно для демонстрации.

Демонстрационный пример Host+Items+Trigger в Zabbix

Итак настраиваем Zabbix на обработку трапов, в файле zabbix_server.conf необходимо указать:
StartSNMPTrapper=1

И путь к файлу, из которого траппер будет извлекать новые сообщения:
SNMPTrapperFile=/var/log/snmptrap/snmptrap.log

Файл /var/log/snmptrap/snmptrap.log необходимо создать, а также разрешить заббиксу его читать, а нашему сервису в него писать.

Смотрите лог zabbix_server.log заббикса на предмет сообщений об ошибках доступа к файлу:

cannot open SNMP trapper file "/var/log/snmptrap/snmptrap.log": [13] Permission denied

Поскольку это тестовая ВМ, то сервис принимающий трапы запущен от root что, разумеется, на рабочем сервере делать не желательно, но в моем случае, в тестовом окружении это так, да еще и к тому же selinux отключен.

Права на файл:
-rw-r-----. 1 root zabbix 23K May 27 20:49 snmptrap.log

В качестве тестового коммутатора выступит 2960X с примерно такими же настройками как и выше описаны, за исключением того, что он у меня доступен только по IPv4.

Описывать как создать Host, Item и Trigger я не буду, это широко освещено, а опишу специфичные items для трапов.

Прежде всего надо понимать, что для Zabbix, трап сообщение это просто много текста. Соответственно его нужно распарсить и как-то обработать.

Прежде всего создадим Item типа SNMP trap, дадим ей key snmptrap.fallback а в поле Type of information укажем log.
Сюда будут попадать все трапы, для этого хоста, которые не попадают в другие items.

Можем отключить/подключить что-нибудь подключенное к коммутатору и проверить, появились ли сообщения, на скриншоте мой тестовый пример:

trapfallback.jpg

trapfallback.jpg

Теперь создадим item для того чтобы ловить состояние интерфейса, а именно GigabitEthernet1/0/23.

Тут надо сразу пояснить одну неприятную штуку, а имено то, что Cisco не присылает в трапе ifOperStatus, например, для нашего порта OID для получения состояния порта 1.3.6.1.2.1.2.2.1.8.10123 и было бы чудесно видеть в трапе что-то типа 1.3.6.1.2.1.2.2.1.8.10123 = 2 но увы.
Но мы можем ориентироваться по сообщению с OID 1.3.6.1.4.1.9.2.2.1.1.20 это причина изменения состояния порта, к сожалению это строка.

Итак создаем item для поимки именно таких трапов:
Название дадим например GigabitEthernet1/0/23_Inform
Тип - SNMP trap
А вот в поле Key нужно указать regex:
snmptrap[1\.3\.6\.1\.4\.1\.9\.2\.2\.1\.1\.20\.10123]
Это означает, что в этот item попадет сообщение целиком, в котором будет найдена строка 1.3.6.1.4.1.9.2.2.1.1.20.10123

item02.jpg

item02.jpg

Именно такие сообщения нам и понадобятся, а подсмотреть все сообщение можно в логе, пример:

05-27-26 19:06:05 ZBXTRAP 192.168.0.121 VARBINDS:
1.3.6.1.2.1.1.3.0 = 41h1m44.59s : TIMETICKS
1.3.6.1.6.3.1.1.4.1.0 = 1.3.6.1.6.3.1.1.5.3 : Universal OID
1.3.6.1.2.1.2.2.1.1.10123 = 10123 : Universal INTEGER
1.3.6.1.2.1.2.2.1.2.10123 = GigabitEthernet1/0/23 : Universal OCTET STRING
1.3.6.1.2.1.2.2.1.3.10123 = 6 : Universal INTEGER
1.3.6.1.4.1.9.2.2.1.1.20.10123 = down : Universal OCTET STRING

Однако нужно из него выбрать только значение OID 1.3.6.1.4.1.9.2.2.1.1.20.10123 и тут на помощь придет Processing.
Создаем в нем регулярное выражение:

.*1\.3\.6\.1\.4\.1\.9\.2\.2\.1\.1\.20\.10123\s*=\s*([a-zA-Z]+)\s*:\s*Universal OCTET STRING.*

Оно выбирает только результат - то есть up или down.
В поле output - \1

item2.jpg

item2.jpg

Нажимаем Test и в поле Value вставляем сообщение из лога, жмем apply и test.
Для выше приведенного сообщения, результат должен быть - down

ir01.jpg

ir01.jpg

Теперь можем подергать интерфейс, History latest data нашего item должна содержать изменение состояния up/down примерно так:

ldata.jpg

ldata.jpg

А теперь дело за триггером, но для того чтоб ориентироваться не только по трапу, я создал еще один item, который опрашивает состояние порта с интервалом 10 минут.
Хотелось, чтобы триггер был один, поэтому настроил его на два item с операцией OR:

last(/2960Xlab/snmp_oid["1.3.6.1.2.1.2.2.1.8.10123"])<>1 or last(/2960Xlab/snmptrap[1\.3\.6\.1\.4\.1\.9\.2\.2\.1\.1\.20\.10123])="down"

Теперь если в течение минуты подергать кабель, то у нас будут все события:

dsb1.jpg

dsb1.jpg

Заключительное слово

Читатель наверное подумает, зачем такие сложности ради состояния порта и будет прав.
Это всего лишь демонстрация того как можно работать с трапами и информами.
Разумеется и приемник требует доработки и испытаний, и конфигурация Zabbix и выбор объектов к которым применить данный метод, однако же был бы метод, а применение найдется.

За сим позвольте откланяться.