发送包含自定义数据的 SNMP 陷阱

Sending SNMP Traps containing custom data

客户要求我们将 SNMP 陷阱发送到他们的 Nagios 服务器,而不是电子邮件警报。昨天之前我对 SNMP 的唯一了解是它听起来像一个首字母缩写词,所以请原谅(并纠正我)我可能对它有的任何误解。

唯一需要在陷阱中发送的信息与我们提醒客户的事件相关的数据有关,这只是从我们的数据库中提取的几个值。不用说,它们不在任何类型的 MIB 中,也没有任何 OID,这就是我找不到答案的地方。

我不明白我是如何在不使用 MIB OID 的情况下将我们的特定数据添加到陷阱的,我没有 MIB OID。

我正在使用 PySNMP 生成请求并且现在只有不完整的代码,因为我不确定如何将我们的数据合并到数据包中。

from pysnmp.hlapi import *

def sendSNMP(destination, community_string, data):
    community = CommunityData(community_string, mpModel = 0)
    target = UdpTransportTarget((destination, 162))
    notification_type = None
    req = sendNotification(SnmpEngine(), community, target, ContextData(), 'trap', notification_type)
    errorIndication, errorStatus, errorIndex, varBinds = next(req)

如有任何帮助,我们将不胜感激!谢谢

一般来说,SNMP 陷阱内容结构良好,便于随机系统之间的数据交换。内容由 MIB 以相当繁琐的方式定义。但是,如果您正在构建一个 ad-hoc 自定义系统,没有什么能阻止您将任何东西 OID-values 塞进陷阱。

示例代码(启用调试以提示您发送的是什么):

from pysnmp.hlapi import *
from pysnmp import debug

debug.setLogger(debug.Debug('msgproc'))

next(sendNotification(SnmpEngine(),
     CommunityData('public'),
     UdpTransportTarget(('demo.snmplabs.com', 162)),
     ContextData(),
     'trap',
     # sequence of custom OID-value pairs
     [ObjectType(ObjectIdentity('1.3.6.1.2.1.1.1.0'), OctetString('my string')),
      ObjectType(ObjectIdentity('1.3.6.1.2.1.1.3.0'), Integer32(42))]))

在纯技术层面上,您可以将任何 OID 用于任何目的。但是,SNMP 被设计为 committee-managed 协议。

如果您的陷阱或它们的变量绑定不符合标准 messages/types,您的 OID 应该以 1.3.6.1.4.1.YOUR_ENTERPRISE_NUMBER 开头。如果您的公司或您的客户没有注册私人企业编号 (PEN),您可以 request one from IANA 免费。如果有人在管理您的 PEN,您应该要求他们为您的产品域提供一个 OID。

PEN list 满是个人的电子邮件地址。这个系统中有一个 industry-level 信任的元素。与控制竞争对手企业编号的人合作并不罕见。如果您对 PEN 承担责任,那么您就承担了随之而来的道德责任。

您不必为企业范围编写或发布 MIB,尽管您可能希望为您的客户编写它们。

SNMP 是一个旧协议。首选的替代品是 NETCONF,或者有人告诉我。