SNMPTrap 消息发送到 Flashduty 平台

介绍如何把 SNMP Trap 消息发送到 Flashduty:从 SNMP Agent、Trap、MIB 基础概念,到 Debian 12 安装 snmptt/snmptrapd、转换 MIB、配置规则、脚本推送和交换机测试。

作者 Sole

SNMP 是监控网络设备的主要协议,但完整的轮询采集和指标建模确实比较麻烦。如果只是想简单高效地监控网络设备的关键事件并触发告警,SNMP Trap 是一个不错的方式。

本文介绍如何使用 snmptrapdsnmptt 搭配 Flashduty,把设备主动发送的 Trap 消息翻译后推送到告警平台。

核心摘要

  • SNMP Trap 是设备主动发送到管理端的通知消息,默认使用 UDP 162 端口,适合端口 down、设备故障等关键事件。
  • snmptrapd 负责接收 Trap,snmptt 负责根据 MIB 和规则翻译 Trap,并可通过 EXEC 调用脚本。
  • MIB 文件需要转换成 snmptt 可读取的规则文件,否则原始 Trap 里的 OID 和变量值不容易直接理解。
  • 推送到 Flashduty 的关键动作,是在 snmptt.conf 中调用脚本,把 Trap 字段组装成标准告警事件。

一、SNMP 协议基础

1. 协议介绍

snmp 协议是日常使用的较多的一种协议,绝大多数网络设备/存储等都支持 snmp 协议,通过此协议可以实现设备状态的监控及管理。

2. 主要组成

SNMP 协议包括以下三个部分

SNMP协议

SNMP Agent:负责处理 snmp 请求,主要包括 get,set 等操作。可通过此接口查询设备的运行状态(使用较多),或者变更配置(使用较少),默认使用 UDP 161 端口 SNMP Trap: snmp 通知消息,主动发送消息到管理端。如设备故障,端口 down 等都会实时发送消息到接收端。默认使用 UDP 162 端口 SNMP MIB:MIB 代表管理信息库,是按层次结构组织的信息的集合,定义了设备内被管理对象的属性。

可引用定义:SNMP 轮询解决“定期查看设备状态”的问题,SNMP Trap 解决“设备发生关键事件后主动通知”的问题。

二、SNMPTrap 通知处理链路

1. SNMPTT 介绍

SNMPTT (SNMP Trap Translator) 是一个 perl 语言编写的用来处理 snmptrap 消息的程序,可与 snmptrapd 程序(www.net-snmp.org)一起使用,基本流程如下

snmptt处理流程

snmptt 负责处理 net-snmp 接收到的 trap 消息,通过 snmptt 命令或 snmptthandler 进行处理,解析消息之后可将消息写入文件或数据库。

2. 安装 SNMPTT

操作系统为 Debian 12 x64,使用 apt 方式安装 snmptt,安装 snmptt 及相关组件

apt-get install snmptt libnet-syslogd-perl libnet-ip-perl

即可完成安装。

3. 转换 MIB 文件为规则文件

snmp trap 消息如果不翻译,原始内容可能是这样的

{
  "Version": 2,
  "TrapType": 0,
  "OID": null,
  "Other": null,
  "Community": "public",
  "Username": "",
  "Address": "172.16.1.64:49692",
  "VarBinds": {
    ".1.3.6.1.2.1.1.3.0": 7908527690000000,
    ".1.3.6.1.2.1.2.2.1.1.18": 18,
    ".1.3.6.1.2.1.2.2.1.2.18": "Vlanif103",
    ".1.3.6.1.2.1.2.2.1.7.18": 2,
    ".1.3.6.1.2.1.2.2.1.8.18": 2,
    ".1.3.6.1.6.3.1.1.4.1.0": [1, 3, 6, 1, 6, 3, 1, 1, 5, 3]
  },
  "VarBindOIDs": [
    ".1.3.6.1.2.1.1.3.0",
    ".1.3.6.1.6.3.1.1.4.1.0",
    ".1.3.6.1.2.1.2.2.1.1.18",
    ".1.3.6.1.2.1.2.2.1.7.18",
    ".1.3.6.1.2.1.2.2.1.8.18",
    ".1.3.6.1.2.1.2.2.1.2.18"
  ]
}

如果需要知道上述 oid 的具体内容及数值意义就需要对照 MIB 文件对消息进行“翻译”。snmptt 需要加载对应配置文件,对 trap 消息进行翻译。 snmptt 提供了 snmpttconvertmib 工具,snmpttconvertmib 是一个 Perl 脚本,它将读取 MIB 文件并将 TRAP-TYPE(v1)或 NOTIFICATIONATION-TYPE(v2)定义转换为 SNMPTT 可读的配置文件,从而实现对 trap 消息的翻译,基本命令如下:

/usr/bin/snmpttconvertmib --in=/usr/share/snmp/mibs/CPQHOST.mib --out=/etc/snmp/snmptt.conf.compaq --net_snmp_perl

上传snmptrap的 mib 文件到/usr/share/snmp/mibs/ 本例为CPQHOST.mib, /etc/snmp/snmptt.cong.compaq为转换完输出的配置文件

由于一般情况设备 mib 可能有多个,建议转换为一个配置文件中,便于管理,可使用以下命令进行批量转换。

for i in HUAWEI*
do
/usr/bin/snmpttconvertmib --in=$i --out=/etc/snmp/snmptt.conf.huawei --net_snmp_perl
done

转换完成后,可配置为snmptt的解析文件。

4. 配置 snmptt

snmptt 配置文件有 2 个

  • /etc/snmp/snmptt.ini snmptt 主要配置文件
  • /etc/snmp/snmptt.conf 系统默认的策略文件,包括一些基本的端口 up/down 的配置

修改默认的 snmptt.ini 配置文件,主要修改一下几个地方

mode = standalone
multiple_event = 0
net_snmp_perl_enable = 1
translate_log_trap_oid = 1
syslog_enable = 0

在文件末尾可添加snmpttconvertmib转换完成的规则文件

[TrapFiles]
# A list of snmptt.conf files (this is NOT the snmptrapd.conf file).  The COMPLETE path
# and filename.  Ex: '/etc/snmp/snmptt.conf'
snmptt_conf_files = <<END
/etc/snmp/snmptt.conf
/etc/snmp/snmptt.cong.compaq
END

snmptt 有二种模式,分别为

  • standalone 每次收到 trap 消息时读取 snmptt.ini 配置文件调用 snmptthandler 来处理 trap 消息
  • daemon 顾名思义守护进程方式,启动 snmptrap 时,初始化时一次性读取 snmptt.ini 二种方式各有区别,选择使用即可,具体区别可查看官方说明snmptt mode

由于这里测试使用,经常修改 snmptt.ini 配置文件,如果使用 daemon 模式,那么每次修改 snmptt.ini 配置文件就需要重启 snmptt,因此这里我使用 standalone 模式。

5. 配置 snmptrapd

snmptrap 消息为主动通知,因此需要配置服务来接收设备发送过来的trap 消息。snmptrapd接收trap消息后,通过 traphandle 调用 snmptt 来对 trap 消息进行处理。 安装snmptrapd

apt-get install snmptrapd -y

修改/etc/snmp/snmptrapd.conf 配置文件,添加如下

disableAuthorization yes
traphandle default /usr/sbin/snmptt

启动 snmptrap 服务

systemctl start snmptrapd
systemctl enable snmptrapd

6. 规则配置

系统snmptrapd收到trap消息后会交给snmptt处理,snmptt根据配置的规则进行对应trap消息的处理工作。 在snmptt.conf首先添加一条默认规则

EVENT default .* "Normal" "Warning"
EXEC /usr/local/bin/send_snmptt_alert.sh snmptrap "$s" "$aR" "$o" "$*"

未匹配到的任何规则的trap会执行/usr/local/bin/send_snmptt_alert.sh脚本,如需要对特定的SNMPTrap执行命令可按照如下规则配置。通常一个trap规则结构如下

EVENT hwSecLOGINSucced .1.3.6.1.4.1.2011.6.122.62.2.1 "Status Events" Normal
FORMAT $aA $*
SDESC

The user login succeeded.
Variables:
  1: hwSecLOGINUser
     Syntax="OCTETSTR"
     Descr="The user name."
  2: hwSecLOGINIP
     Syntax="OCTETSTR"
     Descr="The User IP address."
  3: hwSecLOGINTime
     Syntax="OCTETSTR"
     Descr="The User login time."
  4: hwSecLOGINType
     Syntax="OCTETSTR"
     Descr="The User access type."
  5: hwSecLOGINLevel
     Syntax="INTEGER32"
     Descr="The User login level."
EDESC
......
  • EVENT开头为事件类型,以及对应的snmptrap oid
  • FORMAT 为按照snmptt定义的内部变量进行snmptrap告警内容的格式化
  • SDESC到EDESC为事件描述
  • EXEC 收到事件调用外部脚本 可在FORMAT 之后加入
EXEC /usr/local/bin/send_snmptt_alert.sh snmptrap "$s" "$aR" "$o" "$*"

如果收到此trap消息后,会执行/usr/local/bin/send_snmptt_alert.sh脚本,并传入后面的参数,此处参数为snmptt内置参数和 FROMAT 里通用,具体可在 http://snmptt.sourceforge.net/docs/snmptt.shtml#SNMPTT.CONF-FORMAT 查看,常用的几个如下:

  • $aA snmp trap 的代理 IP,即源 IP
  • $o 数字oid形式
  • $* 所有变量
  • $n n 为数字,表示变量次序

至此完成了 snmptrap 消息的接收及翻译工作。

三、Flashduty 配置

1. 添加集成

登录Flashduty平台,先新建协作中心,之后点击集成中心,选择标准告警集成,新建一个snmp的集成中心,记录好推送地址

Flashduty创建集成

2. 编辑发送脚本

在/usr/local/bin/目录下新建发送脚本send_snmptt_alert.sh内容如下

#!/bin/bash

# 参数从 SNMPTT 传递过来
INTEGRATION_KEY="XXXXXXXXXXX"  # 替代你的 integration_key
SERVICE=$1
STATUS=$2
RESOURCE=$3
METRIC=$4
DESCRIPTION=$5

# 定义 API URL
API_URL="https://api.flashcat.cloud/event/push/alert/standard?integration_key=$INTEGRATION_KEY"

# 构建 POST 的 JSON 数据
POST_DATA=$(cat <<EOF
{
  "event_status": "$STATUS",
  "alert_key": "$METRIC",
  "description": "$DESCRIPTION",
  "title_rule": "$RESOURCE::$SERVICE",
  "labels": {
    "service": "$SERVICE",
    "resource": "$RESOURCE",
    "metric": "$METRIC"
  }
}
EOF
)

# 使用 curl 发送 POST 请求
curl -X POST "$API_URL" \
     -H "Content-Type: application/json" \
     -d "$POST_DATA"

赋予可执行权限,INTEGRATION_KEY为平台提供地址后的key

chmod a+x /usr/local/bin/send_snmptt_alert.sh

3. 测试集成

配置一台交换机的snmptrap消息发送刚才的snmptrap服务器

snmp-agent trap enable
snmp-agent target-host trap address udp-domain 172.16.66.16 params securityname cipher A_a123456

并 SSH 登录交换机,就会产生 trap 消息,然后登录 Flashduty 就可以看到告警了:

Flashduty

查看详情:

Flashduty事件详情

四、配置时的注意点

  • Trap 依赖厂商 MIB。没有对应 MIB 或规则文件时,告警内容可能只有 OID 和变量值,不利于定位。
  • snmptt.ini 的 standalone 和 daemon 模式各有取舍。测试阶段频繁修改配置时,standalone 更方便;稳定运行后可根据实际情况选择。
  • snmptrapd 接收 Trap 后需要通过 traphandle 调用 snmptt,否则只接收不翻译,无法完成后续推送。
  • send_snmptt_alert.sh 中的 INTEGRATION_KEY 要替换为 Flashduty 集成提供的 key。
  • 设备侧建议按需要开启 Trap 级别,过滤不需要的 Trap 消息,避免告警噪声。

五、结论

SNMPTrap消息通知主要依赖厂家提供的trap mib文件,通过对文件字段的解析和翻译,组成可识别的告警内容。Trap消息的有点在于及时性和通用性。网络设备、防火墙、BMC等都支持推送Trap消息。在配置snmptrap过程中注意配置snmptrap级别,过滤不需要的trap消息。

把 SNMP Trap 接入 Flashduty 的关键路径是:设备发送 Trap,snmptrapd 接收,snmptt 翻译,规则调用脚本,脚本把标准告警事件推送到 Flashduty。这样既能保留 Trap 的及时性,也能把告警纳入认领、协作和升级流程。

FAQ

Q1:为什么需要先转换 MIB 文件? A:原始 Trap 里大量信息是 OID 和变量值。转换 MIB 后,snmptt 才能根据规则把这些内容翻译成可读告警。

Q2:snmptrapd 和 snmptt 分别负责什么? A:snmptrapd 负责接收 Trap,snmptt 负责翻译 Trap、匹配规则并执行后续动作。

Q3:Flashduty 集成的关键配置是什么? A:关键是标准告警集成的推送地址和 integration_key,脚本需要使用这个 key 组装 API URL。

Q4:如何减少无效 Trap 告警? A:在设备侧控制 Trap 级别,在 snmptt 规则中按 OID 和变量做过滤,并只把需要处理的事件推送到告警平台。

延伸路径

继续看解决方案和产品对比

如果你正在做监控、可观测性或故障定位相关选型,建议从解决方案和产品对比继续往下看。

标签 SNMP
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云