配置 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 通知
您可以将交换机配置为在链路的运行状态更改时触发链路 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 下载到交换机。
在文本编辑器中打开 `/etc/apt/sources.list`,添加 `non-free` 存储库,然后保存文件
cumulus@switch:~$ sudo nano /etc/apt/sources.list ... deb http://deb.debian.org/debian bookworm main non-free ...
更新交换机
cumulus@switch:~$ sudo -E apt-get update
安装 `snmp-mibs-downloader`
cumulus@switch:~$ sudo -E apt-get install snmp-mibs-downloader
打开 `/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 :
打开 `/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=
在您确认配置后,删除或注释掉 `/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