配置 SNMP Trap

SNMP *trap* 是从 SNMP 代理发送到 SNMP 管理器的警报通知消息。当受监控的设备或服务中发生任何故障或错误时,会生成这些消息。SNMPv3 inform 是一种已确认的 SNMPv3 trap。

您可以为 SNMPv3 trap 和 inform 消息配置以下内容

  • Trap 目标 IP 地址;VRF 名称是可选的。
  • 身份验证类型和密码。加密类型和密码是可选的。
  • 发送 trap 的 Cumulus Linux 交换机的引擎 ID 和用户名对。*inform* 关键字指定 inform 消息,其中 SNMP 代理等待确认。您可以在 `/var/lib/snmp/snmpd.conf` 文件的末尾找到标记为 *oldEngineID* 的内容。为接收 trap 的 trap 守护进程配置相同的引擎 ID/用户名(以及身份验证和加密密码),以验证接收到的 trap。

生成事件通知 Trap

Net-SNMP 代理提供了一种使用分布式管理 (DisMan) 事件 MIB 为各种系统事件生成 SNMP trap 事件的方法,包括

  • 链路 Up/Down。
  • 超过温度传感器阈值、CPU 负载或内存阈值。
  • 其他 SNMP MIB。

要启用特定类型的 trap,请在 `/etc/snmp/snmpd.conf` 中创建以下配置。

定义访问凭据

虽然 trap 被发送到 SNMPv2c 接收器,但仍需要 SNMPv3 用户名来授权 DisMan 服务。从 Net-SNMP 5.3 开始,`snmptrapd` 不再默认接受所有 trap。您必须使用授权的 SNMPv1 和 v2c 团体字符串以及/或 SNMPv3 用户配置 `snmptrapd`。未经授权的 trap 和 inform 将被丢弃。

按照 配置 SNMP 中的步骤定义用户名。您可以参考 snmptrapd.conf(5) 手册页 获取更多信息。

如果系统上尚未安装,请在使用 `sudo apt-get install snmptrapd` 命令配置用户名之前安装 `snmptrapd` Debian 软件包。

定义 Trap 接收器

以下配置定义了 SNMPv1 和 SNMPv2c trap 的 trap 接收器 IP 地址。对于 SNMP 版本 1 和 2c,您必须设置至少一个 SNMP trap 目标 IP 地址;可以存在多个目标。删除所有设置将禁用 SNMP trap。默认版本为 2c。您必须在 IP 地址中包含 VRF 名称,以强制 trap 在非默认 VRF 表中发送。

cumulus@switch:~$ nv set system snmp-server trap-destination localhost vrf rocket community-password mymanagementvrfpassword version 1
cumulus@switch:~$ nv set system snmp-server trap-destination localhost-v6 community-password mynotsosecretpassword version 2c
cumulus@switch:~$ nv config apply

要为 SNMPv1 trap 或 SNMPv2 trap 定义通知(或 trap)接收器的 IP 地址,请使用 `trapsink` (SNMPv1) `trap2sink` (SNMPv2c)。指定多个 sink 指令会生成每个通知的多个副本(采用适当的格式)。您必须配置 trap 服务器来接收和解码这些 trap 消息(例如,`snmptrapd`)。您可以使用不同的协议和端口配置 trap 接收器的地址,但这通常会被省略。默认设置是使用众所周知的 UDP 数据包和端口 162。

编辑 `/etc/snmp/snmpd.conf` 文件并配置 trap 设置。

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
trap2sink [::1] mynotsosecretpassword
trapsink 127.0.0.1@rocket mymanagementvrfpassword
...

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

SNMPv3 Trap 和 Inform 消息

SNMP trap 接收守护进程必须具有使用其自身 EngineID 创建的用户名、身份验证密码和加密密码。您必须在发送 trap 和 inform 消息的交换机 `snmpd` 守护进程中配置此 trap 服务器 EngineID。

cumulus@switch:~$ nv set system snmp-server trap-destination localhost username myv3user auth-md5 md5password1 encrypt-aes myaessecret engine-id  0x80001f888070939b14a514da5a00000000 inform
cumulus@switch:~$ nv set system snmp-server trap-destination localhost vrf mgmt username mymgmtvrfusername auth-md5 md5password2 encrypt-aes myaessecret2 engine-id  0x80001f888070939b14a514da5a00000000 inform
cumulus@switch:~$ nv config apply

您可以使用 `trapsess` 配置命令配置 SNMPv3 trap 和 inform 消息。Inform 消息是接收 trap 守护进程确认的 trap。您可以使用 `-Ci` 参数配置 inform 消息。您必须使用 `-e` 字段指定接收 trap 服务器的 EngineID。

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
trapsess -Ci -e 0x80001f888070939b14a514da5a00000000 -v3 -l authPriv -u mymgmtvrfusername -a MD5 -A md5password2 -x AES -X myaessecret2 127.0.0.1@mgmt
trapsess -Ci -e 0x80001f888070939b14a514da5a00000000 -v3 -l authPriv -u myv3user -a MD5 -A md5password1 -x AES -X myaessecret 127.0.0.1
...

您可以定义多个 trap 接收器,并在 `trap2sink` 指令中使用域名而不是 IP 地址。

重启 `snmpd` 服务以应用更改

cumulus@switch:~$ sudo systemctl restart snmpd.service

从不同的源 IP 地址发送 Trap

当您从命令行运行客户端 SNMP 程序(例如 `snmpget`、`snmpwalk` 或 `snmptrap`)时,或者当您配置 `snmpd` 发送 trap(基于 `snmpd.conf`)时,您可以在 `snmpd.conf` 中配置 `clientaddr`,以允许 SNMP 客户端程序或 `snmpd`(对于 trap)从不同的源 IP 地址发送请求。

有关 `clientaddr` 的更多信息,请参阅 `snmpd.conf` 手册页

`snmptrap`、`snmpget`、`snmpwalk` 和 `snmpd` 本身必须能够绑定到此地址。

编辑 `/etc/snmp/snmpd.conf` 文件并添加 `clientaddr` 选项。在以下示例中,spine01 是客户端(IP 地址 192.168.200.21)。

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
trapsess -Ci --clientaddr=192.168.200.21 -v 2c
...

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

NVUE 不提供用于此配置的命令。

监控风扇、电源、温度和变压器

SNMP 代理 (`snmpd`) 等待传入的 SNMP 请求并响应它们。如果代理未收到任何请求,则不会启动任何操作。但是,各种命令可以将 `snmpd` 配置为根据预配置的设置(`load`、`file`、`proc`、`disk` 或 `swap` 命令)或自定义的 `monitor` 指令发送 trap。

有关 `monitor` 指令的详细信息,请参阅 `snmpd.conf` 手册页

您可以通过将 `monitor` 指令添加到 `snmpd.conf` 文件中,将 `snmpd` 配置为监控实体 MIB 或实体传感器 MIB 的运行状态。在您知道 OID 后,您可以确定运行状态,其值可以是 *ok(1)*、*unavailable(2)* 或 *nonoperational(3)*。将如下示例的配置添加到 `/etc/snmp/snmpd.conf` 并调整值

  • 使用 `entPhySensorOperStatus` 整数
cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
# without installing extra MIBS we can check the check Fan1 status
# if the Fan1 index is 100011001, monitor this specific OID (-I) every 10 seconds (-r), and defines additional information to be included in the trap (-o).
monitor -I -r 10  -o 1.3.6.1.2.1.47.1.1.1.1.7.100011001 "Fan1 Not OK"  1.3.6.1.2.1.99.1.1.1.5.100011001 > 1
# Any Entity Status non OK (greater than 1)
monitor  -r 10  -o 1.3.6.1.2.1.47.1.1.1.1.7  "Sensor Status Failure"  1.3.6.1.2.1.99.1.1.1.5 > 1
  • 使用 OID 名称。如果系统上安装了 `snmp-mibs-downloader` 软件包,您可以使用 OID 名称(请参阅下方)。
cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
# for a specific fan called Fan1 with an index 100011001
monitor -I -r 10  -o entPhysicalName.100011001 "Fan1 Not OK"  entPhySensorOperStatus.100011001 > 1
# for any Entity Status not OK ( greater than 1)
monitor  -r 10  -o entPhysicalName  "Sensor Status Failure"  entPhySensorOperStatus > 1

您可以通过遍历 `entPhysicalName` 表来查找 `entPhySensorOperStatus` 整数。

要获取所有传感器信息,请在 `entPhysicalName` 表上运行 `snmpwalk`。例如

cumulus@leaf01:~$ snmpwalk -v 2c -cpublic localhost .1.3.6.1.2.1.47.1.1.1.1.7
iso.3.6.1.2.1.47.1.1.1.1.7.100000001 = STRING: "PSU1Temp1"
iso.3.6.1.2.1.47.1.1.1.1.7.100000002 = STRING: "PSU2Temp1"
iso.3.6.1.2.1.47.1.1.1.1.7.100000003 = STRING: "Temp1"
iso.3.6.1.2.1.47.1.1.1.1.7.100000004 = STRING: "Temp2"
iso.3.6.1.2.1.47.1.1.1.1.7.100000005 = STRING: "Temp3"
iso.3.6.1.2.1.47.1.1.1.1.7.100000006 = STRING: "Temp4"
iso.3.6.1.2.1.47.1.1.1.1.7.100000007 = STRING: "Temp5"
iso.3.6.1.2.1.47.1.1.1.1.7.100011001 = STRING: "Fan1"
iso.3.6.1.2.1.47.1.1.1.1.7.100011002 = STRING: "Fan2"
iso.3.6.1.2.1.47.1.1.1.1.7.100011003 = STRING: "Fan3"
iso.3.6.1.2.1.47.1.1.1.1.7.100011004 = STRING: "Fan4"
iso.3.6.1.2.1.47.1.1.1.1.7.100011005 = STRING: "Fan5"
iso.3.6.1.2.1.47.1.1.1.1.7.100011006 = STRING: "Fan6"
iso.3.6.1.2.1.47.1.1.1.1.7.100011007 = STRING: "PSU1Fan1"
iso.3.6.1.2.1.47.1.1.1.1.7.100011008 = STRING: "PSU2Fan1"
iso.3.6.1.2.1.47.1.1.1.1.7.110000001 = STRING: "PSU1"
iso.3.6.1.2.1.47.1.1.1.1.7.110000002 = STRING: "PSU2"

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

Cumulus Linux 不再使用 LM-SENSORS MIB 监控温度。

您可以将交换机配置为在链路的运行状态更改时触发链路 Up 和链路 Down 通知。

以下示例命令启用 Disman 事件 MIB (.1.3.6.1.2.1.88.2.0.1) 以每 15 秒监控一次 ifTable 中启动的网络接口或每 10 秒监控一次关闭的网络接口,并触发名为 `CumulusLinkUp` 和 `CumulusLinkDown` 的通知。

默认检查频率为 60 秒,最小值为 5 秒,最大值为 300 秒。

这些通知包括以下信息。

  • ifName
  • ifIndex
  • ifAdminStatus
  • ifOperStatus
cumulus@switch:~$ nv set system snmp-server trap-link-down check-frequency 10
cumulus@switch:~$ nv set system snmp-server trap-link-up check-frequency 15
cumulus@switch:~$ nv config apply

编辑 `/etc/snmp/snmpd.conf` 文件并配置 trap 设置。

以下示例命令启用 Disman 事件 MIB (.1.3.6.1.2.1.88.2.0.1) 以每 15 秒监控一次 ifTable 中启动的网络接口或每 10 秒监控一次关闭的网络接口,并触发名为 `CumulusLinkUp` 和 `CumulusLinkDown` 的通知。

这些通知包括以下信息。

  • ifName
  • ifIndex
  • ifAdminStatus
  • ifOperStatus
cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
monitor CumulusLinkDOWN -S -r 10 -o ifName -o ifIndex -o ifAdminStatus -o ifOperStatus ifOperStatus == 2
monitor CumulusLinkUP -S -r 15 -o ifName -o ifIndex -o ifAdminStatus -o ifOperStatus ifOperStatus != 2

以下示例添加了 RFC 3418 中定义的 `linkUpTrap` 和 `linkDownTrap` trap

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
linkUpDownNotifications yes

notificationEvent  linkUpTrap    linkUp   ifIndex ifAdminStatus ifOperStatus
notificationEvent  linkDownTrap  linkDown ifIndex ifAdminStatus ifOperStatus
monitor  -r 15 -e linkUpTrap   "Generate linkUp" ifOperStatus != 2
monitor  -r 10 -e linkDownTrap "Generate linkDown" ifOperStatus == 2
...

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

有关更多信息或其他选项,请参阅 `snmpd.conf` 手册页。

配置可用内存通知

您可以监控可用内存,并将交换机配置为在可用内存降至特定大小以下时生成 trap。

以下示例在可用内存降至 1,000,000KB 以下时生成 trap。可用内存 trap 还包括总实际内存量

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
monitor MemFreeTotal -o memTotalReal memTotalFree <  1000000
...

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

NVUE 不提供用于配置可用内存通知的命令。

配置处理器负载通知

要在 CPU 平均负载超过特定阈值时生成 trap,请运行以下命令。您只能使用整数或浮点数。

以下示例在 1 分钟间隔达到 12%、5 分钟间隔达到 10% 或 15 分钟间隔达到 5% 时生成 trap。

cumulus@switch:~$ nv set system snmp-server trap-cpu-load-average one-minute 12 five-minute 10 fifteen-minute 5
cumulus@switch:~$ nv config apply

编辑 `/etc/snmp/snmpd.conf` 文件并配置 CPU 负载设置。要监控 1 分钟、5 分钟或 15 分钟间隔的 CPU 负载,请将 `load` 指令与 `monitor` 指令一起使用。

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
load 12 10 5
...

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

配置磁盘利用率通知

要监控所有磁盘的磁盘利用率,请将 `includeAllDisks` 指令与 `monitor` 指令一起使用。以下示例代码在磁盘已满 99% 时生成 trap

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
includeAllDisks 1%
monitor -r 60 -o dskPath -o DiskErrMsg "dskTable" diskErrorFlag !=0
...

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

NVUE 不提供用于配置磁盘利用率通知的命令。

配置身份验证通知

要为每次 SNMP 身份验证失败生成 SNMP trap 通知,请运行以下命令。

cumulus@switch:~$ nv set system snmp-server trap-snmp-auth-failures
cumulus@switch:~$ nv config apply

在 `/etc/snmp/snmpd.conf` 文件中,添加 `authtrapenable` 指令

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
authtrapenable 1
...

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

监控 UCD-SNMP-MIB 表

要配置事件 MIB 表以监控各种 UCD-SNMP-MIB 表中的问题(xxErrFlag 列对象)并发送 trap,请将 `defaultMonitors yes` 添加到 `snmpd.conf` 文件并提供配置。您必须首先下载 `snmp-mibs-downloader` Debian 软件包,并注释掉 `/etc/snmp/snmpd.conf` 文件中的 `mibs` 行(请参阅下方)。然后添加如下示例的配置

cumulus@switch:~$ sudo nano /etc/snmp/snmpd.conf
...
defaultMonitors yes

monitor   -o prNames -o prErrMessage "process table" prErrorFlag != 0
monitor   -o memErrorName -o memSwapErrorMsg "memory" memSwapError != 0
monitor   -o extNames -o extOutput "extTable" extResult != 0<br>monitor   -o dskPath -o dskErrorMsg "dskTable" dskErrorFlag != 0
monitor   -o laNames -o laErrMessage  "laTable" laErrorFlag != 0<br>monitor   -o fileName -o fileErrorMsg  "fileTable" fileErrorFlag != 0
...

重启 `snmpd` 服务以应用更改。

cumulus@switch:~$ sudo systemctl restart snmpd.service

启用 MIB 到 OID 转换

您可以使用 MIB 名称代替 OID,这大大提高了 `snmpd.conf` 文件的可读性。您可以通过安装 `snmp-mibs-downloader` 来启用此功能,该软件包会在启用 trap 之前将 SNMP MIB 下载到交换机。

  1. 在文本编辑器中打开 `/etc/apt/sources.list`,添加 `non-free` 存储库,然后保存文件

    cumulus@switch:~$ sudo nano /etc/apt/sources.list
    ...
    deb  http://deb.debian.org/debian bookworm main non-free
    ...
    
  2. 更新交换机

    cumulus@switch:~$ sudo -E apt-get update
    
  3. 安装 `snmp-mibs-downloader`

    cumulus@switch:~$ sudo -E apt-get install snmp-mibs-downloader
    
  4. 打开 `/etc/snmp/snmp.conf` 文件以验证 `mibs :` 行是否被注释掉

    #
    # As the snmp packages come without MIB files due to license reasons, loading
    # of MIBs is disabled by default. If you added the MIBs you can reenable
    # loading them by commenting out the following line.
    #mibs :
    
  5. 打开 `/etc/default/snmpd` 文件以验证 `export MIBS=` 行是否被注释掉

    # This file controls the activity of snmpd and snmptrapd
    
    # Don't load any MIBs by default.
    # You might comment this lines after you have the MIBs Downloaded.
    #export MIBS=
    
  6. 在您确认配置后,删除或注释掉 `/etc/apt/sources.list` 中的 `non-free` 存储库。

    #deb http://ftp.us.debian.org/debian/ buster main non-free
    

配置传入的 SNMP Trap

`/etc/snmp/snmpd.conf` 中的 Net-SNMP trap 守护进程*接收* SNMP trap。您在 `/etc/snmp/snmptrapd.conf` 文件中配置*传入* trap 的处理方式。对于 Net-SNMP 5.3 及更高版本,您必须指定谁被授权向通知接收器发送 trap 和 inform(以及允许触发的处理类型)。您可以指定三种处理类型

  • *log* 将通知的详细信息记录到指定文件中的标准输出(或 `stderr`),或通过 syslog(或类似方式)。
  • *execute* 将 trap 的详细信息传递到指定的处理程序程序,包括嵌入式 Perl。
  • *net* 将 trap 转发到另一个通知接收器。

通常,您配置所有三种类型 — *log、execute、net* — 以涵盖特定类别的通知的任何处理方式。您可以将某些通知源限制为仅进行某些处理。

`authCommunity TYPES COMMUNITY [SOURCE [OID | -v VIEW ]]` 授权使用您指定的团体字符串的 trap 和 SNMPv2c INFORM 请求,以触发您列出的处理类型。默认情况下,这允许使用此团体字符串的任何通知进行处理。您可以使用 SOURCE 字段指定配置仅适用于来自特定源的通知。有关文件中特定配置选项的更多信息,请参阅 snmptrapd.conf(5) 手册页 和 `man 5 snmptrapd.conf` 命令。

如果系统上尚未安装,请在配置传入 trap 之前安装 `snmptrapd` Debian 软件包

cumulus@switch:~$ sudo apt-get install snmptrapd