我正在尝试编写一个非常小的SNMP陷阱接收器,监听UDP端口162。
陷阱很好,但我无法解码它们。
我找到了libber,但由于某些原因它无法解码陷阱。我可能错了。我想解码一个SNMP陷阱应该相当简单,我错过了一些关键的东西。是否可以使用NET-SNMP作为库并从中创建一个小的陷阱接收程序?我不会感到惊讶,但找不到任何有关它的信息。也许我的google-fu很弱。
答案 0 :(得分:4)
好吧,使用net-snmp,您通常使用snmptrapd守护程序来调用外部命令/脚本。如果你不能这样使用,我建议你看一下snmptrapd.c代码。而且,如果我没记错的话,他们会构建一个libsnmptrapd库。应该很容易找到合适的API调用...
如果我有时间,我会用一个片段更新我的答案......
MY2C
答案 1 :(得分:1)
要制作一个简单的snmp陷阱应用程序,您应该解析并运行snmptrapd.c来捕获来自您定义的端口地址的陷阱。
对于初学者来说,代码结构很繁琐,所以我将告诉您snmptrapd.c的要点,以使其成为一个简单的陷阱接收器。
transport = netsnmp_transport_open_server("snmptrap", cp);
此行打开一个服务器,供您侦听定义的端口号“ cp”。
警告:在linux os中,端口162只能以root用户身份进行监听。因此,如果您想监听端口162,则应使用sudo运行代码。
ss = snmptrapd_add_session(transport);
您应该创建一个netsnmp_session。
while (netsnmp_running) {
...
numfds = 0;
FD_ZERO(&readfds);
FD_ZERO(&writefds);
FD_ZERO(&exceptfds);
block = 0;
tvp = &timeout;
timerclear(tvp);
tvp->tv_sec = 5;
snmp_select_info(&numfds, &readfds, tvp, &block);
if (block == 1)
tvp = NULL; /* block without timeout */
count = select(numfds, &readfds, &writefds, &exceptfds, tvp);
if (count > 0) {
if (count > 0) {
snmp_read(&readfds);
}
} else {
switch (count) {
case 0:
snmp_timeout();
break;
case -1:
if (errno == EINTR)
continue;
netsnmp_running = 0;
break;
default:
netsnmp_running = 0;
}
}
}
在定义的端口捕获snmp陷阱的主循环。
static netsnmp_session *
snmptrapd_add_session(netsnmp_transport *t)
{
...
session->callback = snmp_input;
...
}
毕竟,陷阱的数据将位于
snmp_input
功能。您可以使用oid,value,value类型,sender ipnumber等。 陷阱。