zabbix系列:(四)SNMP监控方式简介与实战

admin 2022年07月12日 1,363次浏览

 --------------- 最后编辑时间:2022年7月19日 ---------------

1、SNMP协议概述

SNMP(简单网络管理协议)一般在对网络设备的监控中使用相对较多。简单网络管理包含两部分:管理进程和被管理设备,管理进程和被管理端得通信方式有以下三种:

  • 被管理端向管理端发送数据
  • 管理端向被管理端请求获取数据
  • 管理端向被管理端请求改变数据

基于 TCP/IP 的网络管理由以下三部分组成:

  • 管理信息库(MIB),包含所有代理进程的可被查询和修改的参数
  • 管理信息结构(SMI):关于 MIB 的一套公用结构和标识符号
  • 简单网络管理协议(SNMP):管理进程和代理进程之间的通信协议

2、SNMP协议的工作方式

SNMP工作在 OSI 模型的应用层(第七层),主要支持以下几种基本操作:

  • Get:NMS 使用该操作从 Agent 获取一个或多个参数值
  • GetNext:NMS 使用该操作从 Agent 获取一个或多个参数的下一个参数值
  • Set:NMS 使用该操设置 Agent 的一个或多个参数值
  • Response:Agent 返回一个或多个参数值,该操作是前面三种操作的响应
  • Trap:Agent 主动发出的操作,通知 NMS 有某些事情发生

其中 Trap 使用 UDP 协议的 162 号端口发送报文,其余操作使用 UDP 协议的 161 号端口发送报文,因此同一台设备,既可以做 Agent 也可以做 NMS

3、SNMP协议工作原理

3.1、SNMP V1 和 SNMP V2 实现机制

SNMP V1 和 SNMP V2 的实现机制基本相同,只是 SNMP V2 丰富了错误代码,以及新增了 GetBulk操作,因此,此处使用 SNMP V1 做介绍

3.1.1、Get 操作

NMS 从被管理设备 MIB 中获取 sysName 的值,community(团体名称,可以理解为密码) 为 public 进行 read 操作,流程如下:

  • NMS 给 Agent 发送 Get 请求,请求报文会对以下主要字段进行设置: version 字段的值为 1,community 字段的值为 public,PDU (协议数据单元,也就是 SNMP 报文)的 variable bindings 中的 Name1 字段的值为 sysName.0
  • Agent 给 NMS 发送 Get 响应,说明是否获取成功,如果获取成功,则返回 Response PDU 的 variable bindings 中 Value1 字段的值就是设备的名字;如果获取失败,则在 Error status 字段中填上出错的原因,在 Error index 字段上填上出错的位置信息

3.1.2、GetNext 操作

NMS 从被管理设备 MIB 中获取 sysName 的下一个节点 sysLocation 的值,community 为 public 进行 read 操作,流程如下:

  • NMS 给 Agent 发送 GetNext 请求,请求报文会对以下主要字段进行设置: version 字段的值为 1,community 字段的值为 public,PDU 的 variable bindings 中的 Name1 字段的值为 sysName.0
  • Agent 给 NMS 发送 GetNext 响应,说明是否获取成功,如果获取成功,则返回 Response PDU 的 variable bindings 中 Value1 字段的值为 sysName.0 的下一个节点 sysLocation.0 中 Value1 字段中的值;如果获取失败,则在 Error status 字段中填上出错的原因,在 Error index 字段上填上出错的位置信息

3.1.3、Set 操作

NMS 需要将被管理设备 MIB 节点中 sysName 的值修改为 newName,则使用 community 为 private 进行 write操作

  • NMS 给 Agent 发送 Set 请求,请求报文会对以下主要字段进行设置: version 字段的值为 1,community 字段的值为 private,PDU 的 variable bindings 中的 Name1 字段的值为 sysName.0,Value1 字段的值为 newName
  • Agent 给 NMS 发送 Set 响应,说明设置成功,如果设置成功,则 Response PDU 的 variable bindings 中 Value1 字段的值为 newName;如果设置失败,则在 Error status 字段中填上出错的原因,在 Error index 字段上填上出错的位置信息

3.1.4、Trap

当设备发生某些异常或者变化时,Agent 会主动发送 Trap 报文给 NMS

3.2、SNMP V3 实现机制

SNMP V3 的实现机制和 SNMP V1、SNMP V2c 基本相同,主要区别在于 SNMP V3 增加了认证、加密和解密的处理,这里以 SNMP V3 的 Get 操作进行介绍

  • NMS(网络管理系统) 首先发送不带任何认证和加密参数的 Get 请求,将 Flags 字段设置为 0x4,以获取 contextEngineID、contextame、AuthoritativeEngineID、AuthoritativeEngineBoots、AuthoritativeEngineTime等参数相关参数的值
  • agent 解析消息,发送 report 报文,并携带上述相关参数的值
  • NMS 再次给 agent 发送 Get 请求,请求报文的 version 字段的值被置为 3,将在上一步获取到的值填入到相应的字段中,PDU 的 variable bindings 中的 Name1 字段的值为 sysName.0,并根据配置的认证算法计算出 authenticationParameters,根据配置的加密算法计算出 privacyParameters,并使用配置的加密算法对 PDU 数据进行加密
  • agent 对消息进行认证,认证通过后对 PDU 报文进行解密,解密成功后,则获取sysName.0对象的值,并将 response PDU 的 variable bindings 中的 Value1 的值设置为设备的名字返回给 NMS;如果认证、解密或者获取失败,则在 Error status 字段中填上出错的原因,在 Error index 字段上填上出错的位置信息。最后对 PDU 进行加密,设置 contextEngineID、contextame、AuthoritativeEngineID、AuthoritativeEngineBoots、AuthoritativeEngineTime、authenticationParameters、privacyParameters、等参数,发送响应报文

4、SNMP MIB 简介

4.1、SNMP MIB 的含义

任何一个被管理的资源都可以表示为一个对象,MIB 时被管理对象的集合,它定义了被管理对象的一系列属性,包含:对象名称、对象的访问权限、对象的数据类型等。MIB 可以理解为 NMS 和 agent 之间的一个接口,通过这个接口,NMS 可以对 agent 中的每一个被管理对象进行读写操作,从而达到管理和监控设备的目的

4.2、SNMP 视图

MIB 视图是 MIB 的子集合,在配置 agent 时,用户可以将 community/用户名与 MIB 视图绑定,从而限制 NMS 能够访问的 MIB 对象。用户可以配置 MIB 视图内的对象为 excluded 或 included,excluded 表示当前视图不包括 MIB 子树的所有节点,included 表示当前视图包含该 MIB 子树的所有节点

5、配置 zabbix-server 的 SNMP 监控

在该部分中,以监控华为交换机作为配置示例

5.1、配置网络设备基本信息

<Huawei>system-view
# 配置管理IP
[Huawei]interface Vlanif 1
[Huawei-Vlanif1]ip address 192.168.56.100 24
[Huawei-Vlanif1]quit

# 配置SNMP版本和团体名称
[Huawei]snmp-agent sys-info version v2c
[Huawei]snmp-agent community read public

5.2、获取设备 OID 信息

有多种方法可以获取设备的 OID 号码,如设备官方资料、使用 MIB 软件(如snmpB、MIBbrowser)、snmpwalk 命令等

5.3、zabbix-server 配置示例

说明:添加 item 项可以在 Host 中添加,也可以在 Template 中完成

5.3.1、监控需求

监控华为交换机某个端口的 Up/Down 状态

5.3.2、配置示例

此处仅配置关键项,请根据实际需求配置其他选项

  • 添加被监控设备

  • 给被监控设备添加 item(监控项)

  • 启用 item 项

  • 监控效果

    说明:在 SNMP 监控中,ifOperStatus 的值:1表示 Up,2:表示 Down

  • 配置触发器

  • 配置好的触发器

  • 最终效果

5.4、修改 SNMP 的宏

在上面的配置中,“SNMP community” 的参数值我们填写的是 “{$SNMP_COMMUNITY}” ,该变量的默认值是 public,如果我们的值是非默认值,那么我们就需要对该值进行修改,我们可以将其值直接填到参数中,也可以通过修改宏的方式修改其默认值,其路径是:“Configuration —> Templates —> Template Module Generic SNMP —> Macros”

6、SNMPTraps 监控方式

6.1、SNMPTraps 概述

SNMPTraps 是 SNMP 的被管理端主动向 SNMP 管理端发送数据,管理端通过 UDP 162 端口接收数据,该功能一般用于故障推送、信息发送等场景

6.2、SNMPTraps 工作原理

在 zabbix server 服务器中,SNMPTraps 使用 snmptrapd 进程接收 SNMP 被管理端发送过来的数据,然后使用 snmptt 对接收到的数据进行处理,然后写入日志文件中,zabbix server 中的 SNMPTraps 处理进程把日志处理成符合 zabbix 数据要求的格式,最后再对数据进行阈值判断、告警等处理

6.3、SNMPTraps 安装与配置

6.3.1、安装 snmptrapd 软件包

[root@localhost ~]# yum install net-snmp-perl perl-Digest-SHA1 perl-Sys-Syslog perl-List-MoreUtils perl-IO-stringy net-snmp-utils perl perl-Module-Build perl-Time-HiRes -y

6.3.2、安装 snmptt 软件包

# 安装 EPEL 仓库
[root@localhost ~]# yum install epel-release

# 安装 snmptt
[root@localhost ~]# yum install snmptt -y

6.3.3、检查 snmptthandler 是否存在

[root@localhost ~]# ls /usr/share/snmptt/snmptthandler-embedded
/usr/share/snmptt/snmptthandler-embedded

6.3.4、修改 snmptrapd 配置文件

[root@localhost ~]# vi /etc/snmp/snmptrapd.conf
# 加入以下参数
authCommunity   log,execute,net public
perl do "/usr/share/snmptt/snmptthandler-embedded"

6.3.5、修改 snmptt.ini 配置文件

[root@localhost ~]# vi /etc/snmp/snmptt.ini
# 修改以下参数
mode = daemon
net_snmp_perl_enable = 1
translate_log_trap_oid = 2
mibs_environment = ALL
date_time_format = %H:%M:%S %Y/%m/%d
syslog_enable = 0
DEBUGGING = 1
DEBUGGING_FILE = /var/log/snmptt/snmptt.debug
DEBUGGING_FILE_HANDLER = /var/log/snmptt/snmptthandler.debug

6.3.6、修改 snmptt.conf 文件

此文件用于存储匹配 OID 的规则,此处我们在文件末尾添加一个 General 事件

[root@localhost ~]# vi /etc/snmp/snmptt.conf
EVENT general .* "general event" Normal
FORMAT ZBXTRAP $aA $ar $1

6.3.7、启动相关服务

# 修改 snmptrapd 启动参数
[root@localhost ~]# vi /etc/sysconfig/snmptrapd
OPTIONS="-m +ALL -Lsd -On -p /var/run/snmptrapd.pid"

# 启动 snmptrapd 服务
[root@localhost ~]# systemctl daemon-reload
[root@localhost ~]# systemctl start snmptrapd
[root@localhost ~]# systemctl enable snmptrapd

# 启动 snmptt 服务
[root@localhost ~]# systemctl start snmptt
[root@localhost ~]# systemctl enable snmptt

6.3.8、测试 snmptrap 服务

# 发送测试信息
[root@localhost ~]# snmptrap -v 2c -c public 127.0.0.1 '' .1.3.6.1.4.1.8072.999 .1.3.6.1.4.1.8072.999 s 'snmptrap test'

# 查看 snmptt 日志
[root@localhost ~]# tail /var/log/snmptt/snmptt.log 
13:19:49 2022-07-17 NET-SNMP-MIB::netSnmp.999 Normal "general event" 127.0.0.1 - ZBXTRAP 127.0.0.1 127.0.0.1 snmptrap test

6.3.9、修改 zabbix-server 配置文件

修改 zabbix-server 配置文件,读取 snmptt 日志文件

[root@localhost ~]# vi /etc/zabbix/zabbix_server.conf
# 启用 StartSNMPTrapper
StartSNMPTrapper=1

# 修改日志文件路径为实际日志路径
SNMPTrapperFile=/var/log/snmptt/snmptt.log

6.4、SNMPTrap 配置示例

  • 将下载来的华为交换机 MIB 文件转换成 SNMPTraps OID

    # 创建 mib 文件存放目录,并把 mib 文件导入到其中
    [root@localhost ~]# mkdir -p /temp/mib_temp/mibs/
    
    # 创建一个存放转换后 conf 文件存放的目录
    [root@localhost ~]# mkdir /temp/mib_temp/conf_files/mibs
    
    # 目录结构
    [root@localhost ~]# cd /temp/
    [root@localhost temp]# tree -d
    .
    └── mib_temp
        ├── conf_files
        │   └── mibs
        └── mibs
    
    # 将 mib 文件转换为 snmptt 配置文件
    [root@localhost ~]# cd /temp/mib_temp/
    [root@localhost mib_temp]# for i in `ls mibs/*.mib`;do snmpttconvertmib --in=$i --out=/temp/mib_temp/conf_files/$i.conf; done
    [root@localhost mib_temp]# cat conf_files/mibs/*.conf > snmptt.huawei_switch_temp.conf
    [root@localhost mib_temp]# sed -i 's/FORMAT/FORMAT ZBXTRAP $aA/g' snmptt.huawei_switch.conf
    [root@localhost mib_temp]# egrep -v 'converted|#' snmptt.huawei_switch_temp.conf >> snmptt.huawei_switch.conf
    
    # 将转换后的配置文件导入到 SNMPtt 配置文件中
    [root@localhost mib_temp]# cp snmptt.huawei_switch.conf /etc/snmp/
    
    # 将该配置文件添加到 snmptt.ini 文件中的 snmptt_conf_files 部分
    [root@localhost mib_temp]# vi /etc/snmp/snmptt.ini
    snmptt_conf_files = <<END
    ## 如果新配置文件中的功能和系统自带的配置文件功能有冲突,可以注释掉自带的配置文件
    # /etc/snmp/snmptt.conf
    /etc/snmp/snmptt.huawei_switch.conf
    END
    
    # 重启服务
    [root@localhost temp]# systemctl restart snmptt
    
  • 在交换机上配置 SNMPTrap

    # 启用 SNMPTrap 功能(二选一)
    ## 启用全局 SNMPTrap 功能
    [Huawei]snmp-agent trap enable 
    ## 开启交换机全局端口 down 告警
    [Huawei]snmp-agent trap enable feature-name ifnet trap-name linkdown
    
    # 配置告警发送端口
    [Huawei]snmp-agent trap source Vlanif 1
    
    # 配置告警接收主机
    snmp-agent target-host trap address udp-domain 192.168.137.10 params securityname public v2c
    
  • 配置 item

    本示例功能:监控交换机端口 down 状态

    关于 key 值:

    • snmptrap.fallback:获取所有未被任何 snmptrap[] item 获取的 SNMP traps
    • snmptrap[<regex>]:获取所有与 regex 匹配的 SNMP traps,如果未指定 regexp,则捕获所有 traps
  • 配置后的效果