Python SNMPv3 陷阱

Posted

技术标签:

【中文标题】Python SNMPv3 陷阱【英文标题】:Python SNMPv3 traps 【发布时间】:2019-12-02 12:19:46 【问题描述】:

我试图通过 snmpv3 发送陷阱,这是我的第一次尝试:

#!/usr/bin/python

from pysnmp.hlapi import *

TARGET="localhost"
TARGET_PORT=162
COMMUNITY_STR="PASSWORD"
IDENTIFIER="1.3.6.1.2.1.xxx"
USER="trapadm"
KEY="PASSWORD"



# OID NODE : MESSAGE

values =  ".100.5": "LOL",
            ".100.6": "ROFL",
        

def notification(   
                    NODE,
                    MESSAGE,
                    TARGET=TARGET, 
                    TARGET_PORT=TARGET_PORT, 
                    #COMMUNITY_STR=COMMUNITY_STR, 
                    IDENTIFIER=IDENTIFIER

                ):
    errorIndication, errorStatus, errorIndex, varBinds = next(
        sendNotification(
            SnmpEngine(),
            UsmUserData(userName=USER, privKey=KEY, authKey=KEY
                        #authProtocol=usmHMACMD5AuthProtocol,
                        #privProtocol=usmDESPrivProtocol
                        #authProtocol=(1, 3, 6, 1, 6, 3, 10, 1, 1, 2),
                        #privProtocol= (1, 3, 6, 1, 6, 3, 10, 1, 2, 2)
                        ),
        #CommunityData(COMMUNITY_STR, mpModel=0),
            UdpTransportTarget((TARGET, TARGET_PORT)),
            ContextData(),
            'trap',
            NotificationType(
                ObjectIdentity(IDENTIFIER)
            ).addVarBinds(
                (IDENTIFIER+NODE, OctetString(MESSAGE)))
        )
    )

    if errorIndication:
        print(errorIndication)



CASE = True

def main():

    for key in values: 
        if CASE is True:
            notification(key, values[key])



if __name__ == '__main__':
    main()

我已经使用以下命令测试了我的陷阱接收器的功能(立即生效)

snmptrap -Ci -v 3 -a MD5 -A PASSWORD -x DES -X PASSWORD -l authPriv -u trapadm localhost 0 linkUp.0

现在使用上面的 python 脚本,我可以通过 tcpdump 看到它已发送,但它没有出现在 trapd 日志文件中。我怀疑它在某种程度上取决于 auth-/privProtocol。 顺便说一句,注释行(auth-/privProtocol)。也进行了测试。

这里有什么想法吗?

【问题讨论】:

【参考方案1】:

您的代码在我看来不错(here is 工作示例)。

重要的一点是,使用 SNMPv3 TRAP,您必须手动将 TRAP 发射器的 SNMP 引擎 ID 值传递给 TRAP 接收器。这是由于 TRAP 的单向特性导致无法进行自动同步过程(例如,与 SNMP 命令不同)。

我猜snmptrap 会发生这种情况,因此snmptrapsnmpd 从一开始就具有相同的 SNMP 引擎 ID 值。

解决方案可以是将-e <snmp-engine-id> 参数添加到snmptrap,并将其配置为context-snmp-engine-idtrapadmtrapadm 用户条目。

【讨论】:

感谢您的回复。我会看看并考虑如何实现这一点。无论如何,我找到了接收陷阱的方法。我需要将 ContextData() 下的“陷阱”更改为“信息”,这似乎类似于 snmptrap 命令的 参数

以上是关于Python SNMPv3 陷阱的主要内容,如果未能解决你的问题,请参考以下文章

SNMP v3 似乎不起作用

snmptrapd : 身份验证失败

程序员必知的Python陷阱与缺陷列表

Python陷阱例程

python异常是不是会生成软件陷阱/中断?

Python(55)_默认参数的陷阱