You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PySNMP在同一主机上无法接收SNMPv2 Trap问题求助

问题解决步骤

  • 端口权限校验:SNMP Trap默认使用UDP 162端口,属于1024以下的特权端口,运行脚本时需要对应权限:Linux/Unix系统需用sudo运行,Windows系统需右键选择「以管理员身份运行」命令行/IDE再执行脚本。
  • 防火墙规则校验:确认系统防火墙已放行入方向的UDP 162端口,同时临时关闭SELinux(Linux环境)/第三方安全软件测试,避免报文被安全策略拦截。
  • 补充通知过滤规则:现有代码缺少PySNMP接收通知的源地址放行配置,未匹配规则的报文会被直接丢弃,需添加addTargetAddr配置项放开接收范围。
  • 升级依赖版本:旧版PySNMP存在v2c Trap接收的已知bug,先执行pip install --upgrade pysnmp pysmi升级到最新稳定版再测试。

修正后的完整代码

from pysnmp.entity import engine, config
from pysnmp.entity.rfc3413 import ntfrcv
from pysnmp.carrier.asyncore.dgram import udp

def v2cv1CallBackFunc(snmpEngine, stateReference, contextEngineId, contextName,
                      varBinds, cbCtx):
    transportDomain, transportAddress = snmpEngine.msgAndPduDsp.getTransportInfo(stateReference)
    print(transportDomain, transportAddress)
    # 获取执行上下文
    execContext = snmpEngine.observer.getExecutionContext(
        'rfc3412.receiveMessage:request'
    )

    # 读取SNMP引擎内部数据获取发送端地址
    print('Notification from %s, ContextEngineId "%s", ContextName "%s"'
                          %('@'.join([str(x) for x in execContext['transportAddress']]),
                            contextEngineId.prettyPrint(), contextName.prettyPrint()))

    for name, val in varBinds:
        print('%s = %s' % (name.prettyPrint(), val.prettyPrint()))

def runSNMP():
    snmpEngine = engine.SnmpEngine()

    # SNMPv1/2c配置 团体字public
    config.addV1System(snmpEngine, 'my-area', "public")

    # 配置安全参数 SNMPv2c对应版本号1
    config.addTargetParams(snmpEngine, 'my-creds', 'my-area', 'noAuthNoPriv', 1)

    # 新增:放行所有源地址的Trap通知
    config.addTargetAddr(
        snmpEngine, 'my-all-sources',
        udp.domainName + (1,),
        '0.0.0.0',
        'my-creds',
        tagList='notify'
    )

    # 传输层配置 绑定所有网卡的162端口
    config.addSocketTransport(
        snmpEngine,
        udp.domainName + (1, ),
        udp.UdpSocketTransport().openServerMode(('0.0.0.0', 162))
    )

    # 注册通知接收回调
    ntfrcv.NotificationReceiver(snmpEngine, v2cv1CallBackFunc)

    snmpEngine.transportDispatcher.jobStarted(1)

    try:
        snmpEngine.transportDispatcher.runDispatcher()
    except:
        snmpEngine.transportDispatcher.closeDispatcher()
        raise

if __name__ == '__main__':
    runSNMP()

测试时可通过命令验证端口是否正常绑定:Linux环境执行ss -lunp | grep 162,Windows环境执行netstat -ano | findstr 162,确认Python进程已成功占用162 UDP端口。

内容的提问来源于stack exchange,提问作者Zac6749

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 16:30:00