0

0

如何解决 PySNMP 自定义 Agent 在端口 1161 上响应超时问题

聖光之護

聖光之護

发布时间:2026-01-06 10:17:36

|

646人浏览过

|

来源于php中文网

原创

如何解决 PySNMP 自定义 Agent 在端口 1161 上响应超时问题

pysnmp 自定义 snmp agent 启动后无法响应 `snmpget` 等请求,根本原因是未配置 vacm(view-based access control model)访问控制策略,导致即使请求到达、oid 匹配成功,也因权限拒绝而静默丢弃——需显式调用 `config.addvacmuser` 授权 oid 访问。

在使用 PySNMP 构建自定义 SNMP Agent 时,仅注册 CommunityData 和 GetCommandResponder 并不足以启用实际的 SNMP 查询响应。PySNMP 默认启用严格的基于视图的访问控制(VACM),若未显式配置哪些 OID 范围允许被哪些团体名(community)读取,所有入站 GET/GETNEXT 请求将被静默拒绝——这正是你看到 Timeout: No Response 的根本原因(而非网络不通或端口未监听)。

你的代理代码中已正确:

  • 绑定 UDP 传输到 127.0.0.1:1161;
  • 注册了 CommunityData('public', mpModel=1)(SNMPv2c);
  • 实现了 process_snmp_request 处理逻辑并能打印日志(可验证请求已抵达);
  • tcpdump 显示请求包确实发出并到达本机(UDP 长度 43 字节匹配 SNMPv2c GET PDU)。

但缺失关键一步:为 'public' 团体授予对自定义 OID 树(如 1.3.6.1.4.1.9999)的读取权限

✅ 正确修复:添加 VACM 访问策略

在 create_snmp_agent() 函数中、config.addTransport(...) 之后、snmpEngine.transportDispatcher.runDispatcher() 之前,插入以下 VACM 配置:

Animate AI
Animate AI

Animate AI是个一站式AI动画故事视频生成工具

下载
# --- 添加 VACM 访问控制策略(关键修复!)---
# 1. 创建一个名为 'myView' 的 MIB 视图,覆盖整个自定义 OID 子树
config.addVacmUser(
    snmpEngine, 
    2,                          # authProtocol: SNMPv2c (2)
    'public',                   # communityName
    'noAuthNoPriv',             # securityModel
    [OID('1.3.6.1.4.1.9999')], # contextMatch: 可选,通常省略
    'myView',                   # viewName
    'exact'                     # viewType: 'exact' or 'prefix'
)

# 2. 定义 'myView' 视图,包含 OID 范围 1.3.6.1.4.1.9999.*(即全部自定义 MIB)
config.addMibView(
    snmpEngine,
    'myView',
    OID('1.3.6.1.4.1.9999'),   # included subtree
    OID('1.3.6.1.4.1.9999.999999999')  # excluded subtree (optional, here unused)
)

# 3. 授予 'public' 用户对该视图的 read/write/notify 权限(此处只需 read)
config.setAccess(
    snmpEngine,
    'myGroup',                  # groupName(任意唯一名)
    '',                         # contextPrefix(空表示 default context)
    2,                          # securityModel(2 = SNMPv2c)
    'noAuthNoPriv',             # securityLevel
    'exact',                    # match('exact' for context name match)
    'myView',                   # readView
    'none',                     # writeView(无需写操作)
    'none'                      # notifyView(无需通知)
)

# 4. 将用户 'public' 加入组 'myGroup'
config.addGroup(snmpEngine, 'myGroup', 2, 'noAuthNoPriv', 'public')
? 说明:OID(...) 是 pysnmp.smi.rfc1902.OID 类型,需提前导入: from pysnmp.smi.rfc1902 import OID

? 补充建议与注意事项

  • 端口与防火墙:确认 1161 未被系统防火墙(如 ufw、firewalld 或 macOS 防火墙)拦截;本地回环(127.0.0.1)通常无需额外放行,但可临时禁用防火墙验证。
  • MIB 编译与加载(可选增强):虽然 snmpget 直接用数字 OID 可工作,但为支持符号化查询(如 snmpget ... MY-MIB::memoryUtil),需将编译后的 my-mib.py 放入 PySNMP MIB 搜索路径,并在客户端启用 MIB 解析(-m +MY-MIB)。
  • 调试技巧:启用 PySNMP 内部日志快速定位 VACM 拒绝:
    from pysnmp import debug
    debug.setLogger(debug.Debug('all'))  # 或 'acl' 查看访问控制日志

    若日志中出现 VACM: access denied,即确认是权限问题。

  • SNMPv3 建议(生产环境):SNMPv2c 使用明文团体名不安全。生产部署应升级至 SNMPv3,配合 UsmUserData 和加密配置。

完成上述 VACM 配置后重启 Agent,再次执行测试命令即可成功响应:

snmpget -v2c -c public 127.0.0.1:1161 1.3.6.1.4.1.9999.1
# 输出示例:SNMPv2-SMI::enterprises.9999.1 = INTEGER: 65

snmpwalk -v2c -c public 127.0.0.1:1161 1.3.6.1.4.1.9999
# 将返回 memoryUtil, cpuUtil, diskUtil 三个 OID 的值

✅ 总结:PySNMP Agent 的“超时”常是 VACM 静默拦截所致。牢记——注册 Community ≠ 授予访问权;务必通过 addVacmUser + addMibView + setAccess 三步完成最小必要授权,这是构建可靠自定义 SNMP Agent 的必备实践。

相关专题

更多
macOS怎么切换用户账户
macOS怎么切换用户账户

在 macOS 系统中,可通过多种方式切换用户账户。如点击苹果图标选择 “系统偏好设置”,打开 “用户与群组” 进行切换;或启用快速用户切换功能,通过菜单栏或控制中心的账户名称切换;还能使用快捷键 “Control+Command+Q” 锁定屏幕后切换。

329

2025.05.09

tcp和udp的区别
tcp和udp的区别

TCP和UDP的区别,在连接性、可靠性、速度和效率、数据报大小以及适用场景等方面。本专题为大家提供tcp和udp的区别的相关的文章、下载、课程内容,供大家免费下载体验。

118

2023.07.25

udp是什么协议
udp是什么协议

UDP是OSI参考模型中一种无连接的传输层协议。本专题为大家带来udp是什么协议的相关文章,免费提供给大家。

274

2023.08.08

tcp和udp有什么区别
tcp和udp有什么区别

tcp和udp的区别有:1、udp是无连接的,tcp是面向连接的;2、udp是不可靠传输,tcp是可靠传输;3、udp是面向报文传输,tcp是面向字节流传输。想了解更多tcp相关的内容,可阅读本专题下面的相关文章。

357

2024.11.14

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

322

2023.10.09

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

380

2023.10.16

asp连接access数据库的方法
asp连接access数据库的方法

连接的方法:1、使用ADO连接数据库;2、使用DSN连接数据库;3、使用连接字符串连接数据库。想了解更详细的asp连接access数据库的方法,可以阅读本专题下面的文章。

119

2023.10.18

access和trunk端口的区别
access和trunk端口的区别

access和trunk端口的区别是Access端口用于连接终端设备,提供单个VLAN的接入,而Trunk端口用于连接交换机之间,提供多个VLAN的传输;Access端口只传输属于指定VLAN的数据,而Trunk端口可以传输多个VLAN的数据,并使用VLAN标签进行区分。想了解更多access和trunk端口相关内容,可以阅读本专题下面的文章。

318

2023.10.31

PPT动态图表制作教程大全
PPT动态图表制作教程大全

本专题整合了PPT动态图表制作相关教程,阅读专题下面的文章了解更多详细内容。

13

2026.01.07

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Linux网络安全之防火墙技术汇总
Linux网络安全之防火墙技术汇总

共31课时 | 3万人学习

CSS3 教程
CSS3 教程

共18课时 | 4.3万人学习

Sass 教程
Sass 教程

共14课时 | 0.7万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号