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.conf 和 snmptrapd.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/messages 或 journalctl 中。
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
-
查看
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 ... -
要仅启用 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
-
查看
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 ... -
要仅禁用 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 -
一旦完成snmpd.conf 的编辑,需要重新加载服务
bash# systemctl reload snmpd.service
注
要同时禁用 SNMP v1 和 v2c,必须在
snmpd.conf文件中的com2sec和access行上添加注释,例如:
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
-
查看
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 ... -
要仅启用 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
-
查看
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 ... -
要仅禁用 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 -
一旦完成snmpd.conf 的编辑,需要重新加载服务
bash# systemctl reload snmpd.service
注
要同时禁用 SNMP v1 和 v2c,必须在
snmpd.conf文件中的com2sec和access行上添加注释,例如:
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 配置文件下使用rocommunity或 rwcommunity指令。指令的格式是如下:
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-config中create-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 中和添加 rwcommunity 和 rocommunity 的格式相同:
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::systemStats 和 UCD-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)获得一个。
将使用四个参数调用处理函数,即 HANDLER、REGISTRATION_INFO、REQUEST_INFO 和 REQUESTS。 REQUESTS 参数包含当前调用中的请求列表,应该迭代并填充数据。 列表中的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 获取数据时,请按以下顺序检查:
- 服务状态检查
- 确认 snmpd 服务已启动:
systemctl status snmpd - 确认配置文件语法正确:修改
snmpd.conf后需执行systemctl reload snmpd。
- 确认 snmpd 服务已启动:
- 网络连通性与端口
- 检查代理是否在监听 UDP 161 端口:
netstat -anu | grep 161 - 检查本地防火墙是否放行:
firewall-cmd --list-ports
- 检查代理是否在监听 UDP 161 端口:
- SNMP 版本与团体名匹配
- SNMPv1/v2c:确认 NMS 端配置的团体名(Community String)与服务器端
rocommunity/rwcommunity配置完全一致(区分大小写)。 - SNMPv3:确认用户名、认证协议(MD5/SHA)、认证密码、加密协议(DES/AES)及加密密码均配置正确。若使用
net-snmp-create-v3-user脚本,请确保代理处于停止状态。
- SNMPv1/v2c:确认 NMS 端配置的团体名(Community String)与服务器端
- 访问控制限制
- 检查
snmpd.conf中的rocommunity或rwuser指令是否限制了来源 IP。例如rocommunity public 192.168.1.0/24仅允许该网段访问。
- 检查
- MIB 解析问题
- 若命令行返回 OID 数字而非文字描述,检查
~/.snmp/snmp.conf或/etc/snmp/snmp.conf中的mibs :配置是否正确,或尝试使用-On参数强制输出数字 OID 进行测试。
- 若命令行返回 OID 数字而非文字描述,检查