定义MIB并在.net下发送SNMP陷阱

7
我为一家.net公司开发了一个特殊的应用程序,使用C#语言已经多年了。现在它正在进行开发,我需要实现的主要新功能之一是在某些警报情况下通过发送SNMP陷阱将其与另一款软件集成起来。
我是一名经验丰富的开发人员,但我从未使用过SNMP。我整天在谷歌上搜索,但越来越困惑于这个主题。我没有明确的“起点”。我了解SNMP的基础知识,但不知道如何开始实施。
我有应该通过SNMP trap发送的数据,它有大约10个属性,一些日期、数字和字符串。我应该在这些属性上创建MIB定义。稍后,我应该在我的应用程序中实现一个功能,根据这些MIB发送SNMP陷阱。
该项目在C#的.NET 4下开发。我找到了这个看起来很有前途的库:http://sharpsnmplib.codeplex.com/ 它有关于发送SNMP陷阱的一些示例。
我的问题是:从哪里开始?我如何定义MIB文件?我知道它们是一些必须编译的文本文件,但没有找到任何MIB编辑器和有关此主题的帮助。
感谢任何帮助!

谢谢!

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陷阱的格式(“数据字段”)呢? - Tom

1

看起来你正在使用Windows操作系统来处理SNMP,那么你需要创建自定义的SNMP扩展代理以添加自定义的SNMP OID和相应的陷阱到你的系统中。每个OID都会实际上呈现一个变量,你可以在其中存储你的信息。这里是这样的DLL的示例。据我所知,MIB文件仅用作Windows中SNMP代理的参考,不能用于添加新的OID而不创建自定义的SNMP代理。

当你拥有自己的自定义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 Browser

以下是使用该库的示例代码:

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。


你需要创建自定义的SNMP扩展代理。这在十五年前是正确的(当我最后进行SNMP编程时),但现在您可以使用较新的WinSNMP API中的SnmpSendMsg发送陷阱(尽管现在已经超过十年了)。示例在此处:http://stackoverflow.com/questions/4498618/problem-sending-snmp-trap-and-manager-recognizing-it - arx

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

1

1

如果您只需要发送陷阱,那么您不必定义MIB。MIB是为了让其他方了解其中变量的含义。您可以使用其他格式(如文本文件)进行记录。

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

要验证是否成功发送了陷阱,您可以使用免费的ireasoning MIB浏览器(http://ireasoning.com/mibbrowser.shtml)来接收它们。如果可以接收到,则通常意味着您的陷阱正常。


我理解了你的大部分回答,但是为什么你说“你不需要定义MIBs。MIB是为其他方了解而用的。” 你具体指的是什么?即使你只是发送trap而且不需要MIBs,你仍然需要所有的SNMP配置,如MIB名称、MIB值、MIB类型、社区、OID、通用、特定等,以成功发送trap并被其他机器成功接受和处理。否则,它将丢弃该数据包。我的想法正确吗? - ThN

0

你也可以尝试使用 snmpsharpnet,它在 .NET 上玩 SNMP 非常有帮助?

作为 MIB 编辑器,我使用 MG-SOFT MIB 浏览器,专业版配有 Windows 的 Visual MIB Builder。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接