提供:ZStack云计算
本教程为如何利用SNMP实现网络监控与管理系列三篇中的第三篇。
相当一部分系统管理员正在积极收集与服务器及基础设施相关的信息。可供选择的工具与方案多种多样,而其中相当一部分以SNMP技术为基础。
SNMP的全称为简单网络管理协议。虽然协议本身非常简单,但其应用结构却可能相当复杂。
在之前的教程中,我们已经探讨了SNMP协议基础知识以及如何在Ubuntu 14.04服务器上安装并配置SNMP组件。今天,我们将谈谈net-snmp中各工具的基本使用方法。
要完成本教程,大家需要根据安装与配置教程设置出两套主机。
net-snmp套件包含大量工具,可用于对远程主机上的OID值进行查询与设置。幸运的是,大部分工具使用一套标准语法集,且使用模式也比较类似。我们将在后文中介绍其中使用较为频繁的几种。
要完成本教程,大家还需要对net-snmp命令中的身份验证部分有所了解。
另外大家也可以参阅为客户端设置一套snmp.conf配置以跳过这部分验证内容,因为在设置完成后各验证细节都会直接读取自该配置文件。
如果大家还没有自己的snmp.conf文件,则需要将每条命令中的“authentication_info”替换为您的实际信息,从而接入远程守护程序。另外,我们使用以下值设置本教程中的demo账户:
-u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password
请注意根据实际环境对命令中的值进行修改。
这可能是最为基本的SNMP信息查询命令了。在这里,我们利用snmpget命令与之前提到的基本验证标记读取用户访问的任意OID值。
使用以下命令检索系统描述:
snmpget authentication_infohost 1.3.6.1.2.1.1.1.0
由于我们已经在上部分教程中于管理计算机内安装了snmp-mibs-downloader软件包,因此也可以利用名称引用常规OID。例如,我们使用以下命令可获得同样的信息:
snmpget authentication_infohost sysDescr.0
此命令用于在一条OID值被赋予后,获取下一条值。由于MIB数据库具备可推进结构,因此其值亦能够按顺序检索。使用此属性,我们可以找到树状结构内任意对象的下一对象值(以及OID标签)。
例如,我们之前已经了解了如何获取系统描述。要找出下一OID及其值,我们可以调用同一命令,但这一次使用snmpgetnext命令:
snmpgetnext authentication_infohost sysDescr.0
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
返回结果为该系统的ObjectID,即树状结构中的下一序列对象。我们可以重复这一过程以获取每个序列对象:
snmpgetnext authentication_infohost sysObjectID.0
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (114216) 0:19:02.16
与之前提到的一样,这些命令也可以使用字符串OID或者数字OID。
为了获取特定OID下的全部OID,大家可以使用snmpwalk命令。其会返回存在于特定点之下的完整结构树。
例如,我们可以获取system部分下的全部值:
snmpwalk authentication_infohost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (126926) 0:21:09.26
SNMPv2-MIB::sysContact.0 = STRING: [email protected]
SNMPv2-MIB::sysName.0 = STRING: target
SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay
SNMPv2-MIB::sysServices.0 = INTEGER: 72
. . .
此命令会自动对主机执行SNMPgetNext请求,直到其获取到全部所请求值。
如果大家希望检索整套MIB树状结构,则需要在root上执行该命令:
snmpwalk authentication_infohost .
其会返回向用户提供的完整树状结构。
我们还可以将其与grep配合以搜索特定OID名称。例如,我们可以使用sysUpTime.0 OID以返回SNMP守护程序在远程主机上的运行时长。另外,大家也可能希望了解服务器本身的在线时长。
我们可以使用snmpwalk命令获取OID的完整结构,而后利用grep过滤以查看名称中包含“uptime”的结果。这里我们使用-i标记关闭搜索中的大小写区分:
snmpwalk authentication_infohost . | grep -i uptime
响应结果如下:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (113856) 0:18:58.56
SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.6 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.7 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.8 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.9 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORUpTime.10 = Timeticks: (0) 0:00:00.00
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9741455) 1 day, 3:03:34.55
NOTIFICATION-LOG-MIB::nlmLogVariableID."default".1.1 = OID: DISMAN-EVENT-MIB::sysUpTimeInstance
NET-SNMP-AGENT-MIB::nsModuleName."".8.1.3.6.1.2.1.1.3.127 = STRING: mibII/sysUpTime
在进一步检查后,我们会发现其中的hrSystemUptime.0 OID包含正确的在线时间值。现在,我们可以随意使用该OID查看设备的运行时长:
snmpget authentication_infohost hrSystemUptime.0
HOST-RESOURCES-MIB::hrSystemUptime.0 = Timeticks: (9795352) 1 day, 3:12:33.52
可以看到,snmpwalk非常适合用于发现需要的OID值。
另一项非常实用的工具则并不会实际与远程主机通信,相反它只是简单帮助我们发现与MIB结构相关的信息。
使用snmptranslate工具,我们可以轻松将数字结果转换为其文本表现方式:
snmptranslate 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0
这样一来,MIB模块能够定义该文本名称以及OID自身的名称。
我们也可以使用该工具实现另一种翻译方向。当我们找到系统正常运行时间的文本MIB时(hrSystemUptime.0),我们可以使用-On标记将其翻译为数字地址。
请记得在接收到OID信息时,一定将MIB模块包含在内:
snmptranslate -On HOST-RESOURCES-MIB::hrSystemUptime.0
.1.3.6.1.2.1.25.1.1.0
大家也可以使用这款工具获取更多其它信息。例如,使用-Td标记,我们可以获得当前路径的完整描述:
snmptranslate -Tp 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0
sysDescr OBJECT-TYPE
-- FROM SNMPv2-MIB
-- TEXTUAL CONVENTION DisplayString
SYNTAX OCTET STRING (0..255)
DISPLAY-HINT "255a"
MAX-ACCESS read-only
STATUS current
DESCRIPTION "A textual description of the entity. This value should
include the full name and version identification of
the system's hardware type, software operating-system,
and networking software."
::= { iso(1) org(3) dod(6) internet(1) mgmt(2) mib-2(1) system(1) sysDescr(1) 0 }
大家可以修改输出结果的显示方式——使用-O_参数,其中的“_”代表需被替换为需要的输出格式。大家可以在“输出选项”章节看到完整的snmpcmd指南页面,但这里我们可以说说比较常用的几种:
Output FlagDescriptionExample
-Oa Display in ASCII strings SNMPv2-MIB::sysDescr.0
-Of Display full textual path to OID .iso.org.dod.internet.mgmt.mib-2.system.sysDescr.0
-On Display full numerical path to OID .1.3.6.1.2.1.1.1.0
-Os Display only the end textual OID representation sysDescr.0
请注意,以上输出格式调整选项也适用于本教程内提到的多数其它工具。
SNMP中保存的部分数据是以表格形式存在的。尽管snmpwalk能够显示全部相关数据,但其结构可能并不适合全部使用情况。
例如,如果我们在updTable OID上使用snmpwalk:
snmpwalk authentication_infohost udpTable
输出结果为:
UDP-MIB::udpLocalAddress.0.0.0.0.161 = IpAddress: 0.0.0.0
UDP-MIB::udpLocalAddress.0.0.0.0.35679 = IpAddress: 0.0.0.0
UDP-MIB::udpLocalPort.0.0.0.0.161 = INTEGER: 161
UDP-MIB::udpLocalPort.0.0.0.0.35679 = INTEGER: 35679
但如果使用snmptable进行检索:
snmptable authentication_infohost udpTable
则能够以表格方式显示结果:
udpLocalAddress udpLocalPort
0.0.0.0 161
0.0.0.0 35679
很明显,这样更易于阅读。
此命令用于向OID中写入值。之前提到的各命令都负责使用信息,而此命令则负责对主机数据进行修改。
尽管snmpset命令继承大部分其它命令的语法,但我们还需要为其提供一些额外的值以实现赋值。其基本语法如下:
snmpset authentication_infohostOID_to_modifydata_typenew_value
以上大部分字段已经非常清晰,但我们需要对数据类型进行说明。每种类型都以一个字母来代表,具体如下:
由于我们已经下载了snmp-mibs-downloader软件包,因此我们大多数情况下可以使用=来替代类型标识符。
为了展示此命令,我们可以注释掉代理计算机上snmpd.conf文件中的某个值,在该配置文件内将此值指定为硬编码形式,从而防止其被普通SNMP方法所修改。
在代理计算机上打开/etc/snmp/snmpd.conf:
sudo nano /etc/snmp/snmpd.conf
注释掉sysLocation指令:
#sysLocation Sitting on the Dock of the Bay
保存并退出。而后重启该服务:
sudo service snmpd restart
现在在管理设备上将sysLocation OID设定为“Earth”。注意,其中的“s”将数据类型指定为字符串:
snmpset authentication_infohost sysLocation.0 s "Earth"
SNMPv2-MIB::sysLocation.0 = STRING: Earth
我们可以测试=类型标识符能否正确对值类型进行设定:
snmpset authentication_infohost sysLocation.0 = "New York City"
SNMPv2-MIB::sysLocation.0 = STRING: New York City
可以看到,我们的值已经被正确解释为普通字符串。
我们可以重复执行snmpget与snmpwalk请求,但这会造成不必要的时间浪费。
为了解决这一难题,大家应当使用snmpbulkget与snmpbulkwalk。二者能够将单一事务内的全部返回值进行打包,而非将各返回值进行单独处理。大家也可以借此一次性检索多条OID。
要使用snmpbulkget,大家需要提供一条或者多条OID或者branch,返回结果中将包含全部相关值:
snmpbulkget authentication_infohost system
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (429891) 1:11:38.91
SNMPv2-MIB::sysContact.0 = STRING: call now
SNMPv2-MIB::sysName.0 = STRING: target
SNMPv2-MIB::sysLocation.0 = STRING: New York City
SNMPv2-MIB::sysServices.0 = INTEGER: 72
SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00
SNMPv2-MIB::sysORID.1 = OID: SNMP-MPD-MIB::snmpMPDCompliance
SNMPv2-MIB::sysORID.2 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance
需要注意的是,snmpbulkget的执行方式与snmpgetnext命令相似,这意味着其会将对象作为参数进行弃用。在以上示例中,我们并未提供特定对象,而使用了branch。大家可以将snmpbulkget视为一条snmpwalk调用,但结果将以打包形式返回。
而snmpbulkwalk命令也遵循类似的方式,即持续执行bulkget命令直到全部子树结构检索完成。
如大家所见,在net-snmp套件的帮助下,我们可以通过多种方式检索并操作数据。而将操作整合为脚本或者将工具运用在应用当中,大家将能够构建起复杂的监控与管理环境。
本文来源自DigitalOcean Community。英文原文:How To Use the Net-SNMP Tool Suite To Manage and Monitor Servers By Justin Ellingwood
翻译:diradw