NET-SNMP的简单使用

SNMP概念

SNMP 简介

SNMP(Simple Network Management Protocol,简单网络管理协议)广泛用于网络设备的远程管理和操作。SNMP 允许管理员对网络上不同厂商、不同物理特性、采用不同互联技术的设备进行管理,包括状态监控、数据采集和故障处理。

SNMP 网络架构

SNMP 网络架构由三部分组成:NMS、Agent 和 MIB。

  • NMS(Network Management System,网络管理系统)是 SNMP 网络的管理者,能够提供友好的人机交互界面,方便网络管理员完成大多数的网络管理工作。
  • Agent 是 SNMP 网络的被管理者,负责接收、处理来自 NMS 的 SNMP 报文。在某些情况下,如接口状态发生改变时,Agent 也会主动向 NMS 发送告警信息。
  • MIB(Management Information Base,管理信息库)是被管理对象的集合。NMS 管理设备的时候,通常会关注设备的一些参数,比如接口状态、CPU 利用率等,这些参数就是被管理对象,在 MIB 中称为节点。每个 Agent 都有自己的 MIB。MIB 定义了节点之间的层次关系以及对象的一系列属性,比如对象的名称、访问权限和数据类型等。被管理设备都有自己的 MIB文件,在 NMS 上编译这些 MIB 文件,就能生成该设备的 MIB。NMS 根据访问权限对 MIB 节点进行读/写操作,从而实现对 Agent 的管理。

SNMP 基本操作

SNMP 提供四种基本服务:

  • Get:查询被管理节点的信息。

  • Set:配置被管理节点的信息。

  • 告警:SNMP 告警包括 Trap 和 Inform 两种。

    • Trap:Agent 使用该操作向 NMS 发送 Trap 报文。Agent 不要求 NMS 发送回应报文。NMS也不会对 Trap 报文进行回应。SNMPv1、SNMPv2c 和 SNMPv3 均支持 Trap 操作。
    • Inform:Agent 使用该操作向 NMS 发送 Inform 报文。Agent 要求 NMS 发送回应报文,因此,Inform报文比Trap报文更可靠,但消耗的系统资源更多。如果Agent在一定时间内没有收到 NMS 的回应报文,则会启动重发机制。只有 SNMPv2c 和 SNMPv3 支持 Inform 操作。

当前支持通过 Trap 上报集群告警信息至第三方网管平台,支持第三方网管平台通过 Get获取集群的告警信息。

SNMP 版本介绍

当前 SNMP 支持三个版本:SNMPv1、SNMPv2c 与 SNMPv3。

  • SNMPv1 采用团体名(Community Name)认证机制。团体名类似于密码,用来限制 NMS 和Agent 之间的通信。如果 NMS 配置的团体名和被管理设备上配置的团体名不同,则 NMS 和Agent 不能建立 SNMP 连接,从而导致 NMS 无法访问 Agent,Agent 发送的告警信息也会被NMS 丢弃。
  • SNMPv2c 也采用团体名认证机制。SNMPv2c 对 SNMPv1 的功能进行了扩展:提供了更多的操作类型;支持更多的数据类型;提供了更丰富的错误代码,能够更细致地区分错误。
  • SNMPv3 采用 USM(User-Based Security Model,基于用户的安全模型)认证机制。网络管理员可以配置认证和加密功能。认证用于验证报文发送方的合法性,避免非法用户的访问;加密则是对 NMS 和 Agent之间的传输报文进行加密,以免被窃听。采用认证和加密功能可以为 NMS 和 Agent 之间的通信提供更高的安全性。

net-snmp

net-snmp 软件套件,其中包括一个灵活的可扩展的简单网络管理协议(SNMP)代理。该代理及其关联的实用程序可以被用于从大量的系统中提供性能数据给一系列工具,这些工具都支持 SNMP 协议。

文章提供了关于配置 net-snmp 代理通过网络安全地提供性能数据,使用SNMP 协议检索数据和扩展 SNMP 代理以提供自定义的性能指标。

安装 net-snmp

net-snmp 软件套件包含一组软件包。表格 8-2 可用 net-snmp 软件包概述了每个包和它们的内容。

CentOS 7:

软件包 描述
net-snmp SNMP协议工具和库的集合。
net-snmp-agent-libs net-snmp 运行时代理库
net-snmp-libs net-snmp 运行时客户端库
net-snmp-utils 使用 SNMP 的网络管理实用程序,来自 net-snmp 项目
net-snmp-gui 用于 SNMP 的交互式图形 MIB 浏览器
net-snmp-devel net-snmp 项目的开发环境
net-snmp-perl perl net-snmp 模块和 mib2c 工具
net-snmp-python 用于 net-snmp 的 Python 'netsnmp' 模块

CentOS 8:

软件包 描述
net-snmp SNMP协议工具和库的集合。
net-snmp-agent-libs net-snmp 运行时代理库
net-snmp-libs net-snmp 运行时客户端库
net-snmp-gui 用于 SNMP 的交互式图形 MIB 浏览器
net-snmp-devel net-snmp 项目的开发环境
net-snmp-perl perl net-snmp 模块和 mib2c 工具
python3-net-snmp 用于 net-snmp 的 Python 'netsnmp' 模块
net-snmp-help net-snmp 的手册页和其他相关文档

安装以上软件包,以 root 身份执行如下命令

bash 复制代码
# yum install net-snmp net-snmp-agent-libs net-snmp-libs net-snmp-utils net-snmp-devel  net-snmp-perl net-snmp-python

检查安装情况

bash 复制代码
# rpm -qa|grep snmp

配置 Net-SNMP 应用程序

所有 Net-SNMP 应用程序都使用类似的配置文件结构。 影响每个应用程序的全局配置可以放在 snmp.conf 文件中,而应用程序特定的配置可以放在应用程序特定的文件中,例如 snmpd.confsnmptrapd.conf

上下文

默认情况下,配置文件令牌分为 2 个上下文:特定于应用程序的配置令牌和 Net-SNMP 范围的配置令牌。 如果有一个 Net-SNMP 范围的配置令牌,您想将其应用于特定应用程序,可以使用 [] s 包围的适当上下文继续它,并将其放在应用程序特定文件中。 例如:

bash 复制代码
 # /ect/snmp/snmptrapd.conf:
 [snmp] mibs +MY-SPECIAL-TRAPS-MIB
引用文件

要求Net-SNMP 5.6

注意:本页讨论的功能需要 Net-SNMP 版本 5.6 或更高版本。

可以在 .conf 文件中包含其他文件。 如:

复制代码
 # $HOME/.snmp/snmp.conf:
 include another.conf
主机特定配置文件

要求Net-SNMP 5.6

注意:本页讨论的功能需要 Net-SNMP 版本 5.6 或更高版本。

也可以使用特定于主机的配置文件来设置仅适用于某些主机的特定变量。 例如,如果有一个 $HOME/.snmp/hosts/host1.example.com.conf 文件,其中包含:

复制代码
 16bitIDs true

然后,当运行 snmpget 或任何其他应用程序时,它将避免使用 32 位 messageID(某些设备中存在的 SNMP 缺陷)。

当与 include 语句结合使用时,这尤其强大:

复制代码
 # $HOME/.snmp/snmp.conf:
 defVersion 3
 defSecurityLevel authPriv
 # ...
 # $HOME/.snmp/hosts/router.conf:
 include insecure.conf
 # $HOME/.snmp/insecure.conf:
 # this file overrides the default access settings in the snmp.conf file for our lame servers that don't support SNMPv3
 defVersion 1
 defCommunity public
主机特定的传输说明符

如果您希望以特定方式与"host1"对话,您还可以在 host1.conf 文件中添加"transport"令牌:

复制代码
 # $HOME/.snmp/hosts/host1.conf
 transport tls:host1.example.com:10161

例如,它可以让您运行"snmpwalk host1 system"并让它自动使用"tls:host1.example.com:10161"完整的传输规范来建立连接。

运行 net-snmp 守护进程

net-snmp 软件包中包含 SNMP 代理守护进程 snmpd。本节提供有关如何启动,停止和重新启动 snmpd 服务的信息。

启动服务

运行 snmpd 服务,以 root 身份执行如下命令:

bash 复制代码
# systemctl start snmpd.service

配置服务使其在系统启动后自动开始运行,执行使用如下命令:

bash 复制代码
# systemctl enable snmpd.service

查看服务运行状态:

bash 复制代码
 # systemctl status snmpd.service
停止服务

停止 snmpd 服务,以 root 身份执行如下命令:

bash 复制代码
# systemctl stop snmpd.service

配置服务使其在系统启动后并不开始运行,以 root 身份执行如下命令:

bash 复制代码
# systemctl disable snmpd.service

查看服务运行状态:

bash 复制代码
 # systemctl status snmpd.service
重启服务

重启 snmpd 服务,以 root 身份执行如下命令:

bash 复制代码
# systemctl restart snmpd.service

该命令停止服务并快速重启服务

查看服务运行状态:

bash 复制代码
 # systemctl status snmpd.service
重载服务

要仅重新加载配置,而无需停止服务,运行以下命令:

bash 复制代码
# systemctl reload snmpd.service

这会运行 snmp 服务去重新加载配置。

bash 复制代码
# systemctl status snmpd.service

日志管理与调试

当 SNMP 服务无法启动或配置未生效时,请通过以下方式查看日志信息。

查看服务状态与日志
bash 复制代码
# 查看服务详细状态(包含最近的错误信息)
systemctl status snmpd.service

# 实时追踪日志输出
journalctl -u snmpd.service -f
启用详细调试日志

若需排查复杂的通信问题,可修改服务启动参数以增加日志级别。

编辑 /etc/sysconfig/snmpd (或 /etc/default/snmpd,视系统而定),修改 OPTIONS

bash 复制代码
# 增加 -f -Le 参数,将日志输出到 stderr 并记录到系统日志
OPTIONS="-Le -p /var/run/snmpd.pid -x tcp:127.0.0.1:705"

重启服务后,详细的 SNMP 报文交互信息将记录在 /var/log/messagesjournalctl 中。

SNMP端口

作为 IP 协议套件的一部分,SNMP 消息被封装为用户数据报协议 (UDP),并在 Internet 协议(IP)中封装和传输。

默认的 SNMP 端口是:

  • UDP 端口 161。
  • UDP 端口 162(用于陷阱)。

SNMP NMS在通信期间使用默认端口的方式:

  • 从任何可用的源端口发送请求(GET、GETNEXT、GETBULK、SET)
  • 向代理中的UDP端口 161 发送请求(GET、GETNEXT、GETBULK、SET)。
  • 在发送请求的同一源端口上接收响应(RESPONSE) 。
  • 在 UDP 端口162上接收通知(TRAPS 和 INFORM)。

SNMP 代理在通信期间使用默认端口的方式:

  • 在 UDP 端口 161 上接收请求(GET、GETNEXT、GETBULK、SET)。
  • 将响应发送回NMS的源端口 (RESPONSE)。
  • 从任何可用端口生成通知(TRAPS 和 INFORM)。
  • 将通知发送到 NMS 的 UDP 端口 162(TRAPS 和 INFORM)。

请注意,当与TLS或DTLS一起使用时,端口10161接收请求并将陷阱发送到端口 10162。

修改端口

查看SNMP正在使用的端口

bash 复制代码
# netstat -nlp|grep snmp
tcp        0      0 127.0.0.1:199           0.0.0.0:*               LISTEN      304748/snmpd        
udp        0      0 0.0.0.0:161             0.0.0.0:*                           304748/snmpd 

编辑/etc/snmp/snmpd.conf 配置文件,如果要在tcp、udp、tcp6、udp6端口161进行监听,可使用agentaddress指令:

bash 复制代码
# vim /etc/snmp/snmpd.conf
agentaddress tcp:161
agentaddress udp:161
agentaddress tcp6:161
agentaddress udp6:161

bash 复制代码
# vim /etc/snmp/snmpd.conf
agentaddress tcp:161,udp:161,tcp6:161,udp6:161

更改配置文件后,重新加载配置

bash 复制代码
# systemctl reload snmpd.service

查看修改后使用的端口:

bash 复制代码
# netstat -nlp|grep snmp
tcp        0      0 0.0.0.0:161             0.0.0.0:*               LISTEN      2227525/snmpd       
tcp        0      0 127.0.0.1:199           0.0.0.0:*               LISTEN      2227525/snmpd       
tcp6       0      0 :::161                  :::*                    LISTEN      2227525/snmpd       
udp        0      0 0.0.0.0:161             0.0.0.0:*                           2227525/snmpd       
udp6       0      0 :::161                  :::*                                2227525/snmpd       

配置防火墙

在修改了 SNMP 端口或启动服务后,必须确保系统防火墙允许相关流量通过。

放行默认 SNMP 服务
bash 复制代码
# 开启 UDP 161 端口 (SNMP 查询)
firewall-cmd --permanent --add-port=161/udp

# 开启 UDP 162 端口 (Trap 接收)
firewall-cmd --permanent --add-port=162/udp

# 重新加载防火墙配置
firewall-cmd --reload
验证防火墙规则
bash 复制代码
# 查看当前开放的端口
firewall-cmd --list-ports

配置 net-snmp

要修改net-snmp的配置,编辑/etc/snmp/snmpd.conf 配置文件。默认的 snmpd.conf 文件被大量注释,并可以作为一个很好的代理配置文件的起点。

本节主要介绍两种常见的任务:

设置系统信息并配置认证。有关可用的配置指令的详细信息,请参阅 snmpd.conf(5)手册页。此外,在 net-snmp 软件包里有一个名为 snmpd.conf 的实用程序,可以用来以交互方式生成代理配置。

需要注意的是 net-snmp-util或net-snmp 软件包(取决于操作系统版本 )必须被安装才能使用本节所述的snmpwalk 实用程序。

配置基本访问权限 (snmpd.conf)

/etc/snmp/snmpd.conf 是主配置文件。最基本的配置通常包含以下三类指令:

  • 定义团体名 (v1/v2c):

    • rocommunity <字符串> <IP/网段>:定义只读权限。
    • rwcommunity <字符串> <IP/网段>:定义读写权限(慎用)。
    • 示例: rocommunity mypass 192.168.1.0/24
  • 定义访问控制 (v3 或增强 v2c):

    • rouser <用户名>:授予用户只读权限。
    • rwuser <用户名>:授予用户读写权限。
  • 定义系统信息 (可选):

    • syslocation <位置>:设置物理位置。
    • syscontact <联系人>:设置管理员联系方式。

    注意:修改配置文件后,务必执行 systemctl reload snmpd 使配置生效。

系统信息

net-snmp通过系统树提供了一些基本的系统信息。例如,下面的 snmpwalk的命令显示具有默认代理配置系统树。

bash 复制代码
# snmpwalk -v 2c -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux stor107 4.19.90-17.ky10.aarch64 #1 SMP Sun Jun 28 14:27:40 CST 2020 aarch64
SNMPv2-MIB::sysObjectID.0 = OID: net-snmp-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8213866) 22:48:58.66
SNMPv2-MIB::sysContact.0 = STRING: Root <root@localhost> (configure /etc/snmp/snmp.local.conf)
SNMPv2-MIB::sysName.0 = STRING: stor107
SNMPv2-MIB::sysLocation.0 = STRING: Unknown (edit /etc/snmp/snmpd.conf)
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORID.1 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.6 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.7 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.8 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.3 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (1) 0:00:00.01

缺省情况下,sysName 对象被设置为主机名。sysLocation 和 sysContact 对象可以在/etc/snmp/snmpd.conf 文件通过改变 syslocation 和 syscontact 的值被配置。

查看/etc/snmp/snmpd.conf并找到 System contact information部分,查看当前内容

bash 复制代码
# vim /etc/snmp/snmpd.conf 
...
###############################################################################
# System contact information
#

# It is also possible to set the sysContact and sysLocation system
# variables through the snmpd.conf file:

syslocation Unknown (edit /etc/snmp/snmpd.conf)
syscontact Root <root@localhost> (configure /etc/snmp/snmp.local.conf)

# Example output of snmpwalk:
#   % snmpwalk -v 1 localhost -c public system
#   system.sysDescr.0 = "SunOS name sun4c"
#   system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.sunos4
#   system.sysUpTime.0 = Timeticks: (595637548) 68 days, 22:32:55
#   system.sysContact.0 = "Me <me@somewhere.org>"
#   system.sysName.0 = "name"
#   system.sysLocation.0 = "Right here, right now."
#   system.sysServices.0 = 72


###############################################################################
...

修改为以下内容

bash 复制代码
...
###############################################################################
# System contact information
#

# It is also possible to set the sysContact and sysLocation system
# variables through the snmpd.conf file:

syslocation WuHan,HuBei
syscontact Caohf <caohf@toyou.com.cn>

# Example output of snmpwalk:
#   % snmpwalk -v 1 localhost -c public system
#   system.sysDescr.0 = "SunOS name sun4c"
#   system.sysObjectID.0 = OID: enterprises.ucdavis.ucdSnmpAgent.sunos4
#   system.sysUpTime.0 = Timeticks: (595637548) 68 days, 22:32:55
#   system.sysContact.0 = "Me <me@somewhere.org>"
#   system.sysName.0 = "name"
#   system.sysLocation.0 = "Right here, right now."
#   system.sysServices.0 = 72


###############################################################################
...

更改配置文件后,重新加载配置,并通过再次运行 snmpwalk 命令测试一下配置是否生效。

bash 复制代码
# systemctl reload snmpd.servic
# snmpwalk -v 2c -c public localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux stor107 4.19.90-17.ky10.aarch64 #1 SMP Sun Jun 28 14:27:40 CST 2020 aarch64
SNMPv2-MIB::sysObjectID.0 = OID: net-snmp-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8436785) 23:26:07.85
SNMPv2-MIB::sysContact.0 = STRING: Caohf <caohf@toyou.com.cn>
SNMPv2-MIB::sysName.0 = STRING: stor107
SNMPv2-MIB::sysLocation.0 = STRING: WuHan,HuBei
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORID.1 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.6 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.7 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.8 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.3 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (1) 0:00:00.01

配置权限

net-snmp 支持所有版本的 SNMP 协议,共3个版本。SNMP v1和SNMP v2c通过使用字符串提供简单的身份验证。该字符串是代理和任何客户端实用程序之间共享的密钥。该字符串在网络上用明文传递,被认为是不安全的。SNMP v3支持使用多种协议的用户认证和信息加密。net-snmp 代理还支持 SSH 通道,使用 X.509 证书的 TLS 认证和 Kerberos 认证。

默认情况下,已启用的SNMP版本为:v1、v2c、v3。版本 v1 和 v2c 不安全。

配置 SNMP v1
启用SNMP v1
  1. 查看 snmpd.conf的当前设置:

    bash 复制代码
    # cat /etc/snmp/snmpd.conf
      com2sec notConfigUser  default       public
      group   notConfigGroup v1           notConfigUser
      group   notConfigGroup v2c           notConfigUser
      view    systemview    included   .1.3.6.1.2.1.1
      view    systemview    included   .1.3.6.1.2.1.25.1.1
      access  notConfigGroup ""      any       noauth    exact  systemview none none
      ...
  2. 要仅启用 SNMP v1,请仅注释掉"group notConfigGroup v2c notConfigUser"行。此时SNMP v1 可用。

    bash 复制代码
    # vi /etc/snmp/snmpd.conf
      com2sec notConfigUser  default       public
      group   notConfigGroup v1           notConfigUser
      #group   notConfigGroup v2c           notConfigUser
      view    systemview    included   .1.3.6.1.2.1.1
      view    systemview    included   .1.3.6.1.2.1.25.1.1
      access  notConfigGroup ""      any       noauth    exact  systemview none none
禁用SNMP v1
  1. 查看 snmpd.conf的当前设置:

    bash 复制代码
    # cat /etc/snmp/snmpd.conf
       com2sec notConfigUser  default       public
       group   notConfigGroup v1           notConfigUser
       group   notConfigGroup v2c           notConfigUser
       view    systemview    included   .1.3.6.1.2.1.1
       view    systemview    included   .1.3.6.1.2.1.25.1.1
       access  notConfigGroup ""      any       noauth    exact  systemview none none
       ...
  2. 要仅禁用 SNMP v1,请仅注释掉"group notConfigGroup v1 notConfigUser"行。此时SNMP v2c 仍然可用。

    bash 复制代码
    # vi /etc/snmp/snmpd.conf
      com2sec notConfigUser  default       public
      #group   notConfigGroup v1           notConfigUser
      group   notConfigGroup v2c           notConfigUser
      view    systemview    included   .1.3.6.1.2.1.1
      view    systemview    included   .1.3.6.1.2.1.25.1.1
      access  notConfigGroup ""      any       noauth    exact  systemview none none
  3. 一旦完成snmpd.conf 的编辑,需要重新加载服务

    bash 复制代码
    # systemctl reload snmpd.service

要同时禁用 SNMP v1 和 v2c,必须在 snmpd.conf 文件中的 com2secaccess行上添加注释,例如:

bash 复制代码
# vim /etc/snmp/snmpd.conf
#com2sec notConfigUser  default       public
group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser
view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25.1.1
#access  notConfigGroup ""      any       noauth    exact  systemview none none
配置 SNMP v2c
启用SNMP v2c
  1. 查看 snmpd.conf的当前设置:

    bash 复制代码
    # cat /etc/snmp/snmpd.conf
      com2sec notConfigUser  default       public
      group   notConfigGroup v1           notConfigUser
      group   notConfigGroup v2c           notConfigUser
      view    systemview    included   .1.3.6.1.2.1.1
      view    systemview    included   .1.3.6.1.2.1.25.1.1
      access  notConfigGroup ""      any       noauth    exact  systemview none none
      ...
  2. 要仅启用 SNMP v2c,请仅注释掉"group notConfigGroup v1 notConfigUser"行。此时SNMP v1 可用。

    bash 复制代码
    # vi /etc/snmp/snmpd.conf
      com2sec notConfigUser  default       public
      #group   notConfigGroup v1           notConfigUser
      group   notConfigGroup v2c           notConfigUser
      view    systemview    included   .1.3.6.1.2.1.1
      view    systemview    included   .1.3.6.1.2.1.25.1.1
      access  notConfigGroup ""      any       noauth    exact  systemview none none
禁用SNMP v2c
  1. 查看 snmpd.conf的当前设置:

    bash 复制代码
    # cat /etc/snmp/snmpd.conf
       com2sec notConfigUser  default       public
       group   notConfigGroup v1           notConfigUser
       group   notConfigGroup v2c           notConfigUser
       view    systemview    included   .1.3.6.1.2.1.1
       view    systemview    included   .1.3.6.1.2.1.25.1.1
       access  notConfigGroup ""      any       noauth    exact  systemview none none
       ...
  2. 要仅禁用 SNMP v2c,请仅注释掉"group notConfigGroup v2c notConfigUser"行。此时SNMP v1 仍然可用。

    bash 复制代码
    # vi /etc/snmp/snmpd.conf
      com2sec notConfigUser  default       public
      group   notConfigGroup v1           notConfigUser
      #group   notConfigGroup v2c           notConfigUser
      view    systemview    included   .1.3.6.1.2.1.1
      view    systemview    included   .1.3.6.1.2.1.25.1.1
      access  notConfigGroup ""      any       noauth    exact  systemview none none
  3. 一旦完成snmpd.conf 的编辑,需要重新加载服务

    bash 复制代码
    # systemctl reload snmpd.service

要同时禁用 SNMP v1 和 v2c,必须在 snmpd.conf 文件中的 com2secaccess行上添加注释,例如:

bash 复制代码
# vim /etc/snmp/snmpd.conf
#com2sec notConfigUser  default       public
group   notConfigGroup v1           notConfigUser
group   notConfigGroup v2c           notConfigUser
view    systemview    included   .1.3.6.1.2.1.1
view    systemview    included   .1.3.6.1.2.1.25.1.1
#access  notConfigGroup ""      any       noauth    exact  systemview none none

要配置 SNMP v2c 的团体,在/etc/snmp/snmpd.conf 配置文件下使用rocommunityrwcommunity指令。指令的格式是如下:

bash 复制代码
directive community [source [OID]]

其中,community 要使用团体字符串,source 是 IP 地址或子网, OID 对SNMP 树提供访问属性。例如,下面的指令对客户端提供只读的系统树访问,该客户端使用本地计算机上的团体字符串"CentOS"。

bash 复制代码
rocommunity CentOS 127.0.0.1 .1.3.6.1.2.1.1

使用snmpwalk命令并添加-v 和-c 参数可以测试配置。

bash 复制代码
# snmpwalk -v2c -c CentOS localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux stor107 4.19.90-17.ky10.aarch64 #1 SMP Sun Jun 28 14:27:40 CST 2020 aarch64
SNMPv2-MIB::sysObjectID.0 = OID: net-snmp-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (8828337) 1 day, 0:31:23.37
SNMPv2-MIB::sysContact.0 = STRING: Caohf <caohf@toyou.com.cn>
SNMPv2-MIB::sysName.0 = STRING: stor107
SNMPv2-MIB::sysLocation.0 = STRING: WuHan,HuBei
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORID.1 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.6 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.7 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.8 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.3 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.10 = No more variables left in this MIB View (It is past the end of the MIB tree)
配置 SNMP v3

SNMP v3 允许选择鉴权 (auth) 或加密 (priv) 的任意组合。 如果只想进行鉴权,请选择auth。 如果只想要加密,请选择 priv。 如果想要没有加密的鉴权,请选择 authNoPriv。 如果两者都需要,请选择 authPriv

使用任何需要鉴权的机制时,查询必须包含用户名以及密码和哈希算法。

当使用任何需要加密的机制时,查询必须包含共享密钥和加密算法。

创建USM用户

要配置 SNMP v3,可使用 net-snmp-config --create-snmpv3-user 命令。命令net-snmp-configcreate-snmpv3-user选项的含义,更多信息请看net-snmp-config --help

此命令添加条目到/var/lib/net-snmp/snmpd.conf /etc/snmp/snmpd.conf 文件,这两个文件可以创建用户并授权访问。

注意,net-snmp-config --create-snmpv3-user 命令只有代理没有运行时才能运行。

bash 复制代码
# systemctl stop snmpd.service
# net-snmp-create-v3-user --help

Usage:
  net-snmp-create-v3-user [-ro] [-A authpass] [-X privpass]
                          [-a MD5|SHA|SHA-512|SHA-384|SHA-256|SHA-224] [-x DES|AES] [username] 

下面的示例创建读写用户admin,密码centossnmp

bash 复制代码
# net-snmp-create-v3-user  -A centossnmp -X centossnmp admin
adding the following line to /var/lib/net-snmp/snmpd.conf:
   createUser admin MD5 "centossnmp" DES "centossnmp"
adding the following line to /etc/snmp/snmpd.conf:
   rwuser admin

net-snmp-create-v3-user 命令添加rwuser指令(或当提供的-ro 命令行选项使用 rouser)到/etc/snmp/snmpd.conf 中和添加 rwcommunityrocommunity 的格式相同:

bash 复制代码
directive user [noauth|auth|priv] [OID]

其中,user 是用户名,OID 是 SNMP 树提供访问。默认情况下,net-snmp仅允许已通过授权的请求(auth 选项)。noauth 选项可以允许未经授权的请求,priv 选项强制使用加密,authpriv 选项指定的请求必须通过授权和回复被加密。

例如,下面一行表示授予用户 "admin"读写访问整个树:

bash 复制代码
rwuser admin authpriv .1

为了测试配置,在用户目录下创建一个 snmp 目录,在该目录下创建snmp.conf 文件(~ /.snmp/snmp.conf),使用如下命令:

复制代码
defVersion 3
defSecurityLevel authPriv
defSecurityName admin
defPassphrase centossnmp

snmpwalk 命令在查询代理时会使用这些授权设置。

bash 复制代码
# snmpwalk -v3 localhost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux stor107 4.19.90-17.ky10.aarch64 #1 SMP Sun Jun 28 14:27:40 CST 2020 aarch64
SNMPv2-MIB::sysObjectID.0 = OID: net-snmp-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (652) 0:00:06.52
SNMPv2-MIB::sysContact.0 = STRING: Caohf <caohf@toyou.com.cn>
SNMPv2-MIB::sysName.0 = STRING: stor107
SNMPv2-MIB::sysLocation.0 = STRING: WuHan,HuBei
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORID.1 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.3 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB
SNMPv2-MIB::sysORID.5 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup
SNMPv2-MIB::sysORID.6 = OID: TCP-MIB::tcpMIB
SNMPv2-MIB::sysORID.7 = OID: IP-MIB::ip
SNMPv2-MIB::sysORID.8 = OID: UDP-MIB::udpMIB
SNMPv2-MIB::sysORID.9 = OID: SNMP-NOTIFICATION-MIB::snmpNotifyFullCompliance
SNMPv2-MIB::sysORID.10 = OID: NOTIFICATION-LOG-MIB::notificationLogMIB
SNMPv2-MIB::sysORDescr.1 = STRING: The SNMP Management Architecture MIB.
SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching.
SNMPv2-MIB::sysORDescr.3 = STRING: The management information definitions for the SNMP User-based Security Model.
SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities
SNMPv2-MIB::sysORDescr.5 = STRING: View-based Access Control Model for SNMP.
SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing TCP implementations
SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing IP and ICMP implementations
SNMPv2-MIB::sysORDescr.8 = STRING: The MIB module for managing UDP implementations
SNMPv2-MIB::sysORDescr.9 = STRING: The MIB modules for managing SNMP Notification, plus filtering.
SNMPv2-MIB::sysORDescr.10 = STRING: The MIB module for logging SNMP Notifications.
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (1) 0:00:00.01
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (1) 0:00:00.01

检索数据性能

net-snmp 代理在 SNMP 协议上提供了多种性能信息。此外,可以通过代理查询系统中安装 RPM 包的列表,系统当前运行的进程列表和系统的网络配置。

本节提供了关于 OIDs 在 SNMP 上的性能概述。假定系统已安装 net-snmp-utils 软件包,并且用户被授予访问 SNMP 树。

硬件配置

net-snmp中 的 Host Resources MIB 提供了主机客户端程序的硬件和软件配置。可用的OIDs中总结了在 MIB 下可以获取的不同的 OID 。

可用的 OIDs

OID 描述
HOST-RESOURCES-MIB::hrSystem 包含一般系统信息,如运行时间,用 户的数目,和运行的进程的数目。
HOST-RESOURCES-MIB::hrStorage 包含内存和文件系统使用情况数据。
HOST-RESOURCES-MIB::hrDevices 包含所有的处理器,网络设备和文件 系统的列表。
HOST-RESOURCES-MIB::hrSWRun 包含所有正在运行的进程的列表。
HOST-RESOURCES-MIB:: hrSWRunPerf 包含进程表中的内存和 CPU 统计信 息 , 进 程 表 来 自 于 HOST- RESOURCES-MIB::hrSWRun。
HOST-RESOURCES- MIB::hrSWInstalled 包含 RPM 数据库的列表。

在 Host Resources MIB 中,还有一些可用于检索的可用信息的 SNMP 表。

Host Resources MIB 中 SNMP 表

表名 描述
HOST-RESOURCES-MIB::hrStorageTable 主机上逻辑存储区域的表。存储表中应为每个已分配并具有固定资源限制的逻辑存储区域放置一个条目。实体中表示的存储量是实际数量可由请求实体使用,并排除因格式化或文件系统参考信息造成的损失。这些条目与逻辑存储区域相关联,如应用程序所见,而不是操作系统通常所见的物理存储实体。例如没有文件系统的磁带和软盘通常不会由操作系统以块的形式分配给请求的应用程序,因此不应出现在此表中。此表的有效存储示例包括磁盘分区、文件系统、内存 (对于某些体系结构,这进一步细分为常规内存、扩展内存等)、虚拟内存的后备存储("交换空间")。此表旨在对"内存不足"和"缓冲区不足"类型故障的有用诊断。此外,它还是一个有用的性能监控工具,用于跟踪内存、磁盘或缓冲区的使用情况。
HOST-RESOURCES-MIB::hrDeviceTable 主机包含的设备表。
HOST-RESOURCES-MIB::hrProcessorTable 主机包含的处理器表。请注意,此表可能是稀疏的:仅当 hrDeviceType 对象的对应值为 `hrDeviceProcessor' 时,才存在条目。
HOST-RESOURCES-MIB::hrNetworkTable 主机包含的网络设备表。 请注意,此表可能是稀疏的:仅当 hrDeviceType 对象的对应值为 `hrDeviceNetwork' 时才存在条目。
HOST-RESOURCES-MIB::hrPrinterTable 主机本地的打印机表。 请注意,此表可能是稀疏的:仅当 hrDeviceType 对象的对应值为 `hrDevicePrinter' 时才存在条目。
HOST-RESOURCES-MIB::hrDiskStorageTable 主机包含的长期存储设备表。 特别是,这里不包括通过网络远程访问的磁盘设备。 请注意,此表可能是稀疏的:仅当 hrDeviceType 对象的对应值为 `hrDeviceDiskStorage' 时才存在条目。
HOST-RESOURCES-MIB::hrPartitionTable 主机包含的长期存储设备的分区表。 特别是,这里不包括通过网络远程访问的分区。"
HOST-RESOURCES-MIB::hrFSTabl 此主机本地或从文件服务器远程挂载的文件系统表。 在多用户系统上仅位于一个用户环境中的文件系统将不包含在此表中。
HOST-RESOURCES-MIB::hrSWRunTable 主机上运行的软件表。
HOST-RESOURCES-MIB::hrSWRunPerfTable 运行软件性能指标表。
HOST-RESOURCES-MIB::hrSWInstalledTable 此主机上安装的软件表。

下面的例子列出了 HOST-RESOURCES-MIB::hrFSTable:

bash 复制代码
# snmptable -Cb localhost HOST-RESOURCES-MIB::hrFSTable
SNMP table: HOST-RESOURCES-MIB::hrFSTable

 Index                  MountPoint RemoteMountPoint                            Type    Access Bootable StorageIndex LastFullBackupDate LastPartialBackupDate
     5                  "/dev/shm"               "" HOST-RESOURCES-TYPES::hrFSOther readWrite    false           35      0-1-1,0:0:0.0         0-1-1,0:0:0.0
     7                      "/run"               "" HOST-RESOURCES-TYPES::hrFSOther readWrite    false           37      0-1-1,0:0:0.0         0-1-1,0:0:0.0
     8            "/sys/fs/cgroup"               "" HOST-RESOURCES-TYPES::hrFSOther  readOnly    false           38      0-1-1,0:0:0.0         0-1-1,0:0:0.0
    25                         "/"               "" HOST-RESOURCES-TYPES::hrFSOther readWrite     true           55      0-1-1,0:0:0.0         0-1-1,0:0:0.0
    30                      "/tmp"               "" HOST-RESOURCES-TYPES::hrFSOther readWrite    false           60      0-1-1,0:0:0.0         0-1-1,0:0:0.0
    31                     "/boot"               "" HOST-RESOURCES-TYPES::hrFSOther readWrite    false           61      0-1-1,0:0:0.0         0-1-1,0:0:0.0
    32                 "/boot/efi"               "" HOST-RESOURCES-TYPES::hrFSFAT32 readWrite    false           62      0-1-1,0:0:0.0         0-1-1,0:0:0.0

关于 HOST-RESOURCES-MIB 的更多信息,可以查看/usr/share/snmp/mibs/HOST-RESOURCES-MIB. txt 文件。

CPU 和内存信息

UCD-SNMP-MIB 的大多数系统性能数据是可用的。systemStats OID 提供了一些处理器的使用计数器:

bash 复制代码
# snmpwalk  localhost UCD-SNMP-MIB::systemStats
UCD-SNMP-MIB::ssIndex.0 = INTEGER: 1
UCD-SNMP-MIB::ssErrorName.0 = STRING: systemStats
UCD-SNMP-MIB::ssCpuRawUser.0 = Counter32: 4918335
UCD-SNMP-MIB::ssCpuRawNice.0 = Counter32: 2103
UCD-SNMP-MIB::ssCpuRawSystem.0 = Counter32: 3811972
UCD-SNMP-MIB::ssCpuRawIdle.0 = Counter32: 604915267
UCD-SNMP-MIB::ssCpuRawWait.0 = Counter32: 48629285
UCD-SNMP-MIB::ssCpuRawKernel.0 = Counter32: 0
UCD-SNMP-MIB::ssCpuRawInterrupt.0 = Counter32: 299557
UCD-SNMP-MIB::ssIORawSent.0 = Counter32: 1797910538
UCD-SNMP-MIB::ssIORawReceived.0 = Counter32: 890440836
UCD-SNMP-MIB::ssRawInterrupts.0 = Counter32: 2709107353
UCD-SNMP-MIB::ssRawContexts.0 = Counter32: 1682255846
UCD-SNMP-MIB::ssCpuRawSoftIRQ.0 = Counter32: 1705614
UCD-SNMP-MIB::ssRawSwapIn.0 = Counter32: 0
UCD-SNMP-MIB::ssRawSwapOut.0 = Counter32: 0
UCD-SNMP-MIB::ssCpuRawSteal.0 = Counter32: 0
UCD-SNMP-MIB::ssCpuRawGuest.0 = Counter32: 0
UCD-SNMP-MIB::ssCpuRawGuestNice.0 = Counter32: 0
UCD-SNMP-MIB::ssCpuNumCpus.0 = INTEGER: 64

特别是, ssCpuRawUser, ssCpuRawSystem, ssCpuRawWait 和 ssCpuRawIdleOIDs 提供的计数器在确定系统是否要花费了大量的处理器时间在内核空间或用户空间或 I/O 时非常有用。ssRawSwapIn 和 ssRawSwapOut 可确定系统内存是否耗尽时非常有用。

UCD-SNMP-MIB::memory OID 下很多可用的内存信息和 free 命令类似:

bash 复制代码
# snmpwalk   localhost UCD-SNMP-MIB::memory
UCD-SNMP-MIB::memIndex.0 = INTEGER: 0
UCD-SNMP-MIB::memErrorName.0 = STRING: swap
UCD-SNMP-MIB::memTotalSwap.0 = INTEGER: 0 kB
UCD-SNMP-MIB::memAvailSwap.0 = INTEGER: 0 kB
UCD-SNMP-MIB::memTotalReal.0 = INTEGER: 131364544 kB
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 65210624 kB
UCD-SNMP-MIB::memTotalFree.0 = INTEGER: 65210624 kB
UCD-SNMP-MIB::memMinimumSwap.0 = INTEGER: 16000 kB
UCD-SNMP-MIB::memShared.0 = INTEGER: 414016 kB
UCD-SNMP-MIB::memBuffer.0 = INTEGER: 15552 kB
UCD-SNMP-MIB::memCached.0 = INTEGER: 2315200 kB
UCD-SNMP-MIB::memTotalSwapX.0 = Counter64: 0 kB
UCD-SNMP-MIB::memAvailSwapX.0 = Counter64: 0 kB
UCD-SNMP-MIB::memTotalRealX.0 = Counter64: 131364544 kB
UCD-SNMP-MIB::memAvailRealX.0 = Counter64: 65210624 kB
UCD-SNMP-MIB::memTotalFreeX.0 = Counter64: 65210624 kB
UCD-SNMP-MIB::memMinimumSwapX.0 = Counter64: 16000 kB
UCD-SNMP-MIB::memSharedX.0 = Counter64: 414016 kB
UCD-SNMP-MIB::memBufferX.0 = Counter64: 15552 kB
UCD-SNMP-MIB::memCachedX.0 = Counter64: 2315200 kB
UCD-SNMP-MIB::memSwapError.0 = INTEGER: error(1)
UCD-SNMP-MIB::memSwapErrorMsg.0 = STRING: Running out of swap space (0)

UCD-SNMP-MIB 的负载是可用的。SNMP 的 UCD-SNMP-MIB::laTable会列出1分钟,5分钟和15分钟的负载值。

bash 复制代码
# snmptable  localhost UCD-SNMP-MIB::laTable
SNMP table: UCD-SNMP-MIB::laTable

 laIndex laNames laLoad laConfig laLoadInt laLoadFloat laErrorFlag laErrMessage
       1  Load-1   9.07    12.00       907    9.070000     noError             
       2  Load-5   8.32    12.00       832    8.320000     noError             
       3 Load-15   8.33    12.00       833    8.330000     noError  
文件系统和磁盘信息

Host Resources MIB 提供文件系统的大小和使用信息。每个文件系统(以及各内存池)在 HOST-RESOURCES-MIB::hrStorageTable 表中有一个入口:

bash 复制代码
# snmptable -Cb localhost HOST-RESOURCES-MIB::hrStorageTable
SNMP table: HOST-RESOURCES-MIB::hrStorageTable

 Index                                         Type                     Descr AllocationUnits      Size     Used AllocationFailures
     1           HOST-RESOURCES-TYPES::hrStorageRam           Physical memory      1024 Bytes 131364544 66048512                  ?
     3 HOST-RESOURCES-TYPES::hrStorageVirtualMemory            Virtual memory      1024 Bytes 131364544 66048512                  ?
     6         HOST-RESOURCES-TYPES::hrStorageOther            Memory buffers      1024 Bytes 131364544    15552                  ?
     7         HOST-RESOURCES-TYPES::hrStorageOther             Cached memory      1024 Bytes   2323648  2323648                  ?
     8         HOST-RESOURCES-TYPES::hrStorageOther             Shared memory      1024 Bytes    414016   414016                  ?
    10 HOST-RESOURCES-TYPES::hrStorageVirtualMemory                Swap space      1024 Bytes         0        0                  ?
    35     HOST-RESOURCES-TYPES::hrStorageFixedDisk                  /dev/shm     65536 Bytes   1026285       66                  ?
    37     HOST-RESOURCES-TYPES::hrStorageFixedDisk                      /run     65536 Bytes   1026285     6227                  ?
    38     HOST-RESOURCES-TYPES::hrStorageFixedDisk            /sys/fs/cgroup     65536 Bytes   1026285        0                  ?
    55     HOST-RESOURCES-TYPES::hrStorageFixedDisk                         /      4096 Bytes  57529912  1603380                  ?
    60     HOST-RESOURCES-TYPES::hrStorageFixedDisk                      /tmp     65536 Bytes   1026285        4                  ?
    61     HOST-RESOURCES-TYPES::hrStorageFixedDisk                     /boot      4096 Bytes    521728    51438                  ?
    62     HOST-RESOURCES-TYPES::hrStorageFixedDisk                 /boot/efi      4096 Bytes    523262     1462                  ?

HOST-RESOURCES-MIB::hrStorageSize HOST-RESOURCES-MIB::hrStorageUsed 中的 OID被用来计算挂载文件系统的剩余容量。

I/O 数据在 UCD-SNMP-MIB::systemStatsUCD-DISKIO-MIB::diskIOTable表中都是可用的。后者提供了更详细的数据,后者的 OID 有 diskIONReadX 和diskIO NWrittenX 其提供计数器,用于在系统启动时记录读取和写入块设备的字节数。

bash 复制代码
# snmptable -Cb localhost UCD-DISKIO-MIB::diskIOTable
SNMP table: UCD-DISKIO-MIB::diskIOTable

 Index Device      NRead   NWritten   Reads   Writes LA1 LA5 LA15       NReadX    NWrittenX    BusyTime
     1    sdq 1086478336 4247118848   13722  1037477   0   0    0   1086478336  90146464768   323060000
     2   sdq1   20325376      66560     148        3   0   0    0     20325376        66560      160000
     3   sdq2   40395264   27029504     224       37   0   0    0     40395264     27029504      410000
     4   sdq3 1018868224 4220022784   13280   815457   0   0    0   1018868224  90119368704   323100000
     5    sds 4273803264 1733914624  712789 40474537   3   3    2  30043607040 195007442944  2632540000
     6    sdo 1472897024 1719623680 2359365  5985200  29  29   26 465329364992 847828180992 21696250000
     7    sdp 3285458944 3897376768 2131149  6154977  29  31   27 411307352064 871480770560 21670510000
     8    sdr 4117831680 1057394688 1793740  5762191  24  25   22 352010182656 812806213632 17925120000
     9    sdl 2343489536 1813094400 1865004  5555442  25  24   21 371710676992 779202174976 17154070000
    10    sdg  256700416 2597670912 1947865  4933670  22  23   21 399688658944 685497470976 16509620000
    11    sdb 3808747520 1191063552 2437880  5777926  30  28   25 480550117376 812939882496 21089440000
    12    sdh  778141696  554696704 2127114  5925350  29  30   26 413095002112 838073319424 20978830000
    13    sdm 1403248640 1284616192 2243845  6500382  33  32   28 426605010944 924702584832 23059170000
    14    sdn 3831590912 1015619584 2301892  6366079  33  33   29 441918255104 911548686336 23148440000
    15    sda 1132085248 2601336832 1883007  4999906  23  23   20 391974109184 698386038784 15749090000
    16    sdf 3848347648  716865536 2545272  5973046  33  32   28 506359521280 851120390144 22492780000
    17    sdk 2262904832 3663511552 2004641  5777214  25  25   23 393104928768 806822395904 18315420000
    18    sdj 2437722112  595890176 2216008  5878135  26  26   24 440524386304 829524578304 19551980000
    19    sdd 3883859968 2940162048 2179952  6161227  32  29   25 424790654976 870523555840 20807250000
    20    sde  735387648 2180526080 2288673  5141761  42  39   34 498951593984 964253200384 29988920000
    21    sdc 1974296576 2281840640 1867601  5428042  25  25   22 371341484032 758196084736 17652860000
    22    sdi  936636416 3450769408 2139468  6260263  28  27   24 417548464128 883919065088 20043390000
网络信息

Interfaces MIB 提供网络设备信息。IF-MIB::ifTable 提供了一个 SNMP 表,系统上每个接口及其配置和各种数据包计数器在这个表里都一个条目。

下面的例子显示 ifTabel 的部分列,它显示了系统上的两个物理网络接口:

bash 复制代码
# snmptable -Cb localhost IF-MIB::ifTable
SNMP table: IF-MIB::ifTable

 Index     Descr             Type   Mtu      Speed       PhysAddress AdminStatus OperStatus   LastChange   InOctets InUcastPkts InNUcastPkts InDiscards InErrors InUnknownProtos  OutOctets OutUcastPkts OutNUcastPkts OutDiscards OutErrors OutQLen                Specific
     1        lo softwareLoopback 65536   10000000                            up         up 0:0:00:00.00 4191763052    20736203            0          0        0               0 4191763052     20736203             0           0         0       0 SNMPv2-SMI::zeroDotZero
     2   enp12s0   ethernetCsmacd  1500 1000000000    0:9:6:2b:e7:4d          up         up 0:0:00:00.00   51604678      544467           37         13        0               0    3273255        24204             0           0         0       0 SNMPv2-SMI::zeroDotZero
     3   enp16s0   ethernetCsmacd  1500          0    0:9:6:2b:e7:4e          up       down 0:0:00:00.00          0           0            0          0        0               0          0            0             0           0         0       0 SNMPv2-SMI::zeroDotZero
     4  enp3s0f0   ethernetCsmacd  1500 4294967295 32:f7:98:bb:b0:61          up         up 0:0:00:00.00 3459464552  3303675484            0     184735        0               0 2939044419   2263403781             0           0         0       0 SNMPv2-SMI::zeroDotZero
     5  enp3s0f1   ethernetCsmacd  1500 4294967295  6c:b3:11:7:42:da          up         up 0:0:00:00.00 2600832910  2820935907            0     489141        0               0  519846805   1152324931             0           0         0       0 SNMPv2-SMI::zeroDotZero
     6 enp18s0f0   ethernetCsmacd  1500 4294967295 a6:78:ba:b7:36:6d          up         up 0:0:00:00.00   28741387      119235            0          0        0               0    6537698       108157             0           0         0       0 SNMPv2-SMI::zeroDotZero
     7 enp18s0f1   ethernetCsmacd  1500 4294967295  6c:b3:11:7:7f:ce          up         up 0:0:00:00.00   27602533      106486            0          0        0               0    6012630        98520             0           0         0       0 SNMPv2-SMI::zeroDotZero
     8     bond2   ethernetCsmacd  1500 4294967295 a6:78:ba:b7:36:6d          up         up 0:0:00:00.00   56343920      225721            0         12        0               0   12550328       206677             0           0         0       0 SNMPv2-SMI::zeroDotZero
     9     bond1   ethernetCsmacd  1500 4294967295 32:f7:98:bb:b0:61          up         up 0:0:00:00.00 1765329968  1829644092            0     673888        0               0 3458876018   3415728701             0           0         0       0 SNMPv2-SMI::zeroDotZero

网络流量是根据 IF-MIB::ifOutOctets IF-MIB::ifInOctets 提供。下面SNMP 查询将检索此系统上的每一个接口的网络流量。

bash 复制代码
# snmpwalk localhost IF-MIB::ifDescr
IF-MIB::ifDescr.1 = STRING: lo
IF-MIB::ifDescr.2 = STRING: enp12s0
IF-MIB::ifDescr.3 = STRING: enp16s0
IF-MIB::ifDescr.4 = STRING: enp3s0f0
IF-MIB::ifDescr.5 = STRING: enp3s0f1
IF-MIB::ifDescr.6 = STRING: enp18s0f0
IF-MIB::ifDescr.7 = STRING: enp18s0f1
IF-MIB::ifDescr.8 = STRING: bond2
IF-MIB::ifDescr.9 = STRING: bond1

扩展的 net-snmp

net-snmp 代理可以扩展到提供除原生系统度量的应用度量。这使得容量规划和性能问题的故障排除。例如,在测试中知道邮件系统每 15 分钟有 5 分钟处

在负载均衡状态是有帮助的,但更有用的是知道邮件系统在每秒处理 8000 个消息时它 15 分钟负载均衡是多少。当应用程序负载的度量可通过相同的接口作为

系统的度量,这也允许在不同的负载影响的情况下对系统性能可视化(例如,每增加 10,000 条信息会增加平均负载线至 100,000)。

一些应用程序通过 SNMP 扩展 net-snmp 代理以提供应用度量。有几种方法来扩展代理定制应用程序。本节介绍通过 shell 脚本和可选的 Perl 插件来扩展代理。假设系统中 net-snmp-utils 和net-snmp-perl 包已经安装,同时用户被授权访问 SNMP 树。

使用 shell 脚本扩展 net-snmp

net-snmp 代理提供了一个扩展 MIB(net-snmp-EXTEND-MIB),可以用来查询任意的shell脚 本 。 要指定的shell脚本来运行 ,可以在
/etc/snmp/snmpd.conf 文件使用 extend指令。一旦定义,代理将提供退出码和在SNMP上命令的任何输出。下面的例子演示了这种机制,该脚本确定在进程表中 httpd 进程的数量。

注意:

net-snmp 代理提供了一个内建的机制通过 proc 命令检查进程表。更多的信息可以查看 snmpd.conf (5)统系页。

下面shell脚本的退出码是在给定时间点的系统上运行的 httpd 进程数。

bash 复制代码
#!/bin/bash
NUMPIDS=`pgrep httpd | wc -l`
exit $NUMPIDS

为了使这个脚本在 SNMP 上可用,将脚本复制到系统路径上的某个位置,设置可执行位,并添加extend 指令到/etc/snmp/snmpd.conf 文件。添加 extend 指令的格式如下:

bash 复制代码
extend name prog args

name 是标识 extend 的字符串,prog 是要运行的程序,args 是传入程序的参数。例如,如果上面的 shell 脚本复制到/usr/local/bin/check_apache.sh,下面的指令会添加脚本到 SNMP 树。

bash 复制代码
extend httpd_pids /bin/bash /usr/local/bin/check_apache.sh

脚本可以在 net-snmp-EXTEND-MIB::nsExtendObjects 中查询到。

bash 复制代码
# snmpwalk localhost net-snmp-EXTEND-MIB::nsExtendObjects
net-snmp-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 1
net-snmp-EXTEND-MIB::nsExtendCommand."httpd_pids" = STRING: /bin/sh
net-snmp-EXTEND-MIB::nsExtendArgs."httpd_pids" = STRING: /usr/local/bin/check_apache.sh
net-snmp-EXTEND-MIB::nsExtendInput."httpd_pids" = STRING: 
net-snmp-EXTEND-MIB::nsExtendCacheTime."httpd_pids" = INTEGER: 5
net-snmp-EXTEND-MIB::nsExtendExecType."httpd_pids" = INTEGER: exec(1)
net-snmp-EXTEND-MIB::nsExtendRunType."httpd_pids" = INTEGER: run-on-read(1)
net-snmp-EXTEND-MIB::nsExtendStorage."httpd_pids" = INTEGER: permanent(4)
net-snmp-EXTEND-MIB::nsExtendStatus."httpd_pids" = INTEGER: active(1)
net-snmp-EXTEND-MIB::nsExtendOutput1Line."httpd_pids" = STRING: 
net-snmp-EXTEND-MIB::nsExtendOutputFull."httpd_pids" = STRING: 
net-snmp-EXTEND-MIB::nsExtendOutNumLines."httpd_pids" = INTEGER: 1
net-snmp-EXTEND-MIB::nsExtendResult."httpd_pids" = INTEGER: 55
net-snmp-EXTEND-MIB::nsExtendOutLine."httpd_pids".1 = STRING: 

请注意,退出码设置为整型(示例中退出码为 8),其它任何输出为字符串类型。为了显示整数的多重度量,extend 指令提供了不同的参数。例如,下面的脚本可以被用于确定匹配任意字符串的进程数,并且也将输出一个文本字符串来表示进程数:

bash 复制代码
#!/bin/bash
PATTERN=$1
NUMPIDS=`pgrep $PATTERN | wc -l`
echo "There are $NUMPIDS $PATTERN processes."
exit $NUMPIDS

当上面的脚本被拷贝到 /usr/local/bin/check_proc.sh 下 , 执行下面/etc/snmp/snmpd.conf 文件中的指令会显示出 nginx 和 snmpd 的进程数。

bash 复制代码
extend httpd_pids /bin/sh /usr/local/bin/check_proc.sh nginx
extend snmpd_pids /bin/sh /usr/local/bin/check_proc.sh snmpd

下面的例子显示 snmpwalk 命令对 nsExtend Objects OID 的输出:

bash 复制代码
# snmpwalk localhost net-snmp-EXTEND-MIB::nsExtendObjects
net-snmp-EXTEND-MIB::nsExtendNumEntries.0 = INTEGER: 2
net-snmp-EXTEND-MIB::nsExtendCommand."nginx_pids" = STRING: /bin/bash
net-snmp-EXTEND-MIB::nsExtendCommand."snmpd_pids" = STRING: /bin/bash
net-snmp-EXTEND-MIB::nsExtendArgs."nginx_pids" = STRING: /usr/local/bin/check_proc.sh nginx
net-snmp-EXTEND-MIB::nsExtendArgs."snmpd_pids" = STRING: /usr/local/bin/check_proc.sh snmpd
net-snmp-EXTEND-MIB::nsExtendInput."nginx_pids" = STRING: 
net-snmp-EXTEND-MIB::nsExtendInput."snmpd_pids" = STRING: 
net-snmp-EXTEND-MIB::nsExtendCacheTime."nginx_pids" = INTEGER: 5
net-snmp-EXTEND-MIB::nsExtendCacheTime."snmpd_pids" = INTEGER: 5
net-snmp-EXTEND-MIB::nsExtendExecType."nginx_pids" = INTEGER: exec(1)
net-snmp-EXTEND-MIB::nsExtendExecType."snmpd_pids" = INTEGER: exec(1)
net-snmp-EXTEND-MIB::nsExtendRunType."nginx_pids" = INTEGER: run-on-read(1)
net-snmp-EXTEND-MIB::nsExtendRunType."snmpd_pids" = INTEGER: run-on-read(1)
net-snmp-EXTEND-MIB::nsExtendStorage."nginx_pids" = INTEGER: permanent(4)
net-snmp-EXTEND-MIB::nsExtendStorage."snmpd_pids" = INTEGER: permanent(4)
net-snmp-EXTEND-MIB::nsExtendStatus."nginx_pids" = INTEGER: active(1)
net-snmp-EXTEND-MIB::nsExtendStatus."snmpd_pids" = INTEGER: active(1)
net-snmp-EXTEND-MIB::nsExtendOutput1Line."nginx_pids" = STRING: There are 65 nginx processes.
net-snmp-EXTEND-MIB::nsExtendOutput1Line."snmpd_pids" = STRING: There are 1 snmpd processes.
net-snmp-EXTEND-MIB::nsExtendOutputFull."nginx_pids" = STRING: There are 65 nginx processes.
net-snmp-EXTEND-MIB::nsExtendOutputFull."snmpd_pids" = STRING: There are 1 snmpd processes.
net-snmp-EXTEND-MIB::nsExtendOutNumLines."nginx_pids" = INTEGER: 1
net-snmp-EXTEND-MIB::nsExtendOutNumLines."snmpd_pids" = INTEGER: 1
net-snmp-EXTEND-MIB::nsExtendResult."nginx_pids" = INTEGER: 65
net-snmp-EXTEND-MIB::nsExtendResult."snmpd_pids" = INTEGER: 1
net-snmp-EXTEND-MIB::nsExtendOutLine."nginx_pids".1 = STRING: There are 65 nginx processes.
net-snmp-EXTEND-MIB::nsExtendOutLine."snmpd_pids".1 = STRING: There are 1 snmpd processes.

警告:

整数退出码被限制在 0-255 的范围。对于超过 256 的值,既可以使用脚本的标准输出(被认为是字符串)或扩展代理的不同方法。

bash 复制代码
# snmpget localhost \
    'net-snmp-EXTEND-MIB::nsExtendResult."nginx_pids"' \
    UCD-SNMP-MIB::memAvailReal.0
net-snmp-EXTEND-MIB::nsExtendResult."nginx_pids" = INTEGER: 65
UCD-SNMP-MIB::memAvailReal.0 = INTEGER: 113930560 kB
使用 Perl 扩展 net-snmp

使用 extend 指令执行shell脚本是一种通过SNMP公开自定义应用程序指标的相当有限的方法。 net-snmp 代理还提供了一个嵌入式Perl接口,用于公开自定义对象。 net-snmp-perl 软件包提供了 NetSNMP::agent Perl 模块,用于编写嵌入式 Perl 插件。

NetSNMP::agent Perl 模块提供了一个agent对象,用于处理对代理 OID 树的一部分的请求。 agent对象的构造函数具有将代理作为 snmpd 的子代理或独立代理运行的选项。 创建嵌入式代理不需要任何参数:

perl 复制代码
use NetSNMP::agent (':all');
my $agent = new NetSNMP::agent();

agent对象有一个register方法,用于注册具有特定 OID 的回调函数。 register函数采用名称、OID 和指向回调函数的指针。 以下示例将使用 SNMP 代理注册一个名为 hello_handler 的回调函数,该代理将处理 OID .1.3.6.1.4.1.8072.9999.9999 下的请求:

perl 复制代码
$agent->register("hello_world", ".1.3.6.1.4.1.8072.9999.9999",
                 \&hello_handler);

OID .1.3.6.1.4.1.8072.9999.9999 (net-snmp-MIB::netSnmpPlaypen) 通常仅用于演示目的。 如果您的组织还没有根 OID,您可以通过联系 ISO 名称注册机构(美国的 ANSI)获得一个。

将使用四个参数调用处理函数,即 HANDLERREGISTRATION_INFOREQUEST_INFOREQUESTSREQUESTS 参数包含当前调用中的请求列表,应该迭代并填充数据。 列表中的request 对象具有允许操作 OID 和请求值的 get 和 set 方法。 例如,以下调用会将请求对象的值设置为字符串"hello world":

perl 复制代码
$request->setValue(ASN_OCTET_STR, "hello world");

处理函数应该响应两种类型的 SNMP 请求:GET 请求和 GETNEXT 请求。 通过调用作为第三个参数传递给处理函数的 request_info 对象的 getMode 方法来确定请求的类型。 如果请求是 GET 请求,调用者将期望处理程序根据请求的 OID 设置请求对象的值。 如果请求是 GETNEXT 请求,则调用者还将期望处理程序将请求的 OID 设置为树中的下一个可用 OID。 这在以下代码示例中进行了说明:

perl 复制代码
my $request;
my $string_value = "hello world";
my $integer_value = "8675309";

for($request = $requests; $request; $request = $request->next()) {
  my $oid = $request->getOID();
  if ($request_info->getMode() == MODE_GET) {
    if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
      $request->setValue(ASN_OCTET_STR, $string_value);
    }
    elsif ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.1")) {
      $request->setValue(ASN_INTEGER, $integer_value);
    }
  } elsif ($request_info->getMode() == MODE_GETNEXT) {
    if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
      $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.1");
      $request->setValue(ASN_INTEGER, $integer_value);
    }
    elsif ($oid < new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
      $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.0");
      $request->setValue(ASN_OCTET_STR, $string_value);
    }
  }
}

getMode 返回 MODE_GET 时,处理程序分析request对象上的 getOID 调用的值。 如果 OID 以".1.0"结尾,则请求的值设置为 string_value,如果 OID 以".1.1"结尾,则设置为 integer_value。 如果 getMode 返回 MODE_GETNEXT,则处理程序确定请求的 OID 是否为".1.0",然后将 OID 和值设置为".1.1"。 如果树上的请求高于".1.0",则设置".1.0"的 OID 和值。 这实际上返回了树中的"下一个"值,因此像 snmpwalk 这样的程序可以在不事先了解结构的情况下遍历树。

变量的类型使用来自 NetSNMP::ASN 的常量设置。 有关可用常量的完整列表,请参阅 NetSNMP::ASN 的 perldoc。

此示例 Perl 插件的完整代码清单如下:

perl 复制代码
#!/usr/bin/perl

use NetSNMP::agent (':all');
use NetSNMP::ASN qw(ASN_OCTET_STR ASN_INTEGER);

sub hello_handler {
  my ($handler, $registration_info, $request_info, $requests) = @_;
  my $request;
  my $string_value = "hello world";
  my $integer_value = "8675309";

  for($request = $requests; $request; $request = $request->next()) {
    my $oid = $request->getOID();
    if ($request_info->getMode() == MODE_GET) {
      if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
        $request->setValue(ASN_OCTET_STR, $string_value);
      }
      elsif ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.1")) {
        $request->setValue(ASN_INTEGER, $integer_value);
      }
    } elsif ($request_info->getMode() == MODE_GETNEXT) {
      if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
        $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.1");
        $request->setValue(ASN_INTEGER, $integer_value);
      }
      elsif ($oid < new NetSNMP::OID(".1.3.6.1.4.1.8072.9999.9999.1.0")) {
        $request->setOID(".1.3.6.1.4.1.8072.9999.9999.1.0");
        $request->setValue(ASN_OCTET_STR, $string_value);
      }
    }
  }
}

my $agent = new NetSNMP::agent();
$agent->register("hello_world", ".1.3.6.1.4.1.8072.9999.9999",
                 \&hello_handler);

要测试插件,请将上述程序复制到 /usr/share/snmp/hello_world.pl 并将以下行添加到 /etc/snmp/snmpd.conf 配置文件中:

bash 复制代码
perl do "/usr/share/snmp/hello_world.pl"

需要重启snmpd以加载新的 Perl 插件。 重启后,snmpwalk 应该返回新数据:

bash 复制代码
# snmpwalk localhost net-snmp-MIB::netSnmpPlaypen
net-snmp-MIB::netSnmpPlaypen.1.0 = STRING: "hello world"
net-snmp-MIB::netSnmpPlaypen.1.1 = INTEGER: 8675309

snmpget 也应该用于执行处理程序的其它模式:

bash 复制代码
# snmpget localhost \
    net-snmp-MIB::netSnmpPlaypen.1.0 \
    net-snmp-MIB::netSnmpPlaypen.1.1
net-snmp-MIB::netSnmpPlaypen.1.0 = STRING: "hello world"
net-snmp-MIB::netSnmpPlaypen.1.1 = INTEGER: 8675309

常见问题与故障排查

当无法通过 NMS 获取数据时,请按以下顺序检查:

  1. 服务状态检查
    • 确认 snmpd 服务已启动:systemctl status snmpd
    • 确认配置文件语法正确:修改 snmpd.conf 后需执行 systemctl reload snmpd
  2. 网络连通性与端口
    • 检查代理是否在监听 UDP 161 端口:netstat -anu | grep 161
    • 检查本地防火墙是否放行:firewall-cmd --list-ports
  3. SNMP 版本与团体名匹配
    • SNMPv1/v2c:确认 NMS 端配置的团体名(Community String)与服务器端 rocommunity/rwcommunity 配置完全一致(区分大小写)。
    • SNMPv3:确认用户名、认证协议(MD5/SHA)、认证密码、加密协议(DES/AES)及加密密码均配置正确。若使用 net-snmp-create-v3-user 脚本,请确保代理处于停止状态。
  4. 访问控制限制
    • 检查 snmpd.conf 中的 rocommunityrwuser指令是否限制了来源 IP。例如 rocommunity public 192.168.1.0/24 仅允许该网段访问。
  5. MIB 解析问题
    • 若命令行返回 OID 数字而非文字描述,检查 ~/.snmp/snmp.conf/etc/snmp/snmp.conf 中的 mibs : 配置是否正确,或尝试使用 -On 参数强制输出数字 OID 进行测试。
相关推荐
Bytenerd_02 个月前
【中级软件设计师】协议簇(附软考真题)
udp·tcp·snmp·smtp·中级软件设计师·软考真题·协议簇
仰科网关5 个月前
化工厂SCADA系统OPC DA数据转Modbus TCP接入全厂监控平台项目案例
网络·网络协议·modbus·snmp·opc da·协议转换
仰科网关5 个月前
实现华为UPS的SNMP转Modbus协议接入监控平台项目案例
网关·modbus·snmp·vfbox·协议转换
运维行者_5 个月前
不同规模企业如何选 OPM?参考局域网管理软件与 cpu 温度监控适配指南
大数据·运维·服务器·网络·数据库·postgresql·snmp
上海仰科5 个月前
SNMP设备数据 转 IEC104项目案例
网关·snmp·iec104·vfbox·协议转换
运维行者_5 个月前
PostgreSQL 十大性能问题及解决方案
运维·服务器·网络·数据库·postgresql·智能路由器·snmp
漫谈网络1 年前
VACM 详解:SNMPv3 的访问控制核心
python·snmp·pysnmp
漫谈网络1 年前
深入解析 SNMP Walk 的响应机制
python·snmp·oid·mib·pysnmp
狮子再回头1 年前
snmp/mib采用子代理模式,编码,部署
代理模式·snmp·mib·snmp子代理