如何使用 Net-SNMP 工具套件管理和监控服务器

介绍

作为系统管理员的一大部分是收集有关您的服务器和基础设施的准确信息. 有许多工具和选项用于收集和处理此类信息。

SNMP是简单的网络管理协议,它是服务器可以共享当前状态信息的一种方式,也是管理员可以修改预定义值的渠道,虽然协议本身非常简单,但实施SNMP的程序结构可能非常复杂。

在之前的指南中,我们讨论了 SNMP协议的基础知识如何在Ubuntu 14.04服务器上安装和配置SNMP组件

我们将讨论如何利用我们在最后的指南中设置的配置,以便实际收集信息并操纵远程主机。

使用SNMP客户端命令

我们使用的net-snmp工具套件包含一些用于查询或设置远程主机上的 OID 值的实用程序. 幸运的是,大多数工具都利用了一组共享语法,并具有相似的使用模式。

对于本指南的目的,我们假定您熟悉需要提供net-snmp命令的身份验证部分,我们将在下面的部分将所有身份验证信息称为authentication_info

如果您有 为您的客户端设置 snmp.conf 配置如下所述,您可以删除该命令的此部分,因为验证详细信息将从您的配置文件中读取。

如果你没有‘snmp.conf’文件,你需要在每个命令中代替authentication_info以连接到远程戴蒙所需的信息,对于我们在本系列中设置的‘演示’帐户,可以使用以下值:

1-u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password

在运行这些命令时,如果您处于不同的环境中,更换自己的值。

现在你知道你需要的身份验证细节,让我们熟悉一些可用的命令。

通过 SnmpGet 检索单个 OID 值

这是使用SNMP查询信息的最基本命令. 使用前面讨论的基本身份验证标志,可以使用snmpget命令读取用户访问的任何OID的值。

基本用途是指定已知的数字OID,例如,我们可以通过键入来获取系统描述:

1snmpget authentication_info host 1.3.6.1.2.1.1.1.0

由于我们在最后一个指南中安装了snmp-mibs-downloader包,所以我们也可以以其名称参考常见的OID,例如,我们可以通过键入以下信息获得相同的信息:

1snmpget authentication_info host sysDescr.0

通过 SnmpGetNext 获取下一个可用 OID 值

由于MIB数据库是一个可移动的层次结构,其值可以顺序检索。 通过利用此属性,我们可以从树上的任何对象中找出下一个对象的值(以及OID标签)。

例如,我们在上面看到如何获取系统描述. 要找出下一个OID及其值,我们可以调用相同的命令,但这次用snmpgetnext命令:

1snmpgetnext authentication_info host sysDescr.0
1SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10

这会返回系统ObjectID,这是树上的下一个序列对象,我们可以使用返回的OID反复重复,以获取每个序列对象:

1snmpgetnext authentication_info host sysObjectID.0
1DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (114216) 0:19:02.16

这些可以使用字符串OID或数字OID,就像以前一样。

使用 SnmpWalk 获取 MIB 层次结构的部分

要在指定的 OID 下获得所有 OID,您可以使用snmpwalk命令,这将返回指定的点下存在的整个树。

例如,我们可以通过键入树的系统部分中的所有值:

1snmpwalk authentication_info host system
1SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
2SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
3DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (126926) 0:21:09.26
4SNMPv2-MIB::sysContact.0 = STRING: [email protected]
5SNMPv2-MIB::sysName.0 = STRING: target
6SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay
7SNMPv2-MIB::sysServices.0 = INTEGER: 72
8. . .

此命令通过自动发出 SNMP getNext 请求到主机,直到它能够构建整个树在所要求的值以下。

如果您想从根本上获取整个MIB树,您可以发出根上的命令:

1snmpwalk authentication_info host .

这将返回提供给用户的整个树。

例如,您可能知道sysUpTime.0 OID 返回了 SNMP 主机在远程主机上运行的长度,但您可能对服务器本身在线多久感到好奇。

我们可以使用snmpwalk命令来获取整个OID等级,然后用抓取来搜索名称中有uptime的东西。

1snmpwalk authentication_info host . | grep -i uptime

你会收到一个看起来像这样的答案:

 1DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (113856) 0:18:58.56
 2SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00
 3SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00
 4SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00
 5SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00
 6SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00
 7SNMPv2-MIB::sysORUpTime.6 = Timeticks: (0) 0:00:00.00
 8SNMPv2-MIB::sysORUpTime.7 = Timeticks: (0) 0:00:00.00
 9SNMPv2-MIB::sysORUpTime.8 = Timeticks: (0) 0:00:00.00
10SNMPv2-MIB::sysORUpTime.9 = Timeticks: (0) 0:00:00.00
11SNMPv2-MIB::sysORUpTime.10 = Timeticks: (0) 0:00:00.00
12HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9741455) 1 day, 3:03:34.55
13NOTIFICATION-LOG-MIB::nlmLogVariableID."default".1.1 = OID: DISMAN-EVENT-MIB::sysUpTimeInstance
14NET-SNMP-AGENT-MIB::nsModuleName."".8.1.3.6.1.2.1.1.3.127 = STRING: mibII/sysUpTime

在尝试一些这些值后,我们可以发现,OID包含正确的运行时间值. 现在,任何时候,我们想要从该机器启动起来的时间,我们可以使用该OID:

1snmpget authentication_info host hrSystemUptime.0
1HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9795352) 1 day, 3:12:33.52

正如你所看到的,‘snmpwalk’可以非常有帮助发现值的正确OID。

用 SnmpTranslate 翻译数值和字符串 OID

该套件中最有用的命令之一实际上不会与远程主机进行通信,相反,它只是帮助我们发现有关MIB等级的信息。

使用snmptranslate实用程序,我们可以轻松地将数字结果转换为其文本表示:

1snmptranslate 1.3.6.1.2.1.1.1.0
1SNMPv2-MIB::sysDescr.0

这给出了定义文本名称的MIB模块,以及OID本身的名称。

当我们发现了系统的运行时间(‘hrSystemUptime.0’)的文本MIB时,我们可能对被定义的树上的位置感到好奇。

请记住包括每当您收到有关OID的信息时所提供的MIB模块:

1snmptranslate -On HOST-RESOURCES-MIB::hrSystemUptime.0
1.1.3.6.1.2.1.25.1.1.0

例如,使用-Td旗,你可以得到一个完整的描述,完整的路径在底部:

1snmptranslate -Tp 1.3.6.1.2.1.1.1.0
 1SNMPv2-MIB::sysDescr.0
 2sysDescr OBJECT-TYPE
 3  -- FROM	SNMPv2-MIB
 4  -- TEXTUAL CONVENTION DisplayString
 5  SYNTAX	OCTET STRING (0..255) 
 6  DISPLAY-HINT	"255a"
 7  MAX-ACCESS	read-only
 8  STATUS	current
 9  DESCRIPTION	"A textual description of the entity. This value should
10            include the full name and version identification of
11            the system's hardware type, software operating-system,
12            and networking software."
13::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) sysDescr(1) 0 }

您可以通过一个-O_参数来修改输出显示方式,其中_被输出格式取代,您可以在snmpcmd人页面的OUTPUT OPTIONS部分看到完整列表,但一些更常见的选择是:

Output FlagDescriptionExample
-OaDisplay in ASCII stringsSNMPv2-MIB::sysDescr.0
-OfDisplay full textual path to OID.iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0
-OnDisplay full numerical path to OID.1.3.6.1.2.1.1.1.0
-OsDisplay only the end textual OID representationsysDescr.0

请注意,上述格式化选项也可以与本套件中的大多数其他工具一起应用,以便以您想要的方式格式化输出。

使用 SnmpTable 获取格式化输出的表格数据

一些存储在SNMP的信息实际上是表格的,虽然snmpwalk具有显示所有相关数据的能力,但格式化对于某些用途并不理想。

例如,如果我们在udpTable OID 上使用snmpwalk:

1snmpwalk authentication_info host udpTable

我们会得到这个:

1UDP-MIB::udpLocalAddress.0.0.0.0.161 = IpAddress: 0.0.0.0
2UDP-MIB::udpLocalAddress.0.0.0.0.35679 = IpAddress: 0.0.0.0
3UDP-MIB::udpLocalPort.0.0.0.0.161 = INTEGER: 161
4UDP-MIB::udpLocalPort.0.0.0.0.35679 = INTEGER: 35679

但是,如果我们用snmptable提出相同的请求:

1snmptable authentication_info host udpTable

我们会得到一个漂亮的表格,如下:

1udpLocalAddress udpLocalPort
2         0.0.0.0 161
3         0.0.0.0 35679

这是更漂亮的格式化和更容易消耗的人类读者。

使用 SnmpSet 更改值

此命令用于写入 OID 的值,而其他命令迄今为止用于获取信息,但此命令用于修改主机上的数据。

虽然snmpset命令从其他命令中继承了大部分语法,但它需要一些额外的信息来设置值。

1snmpset authentication_info host OID_to_modify data_type new_value

上面的大部分字段都是自我解释的,但是数据类型需要更多解释,每个字符都代表一个单一的字符,以下是可能的类型列表:


由于我们下载了snmp-mibs-downloader包,大多数时候你可以通过键入=而不是其中一个类型标识符来摆脱。

为了演示这个命令,我们可以评论我们在代理计算机上的 snmpd.conf 文件中设置的值之一. 指定配置文件中的值基本上硬编码它,防止您使用正常的 SNMP 方法更改值。

在代理计算机上,打开 /etc/snmp/snmpd.conf 文件:

1sudo nano /etc/snmp/snmpd.conf

评论sysLocation指令:

1#sysLocation Sitting on the Dock of the Bay

保存并关闭文件. 现在重新启动服务:

1sudo service snmpd restart

现在,从我们的管理机器中,我们可以通过键入这个来将sysLocation OID 设置为Earth

1snmpset authentication_info host sysLocation.0 s "Earth"
1SNMPv2-MIB::sysLocation.0 = STRING: Earth

我们可以通过精简我们的位置来测试 = 类型指标是否会正确设置值类型:

1snmpset authentication_info host sysLocation.0 = "New York City"
1SNMPv2-MIB::sysLocation.0 = STRING: New York City

它正确地解释了我们的价值作为一个常规的字符串。

使用 SnmpBulkGet 和 SnmpBulkWalk 有效地发出请求

发出重复的snmpgetsnmpwalk请求可在重复使用时产生相当多的网络流量。

为了解决这个问题,创建了两个名为snmpbulkgetsnmpbulkwalk的伴侣命令,这些命令将所有返回值包装在一个交易中,而不是每个返回的OID值的交易。

要使用snmpbulkget,您将输入一个或多个OID或分支,并且您将获得合适的包中的额外OID的数值:

1snmpbulkget authentication_info host system
 1SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
 2SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
 3DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (429891) 1:11:38.91
 4SNMPv2-MIB::sysContact.0 = STRING: call now
 5SNMPv2-MIB::sysName.0 = STRING: target
 6SNMPv2-MIB::sysLocation.0 = STRING: New York City
 7SNMPv2-MIB::sysServices.0 = INTEGER: 72
 8SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
 9SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
10SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance

值得注意的是,‘snmpbulkget’就像一个‘snmpgetnext’命令一样运作,这意味着它将作为一个参数留下给出的对象。在上面的示例中,我们提供了一个分支,而不是提供一个特定的对象。

snmpbulkwalk命令以类似的方式运作,但将继续执行BulkGet命令,直到整个子树被检索。

结论

正如您所看到的,使用net-snmp套件,您可以以多种方式获取和操纵数据. 通过脚本这些操作或在应用中利用这些实用程序,您可以构建复杂的监控和管理环境。

Published At
Categories with 技术
comments powered by Disqus