Erlang snmpm自定义snmpm_user未处理SNMP陷阱问题求助
Erlang snmpm自定义模块无法处理SNMP陷阱问题解决
环境与问题
环境配置
- 基于Erlang
snmpm模块开发,已实现snmpm_user行为的自定义模块snmpm_user1,期望用它处理SNMP陷阱 - 使用net-snmp发送陷阱,命令如下(陷阱从随机临时端口发送,符合SNMP标准):
sudo snmptrap -v 2c -c public 127.0.0.1:5000 "" .1.3.6.1.4.1.8072.2.3.0.1 .1.3.6.1.2.1.1.3.0 s "Trap 2"
问题现象
- SNMP GET响应可正常由
snmpm_user1处理,但陷阱始终默认snmpm_user_default处理 - 日志提示无法识别陷阱来源端口:
unknown agent: 127.0.0.1:51773. Known Agents: {{127,0,0,1},161}
failed retrieving user id for agent {{127,0,0,1},51773} - 调试确认
snmpm_user_table中,snmpm_user1和默认模块均绑定代理地址127.0.0.1:161
错误日志摘要
*** [2024-11-28 21:42:35.829] SNMP M-NET-IF MPD LOG *** [agent engine max msg size lookup] unknown agent: 127.0.0.1:51773 Known Agents: [{"Agent1",{{127,0,0,1},161}}] *** [2024-11-28 21:42:35.834] SNMP M-SERVER LOG *** [trap] failed retrieving user id for agent <snmpUDPDomain,{{127,0,0,1}, 51773}>: Error: {error, {target_name_not_found,snmpUDPDomain,{{127,0,0,1},51773}}} when Users: [snmp_manager] Agents: ["Agent1"]
原因分析
Erlang snmpm默认通过固定IP+端口关联代理与用户模块,但SNMP陷阱发送端使用随机临时端口,导致snmpm无法匹配到已配置的127.0.0.1:161代理条目,只能 fallback到默认模块处理。
解决方案
方案1:配置通配端口代理(推荐)
修改snmpm配置,允许匹配同一IP下的任意端口:
- 启动snmpm时,将代理地址配置为
{{127,0,0,1}, 0}(0代表任意端口) - 关联
snmpm_user1到该通配代理:
或在配置文件中添加:% 代码方式注册 snmpm:register_user(snmpm_user1, [], [{agent, {"AgentAnyPort", {{127,0,0,1}, 0}}}]){users, [ {snmpm_user1, [], [ {agent, {"AgentAnyPort", {{127,0,0,1}, 0}}} ]} ]}
方案2:动态注册临时端口代理
通过默认模块的回调,动态注册未知代理并转发到自定义模块:
- 重写
snmpm_user_default的handle_unknown_agent/3函数:handle_unknown_agent(Domain, AgentAddr, SnmpInfo) -> % 提取IP,忽略临时端口 {_, {Ip, _Port}} = AgentAddr, % 注册该IP的通配端口代理 case snmpm:register_agent("AgentDynamic", Domain, {Ip, 0}) of ok -> snmpm:register_user(snmpm_user1, [], [{agent, {"AgentDynamic", {Ip, 0}}}]); _ -> ok end, % 转发陷阱到自定义模块处理 snmpm_user1:handle_trap(Domain, AgentAddr, SnmpInfo, UserData).
方案3:基于SNMPv3引擎ID匹配(若使用SNMPv3)
如果采用SNMPv3,可通过引擎ID而非IP+端口关联代理,避免临时端口问题:
{agent, {"AgentByEngineId", {snmpEngineID, "800007E5031234567890"}}}
内容的提问来源于stack exchange,提问作者Bhuvan
相关产品推荐
相关产品推荐

