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
相关产品推荐
相关产品推荐

