SNMPTraps:pysnmp 和 "disableAuthorization"

SNMPTraps: pysnmp and "disableAuthorization"

我已经编写了一个 SNMP 陷阱接收器,但目前我必须对所有 SNMPv2 社区字符串进行硬编码才能接收陷阱。

如何在 pysnmp 中模拟 snmptrapd 的 'disableAuthorization' 功能?

我曾尝试不设置社区字符串:config.addV1System(snmpEngine, 'my-area') 但此错误与缺少参数有关。我还尝试了一个空字符串:config.addV1System(snmpEngine, 'my-area', '') 但这会停止处理所有陷阱。

允许通过 pysnmp 接收所有陷阱的最佳方法是什么,而不管它们与它们一起发送的社区字符串如何?我没有在 pysnmp 文档中找到任何可以帮助我的东西

我在为 V1/2(V3 稍后添加)设置观察器方面取得了进展,该观察器接收带有未知社区字符串的通知,然后动态调用 addV1System 以动态添加它,像这样:

设置 transportDispatcher 时:

  snmpEngine.observer.registerObserver(_handle_unauthenticated_snmptrap,
        "rfc2576.prepareDataElements:sm-failure", "rfc3412.prepareDataElements:sm-failure")

然后:

def _handle_unauthenticated_snmptrap(snmpEngine, execpoint, variables, cbCtx):
    if variables["securityLevel"] in [ 1, 2 ] and variables["statusInformation"]["errorIndication"] == errind.unknownCommunityName:
        new_comm_string = "%s" % variables["statusInformation"].get("communityName", "")
        config.addV1System(my_snmpEngine, 'my-area', new_comm_string)
        return
    else:
        msg = "%s" % variables["statusInformation"]
        print(f"Trap: { msg }")

但是,这总是会丢弃在添加任何新的社区字符串时收到的第一个陷阱(然后就会出现问题,即当守护程序重新启动时,社区字符串的更新列表会丢失)。

为了改进这一点,我发现隐藏在文档中的这个小东西 gem:

https://pysnmp.readthedocs.io/en/latest/examples/v3arch/asyncore/manager/ntfrcv/advanced-topics.html#serve-snmp-community-names-defined-by-regexp

此示例收到通知并将社区字符串重写为 'public',以便正确接收所有陷阱。

本质上,在设置 transportDispatcher 时:

    my_snmpEngine.observer.registerObserver(_trap_observer,
        'rfc2576.processIncomingMsg:writable', cbCtx='public')

然后:

def _trap_observer(snmpEngine, execpoint, variables, community_string):
     variables['communityName'] = variables['communityName'].clone(community_string)