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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 18:34:59