はじめに
Go言語のSNMPパッケージgosnmpを紹介するシリーズの4回目です。
1回目は
です。
今回は、TRAPを受信する方法です。
TRAPを受信するプログラム
TRAPを受信するプログラムは
package main
import (
"log"
"net"
g "github.com/gosnmp/gosnmp"
)
func main() {
tl := g.NewTrapListener()
tl.Params = &g.GoSNMP{}
tl.OnNewTrap = func(s *g.SnmpPacket, u *net.UDPAddr) {
log.Printf("snmp trap from=%s trap=%+v", u.IP.String(), s)
}
err := tl.Listen("0.0.0.0:162")
if err != nil {
log.Fatalln(err)
}
}
これだけで、SNMPv2のTRAPを受信できます。
リスナーの作成
tl := g.NewTrapListener()
でTRAPのリスナーを作成します。
パラメーター設定
tl.Params = &g.GoSNMP{}
パラメータをSNMP v3用に設定すれば、SNMPv3のTRAPも受信できます。
受信関数の設定
TRAPを受信した時に呼ばれる関数を設定します。
tl.OnNewTrap = func(s *g.SnmpPacket, u *net.UDPAddr) {
log.Printf("snmp trap from=%s trap=%+v", u.IP.String(), s)
}
受信したTRAPパケットと、TRAPの送信元の情報が関数のパラメータです。
受信結果
2024/09/23 17:26:36 snmp trap from=192.168.1.210 trap=&{Version:2c MsgFlags:NoAuthNoPriv SecurityModel:SnmpV3SecurityModel(0) SecurityParameters:<nil> ContextEngineID: ContextName: Community:public PDUType:SNMPv2Trap MsgID:0 RequestID:932629191 MsgMaxSize:0 Error:NoError ErrorIndex:0 NonRepeaters:0 MaxRepetitions:0 Variables:[{Value:45384 Name:.1.3.6.1.2.1.1.3.0 Type:TimeTicks} {Value:.1.3.6.1.4.1.8072.4.0.2 Name:.1.3.6.1.6.3.1.1.4.1.0 Type:ObjectIdentifier} {Value:.1.3.6.1.4.1.8072.4 Name:.1.3.6.1.6.3.1.1.4.3.0 Type:ObjectIdentifier}] Logger:{logger:<nil>} SnmpTrap:{Variables:[] IsInform:false Enterprise: AgentAddress: GenericTrap:0 SpecificTrap:0 Timestamp:0}}
2024/09/23 17:26:36 snmp trap from=192.168.1.210 trap=&{Version:2c MsgFlags:NoAuthNoPriv SecurityModel:SnmpV3SecurityModel(0) SecurityParameters:<nil> ContextEngineID: ContextName: Community:public PDUType:SNMPv2Trap MsgID:0 RequestID:296096074 MsgMaxSize:0 Error:NoError ErrorIndex:0 NonRepeaters:0 MaxRepetitions:0 Variables:[{Value:4 Name:.1.3.6.1.2.1.1.3.0 Type:TimeTicks} {Value:.1.3.6.1.6.3.1.1.5.1 Name:.1.3.6.1.6.3.1.1.4.1.0 Type:ObjectIdentifier} {Value:.1.3.6.1.4.1.8072.3.2.10 Name:.1.3.6.1.6.3.1.1.4.3.0 Type:ObjectIdentifier}] Logger:{logger:<nil>} SnmpTrap:{Variables:[] IsInform:false Enterprise: AgentAddress: GenericTrap:0 SpecificTrap:0 Timestamp:0}}
2024/09/23 17:27:08 snmp trap from=10.30.1.11 trap=&{Version:2c MsgFlags:NoAuthNoPriv SecurityModel:SnmpV3SecurityModel(0) SecurityParameters:<nil> ContextEngineID: ContextName: Community:public PDUType:SNMPv2Trap MsgID:0 RequestID:4400 MsgMaxSize:0 Error:NoError ErrorIndex:0 NonRepeaters:0 MaxRepetitions:0 Variables:[{Value:150700508 Name:.1.3.6.1.2.1.1.3.0 Type:TimeTicks} {Value:.1.3.6.1.4.1.9.9.131.2.0.1 Name:.1.3.6.1.6.3.1.1.4.1.0 Type:ObjectIdentifier} {Value:[7 232 9 23 17 27 12 0 43 9 0] Name:.1.3.6.1.4.1.9.9.131.1.1.1.0 Type:OctetString}] Logger:{logger:<nil>} SnmpTrap:{Variables:[] IsInform:false Enterprise: AgentAddress: GenericTrap:0 SpecificTrap:0 Timestamp:0}}
受信したTRAPの数値のOIDは、
の記事で紹介した方法を使って名前に変換できます。
TRAPの受信ができない時
以下の記事が参考になると思います。