在.net下定义MIB并发送SNMP trap

问题描述 投票:0回答:6

我用C#为.net下的一家公司开发了一个特殊的应用程序,并且已经使用了多年。现在它已经开发完毕,我必须实现的主要新功能之一是通过在某些警报情况下向其发送 SNMP 陷阱来将其与另一个软件集成。

我是一名经验丰富的开发人员,但我从未使用过 SNMP。我用谷歌搜索了一整天,但对这个话题越来越困惑。我没有一个明确的“起点”。我了解 SNMP 的基础知识,但我不知道从哪里以及如何开始实施。

我有应该通过 SNMP 陷阱发送的数据,它有大约 10 个属性、一些日期、数字和字符串。我应该在此属性上创建 MIB 定义。稍后我应该在我的应用程序中实现一个基于此 MIB 发送 SNMP 陷阱的功能。

该项目是在.net 4下用c#开发的。我发现这个库看起来很有前途:https://sharpsnmp.com/ 它有一些关于发送 SNMP 陷阱的示例。

我的问题是:从哪里开始?如何定义 MIB 文件?我知道它们是一些必须编译的文本文件,但没有找到任何 MIB 编辑器和有关此主题的帮助。

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

谢谢!

.net snmp mib sharp-snmp snmp-trap
6个回答
3
投票

我不是专家,但有和你处于同一位置的经验,并最终找到了足够适合我的项目的东西。

我使用了你之前提到的这个 codeplex 库,发现非常好。这里有一些指导您浏览 http://sharpsnmplib.codeplex.com/

  • 据我了解,当您需要执行 snmpget 和 snmpset 时,需要 MIB 文件
    • 这是您通知服务器,服务器返回给您的客户端询问更详细的信息,如果您需要共享有关您的应用程序的大量信息,则可能需要这样做
  • 如果你只需要陷阱,你可以这样做
    • 运行 snmpd.exe,它将像 snmp 服务器接收从您的应用程序发送的陷阱一样。
    • 编写一个类似于 snmptrapd.exe 的程序并发送你的陷阱。

链接 http://www.net-snmp.org/wiki/index.php/TUT:snmptrap 是获得基本了解和获取更多库信息的好链接。

编辑:刚刚错过了一点。如果您对 snmp 使用 get 和 set,则需要 MIB 文件。如果你只有陷阱,你可能不需要它。


1
投票

在 SNMP V2 MIB 中,陷阱被描述为 NOTIFICATION。请在此处查看此类 MIB 的完整示例: http://tools.cisco.com/Support/SNMP/do/BrowseMIB.do?local=en&mibName=CISCO-EPM-NOTIFICATION-MIB


1
投票

由于显然您正在使用 Windows 操作系统来处理 SNMP,因此您需要创建自定义 SNMP 扩展代理,以便将自定义 SNMP OID 和相应的陷阱添加到您的系统中。每个 OID 都会直接呈现一个变量,您可以在其中存储信息。 这是此类 DLL 的示例。据我所知,MIB 文件仅在 Windows 中用作 SNMP 代理的参考,并且不能用于在不创建自定义 SNMP 代理的情况下添加新的 OID。

当您拥有自定义 SNMP 代理 DLL 时,您需要将其指向注册表。可以这样做(示例):

[HKEY_LOCAL_MACHINE\SOFTWARE\Symbol\MyAgent\CurrentVersion]
"Pathname"="C:\\MyCustomAgent\\MyAgent.dll"

;Add number of agent to the list (max num registered + 1)
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\SNMP\Parameters\ExtensionAgents]
"10"="SOFTWARE\\Symbol\\MyAgent\\CurrentVersion"

之后您需要重新启动 SNMP 服务。如果一切正常,您将能够使用新的自定义 OID 来设置\获取一些数据。

为了读取/写入 SNMP 变量,您需要使用 SNMP 管理器。我通常使用 Sharpsnmplib 来执行此操作。还有一些 GUI 管理器在调试过程中很有用,例如:iReasoning MIB 浏览器

这是使用该库的示例代码:

using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
// SNMP Lib references
using Lextm.SharpSnmpLib;
using Mono.Options;
using Lextm.SharpSnmpLib.Messaging;
using Lextm.SharpSnmpLib.Security;
...
List vList = new List();
ISnmpData data;
data = new OctetString("test"); // variable to add in to string OID
Variable test = new Variable(new ObjectIdentifier("1.3.6.1.2.1.1.6.0"), data); // OID
vList.Add(test);
VersionCode versionH = VersionCode.V2; // SNMP protocol version to use
IPAddress ipH;
IPAddress.TryParse("127.0.0.1", out ipH);
IPEndPoint receiverH = new IPEndPoint(ipH, 161);
foreach (Variable variable in
        Messenger.Set(versionH, receiverH, new OctetString("private"), vList, 10))// set variable
        // Arguments: (ver of SNMP, IP, group, iList containing OID and variable, timeoout)
        {
            // output variable
        }
...

您还可以在 technet 上阅读有关在 Windows 操作系统中使用 SNMP 的文章:link。这篇文章并不新鲜,但可能会帮助您了解如何在 Windows 中使用 SNMP。


1
投票

如果您只需要发送陷阱,则不必定义MIB。 MIB是供其他方理解其中变量的含义的。您可以使用其他格式(例如文本文件)记录它。

要发送陷阱,您可以使用 C# SNMP 库,或者直接调用 snmptrap 程序。 Net-snmp 提供免费的命令行工具来发送陷阱。 (http://net-snmp.sf.net)。它的用法非常简单。

要验证陷阱是否已成功发送,您可以使用免费的 ireasoning MIB 浏览器( http://ireasoning.com/mibbrowser.shtml )来接收陷阱。如果能收到,一般说明你的陷阱没问题。


1
投票

所以来自 http://www.net-snmp.org/tutorial/tutorial-5/commands/snmptrap.html

SNMPv2 通知

SNMPv2 通知的格式有些不同。 MIB文件中的定义如下

NOTIFICATION-TEST-MIB DEFINITIONS ::= BEGIN
        IMPORTS ucdavis FROM UCD-SNMP-MIB;

demonotifs OBJECT IDENTIFIER ::= { ucdavis 991 }

demo-notif NOTIFICATION-TYPE
    STATUS current
        OBJECTS { sysLocation }
    DESCRIPTION "Just a test notification"
        ::= { demonotifs 17 }

END

0
投票

您还可以尝试使用 snmpsharpnet,这对于在 .NET 之上使用 SNMP 非常有帮助?

作为 MIB 编辑器,我使用 MG-SOFT MIB Browser,专业版与 Visual MIB Builder for Windows 一起出售。

© www.soinside.com 2019 - 2024. All rights reserved.