【问题标题】:SNMPv3 to SNMPv2 glue layerSNMPv3 到 SNMPv2 粘合层
【发布时间】:2016-10-03 18:47:06
【问题描述】:

有人要求我在远程 Unix 平台上安装 HP OpenView 代理,以捕获客户端应用程序转发的 SNMP 陷阱。

后来我发现客户端应用程序只能转发 SNMPv3 陷阱,而我们使用的代理只能接受 SNMPv2 陷阱。

我发现我可以通过使用 Perl 模块 NetSNMP::TrapReceiver 来解决此问题,但我不清楚这是如何设置的,或者如何/是否可以将 v3 陷阱转换为 v2 陷阱。

我的目标是捕获 v3 陷阱,并希望通过脚本或工具将其转换为 v2 陷阱并将其发送回备用端口。

【问题讨论】:

  • 对不起,这太宽泛了,无法有意义地回答。应该可以捕获一个 SNMPv3 陷阱并创建一个具有大致相似信息的新 SNMPv2 陷阱。
  • @Sobrique 我不同意它过于宽泛。也许改写会有所帮助:“我如何使用NetSNMP::TrapReceiver 捕获 SNMP v3 陷阱并将它们作为 v2 陷阱转发?”由于 snmptrapd 可以运行任意 Perl 代码,我预计解决方案不会很长。
  • 我对您的结构感到困惑:您在任何地方都没有提到网络管理员。您的“客户端应用程序”是指您的新 HP OpenView 代理吗?在这种情况下,“我们使用的代理”是什么?这是张贴图片很有用的一种情况。
  • 我不会投票结束,但我确实认为如果您能说明到目前为止您对 Perl 模块所做的尝试,这将是一个更好的问题。您链接到的页面似乎有很多很好的信息,包括示例代码,其中缺少什么是您无法开始的?
  • 对不起,伙计们,我意识到我确实可能在这件事上操之过急,现在我已经确定了一个 SNMP 陷阱拦截器,它可以处理 v3 陷阱。我会结束这个问题 - 很抱歉浪费了人们的时间

标签: perl snmp


【解决方案1】:

碰巧我现在有同样的任务。所以我对 NetSNMP::TrapReceiver 的决定就在这里:

#!/usr/bin/perl

use strict;
use warnings;
use diagnostics;

use Net::SNMP;
use SNMP;
use Switch;


my $snmpTrapDestHost = "127.0.0.1";
my $snmpTrapRemotePort = 16162; #other than default trap port or we got infinite trap loop
my $snmpTrapCommunity = "public";
my $snmpTrapVersion = "2c";


my $sess = new SNMP::TrapSession(DestHost => $snmpTrapDestHost, Community => $snmpTrapCommunity, Version => $snmpTrapVersion, RemotePort => $snmpTrapRemotePort);

sub my_receiver {
    print "********** PERL RECEIVED A NOTIFICATION:\n";

    my @bunchOfVarbinds;
    foreach my $x (@{$_[1]})
    {
        printf "'%s' type='%d' value='%s'\n", $x->[0], $x->[2], $x->[1];
        my $lsOid = $x->[0];
        my $liOid = &SNMP::translateObj($lsOid);
        my $lsVal = $x->[1];
        my $lType = $x->[2];
        my $lVal;
# You need some convertion here, cause we got data in "human readable" format
        switch($lType)
        {
            case Net::SNMP::OBJECT_IDENTIFIER
            {
                $lType = "OBJECTID";
                if ($lsVal =~ /OID\:\s+(.*)$/)
                {
                    $lVal = $1
                }
                else
                {
                    $lVal = $lsVal;
                }
                $lVal = &SNMP::translateObj($lVal);
            }
            case Net::SNMP::TIMETICKS
            {
                $lType = "TICKS";
                if($lsVal =~ /Timeticks\:\s+\((\d+)\)\s+.*$/)
                {
                    $lVal = $1;
                }
                else
                {
                    my ($d, $h, $m, $s) = split(/\:/, $lsVal);
                    $lVal = $d * 24;
                    $lVal = ($lVal + $h)*60;
                    $lVal = ($lVal + $m)*60;
                    $lVal = ($lVal + $s)*100;
                }
            }
            case Net::SNMP::OCTET_STRING
            {
                $lType = "OCTETSTR";
                my $isHex;
                ($isHex, $lVal) = split(/STRING\:\s*/, $lsVal);
                if (!defined($lVal))
                {
                    $lVal = $lsVal;
                }
                $lVal =~ s/"//g;

                if (defined($isHex))
                {
                    if($isHex eq "Hex-")
                    {
                        $lVal =~ s/\n//g;
                        $lVal =~ s/ //g;
                    }
                }
            }
            case Net::SNMP::INTEGER
            {
                $lType = "INTEGER";
                $lVal = $lsVal;
            }
            case Net::SNMP::IPADDRESS
            {
# IPADDR
# NETADDR
                $lType = "IPADDR";
                $lVal = $lsVal;
            }
            case Net::SNMP::COUNTER
            {
# COUNTER
                $lType = "COUNTER";
                $lVal = $lsVal;
            }
            case Net::SNMP::COUNTER64
            {
# COUNTER64
                $lType = "COUNTER64";
                $lVal = $lsVal;
            }
            case Net::SNMP::GAUGE
            {
# GAUGE
                $lType = "GAUGE";
                $lVal = $lsVal;
            }
            case Net::SNMP::NULL
            {
# NULL
                $lType = "NULL";
                $lVal = $lsVal;
            }
            else
            {
# UINTEGER
# OPAQUE
                $lVal = $lsVal;
            }
        }        
        push @bunchOfVarbinds, new SNMP::Varbind([$liOid, undef, $lVal, $lType]);

    }

    my $vl = new SNMP::VarList(@bunchOfVarbinds);

    $sess->trap(
                    oid => $initiTrapProxyServiceOid,
                    uptime => $trapUptimeValue,
                    $vl
               );

    return NETSNMPTRAPD_HANDLER_OK;
}

$SNMP::use_numeric = 1;
NetSNMP::TrapReceiver::register("all", \&my_receiver) ||
 warn "failed to register perl trap handler\n";
print STDERR "Loaded perl snmptrapd handler\n";

我是 perl 的新手,因此感谢任何修复。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    相关资源
    最近更新 更多