SNMPTrap 消息发送到 Flashduty 平台

Sole 2025-01-02 14:24:10

一.SNMP 协议

1.协议介绍

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

2.主要组成

SNMP 协议包括以下三个部分

SNMP协议

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

二.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事件详情

四 总结

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

标签: SNMP
快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云
OpenSource
开源版
Flashcat
Flashcat