Mr.Chan

导航

利用snmp 实现remote ping

技术是拿来为人服务,不是拿来吓唬和愚弄人的。
And 我很多时候把“提供全面的解决方案”听成“我们其实什么都不是非常会干”……
之所以发出上述感慨的一个原因是因为目前个人感觉实际上我们对一些基本的技术挖掘粒度还是比较有限
的,很多听起来玄之又玄,高深莫测的产品说到头来还是对非常基本和简单的技术的利用,如下面本文例

管理是为了实现最终工作目标,不是拿来制造差异和养南郭先生的。
And 我很多时候把 “强大的管理团队” 听成 “庞大的管理团队”……
这个我就暂时不提了
--
CNNOG1 上我的ppt 稿子中第18 页的snmp 部分引来了几封邮件,问该页的内容是什
么意思,一次次的回答比较麻烦,干脆写个小东西说明一下。
先把ppt 中该页内容引用如下(有细微改动):
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.16.333 integer 6 /*ciscoPingEntryStatus
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.16.333 integer 5
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.15.333 s "yiming"
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.2.333 integer 1 / *ciscoPingProtocol
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.3.333 x "DB 96 20 C5"
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.6.333 integer 1000 /*ciscoPingPacketTimeout
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.4.333 integer 10 /*"ciscoPingPacketCount
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.5.333 integer 111 /*ciscoPingPacketSize
• snmpset -v 1 -c 100wxs9dj 219.150.128.1 .1.3.6.1.4.1.9.9.16.1.1.1.16.333 i 1
• snmpwalk -v 1 -c private 192.168.1.1 1.3.6.1.4.1.9.9.16.1.1.1.12.333 /*ciscoPingAvgRtt
上述snmp 命令实际上最终实现的是remote ping 功能,ping 我们都很熟悉,但什么是
remote ping?
在拥有自己网络的企业内,尤其是大型的ISP,网络维护的工作中一般都有一项固定任
务:“测算几台路由器之间时延和丢包率”。通常是每天定时登录到路由器,在路由器而非管
理终端(此即remote)上面执行ping(或扩展ping)命令测量到其它router 或指定地址的时
延和丢包并将结果记录,进行后期的各种分析比较工作。
为完成上述需求,如果不使用这个ppt 里面谈到的方法,有3 种选择:
􀂄 一种是笨办法,管理员每天定时从管理终端挨个telnet/ssh 到路由器上,手工执行
ping(或扩展ping)命令,并copy 回结果,这个法子比较麻烦。
􀂄 方法2 是通过expect 之类的东西来写脚本,并设置cron 等代替管理员定时登录路
由器执行命令并取回数据,这个法子也不错,就是对管理员的编程有一些要求。
􀂄 方法3 最简单,就是买商用的hpopenview 之类支持remote ping 的工具,不过感觉
这个有点夸张。
实际上除了这三种方法以外,对于国内广泛使用的cisco 的设备来说,还有不花钱又简
单的方法,就是利用它自己的ping mib。
除了这个MIB 外,我们还需要snmp 的工具,当然可以选择商用的solarwind 之类的东
西,但是对于看此文的读者来说开源的NETSNMP 应该是方便自己定制的不二选择。
然后就是snmp 通讯字串了,本例子里面以private 表示。
最后是router 的ip,本例子中以192.168.1.1 表示。
打个茬,我之所以突然对这个remote ping 感兴趣,就是因为前一段一个电信的朋友问
有没有HP openview,他需要里面的rping 模块来对他们省内的routers 做remote ping,我手
头自然是不会有这个了,但是感觉不至于非要商用的产品才能搞这个事情吧。好奇之下就在
cisco 的网站狂扒了一阵,先是找到了一篇cisco 的Ping MIB Implementation 文档,可惜如法
炮制后发现不好使,后来发现是cisco 的文档写错了,这是后话不提。不过这个文档中提到
了cisco 自己的私有mib, CISCO-PING-MIB-V1SMI (参见2),知道了需要用到这个mib,
这个任务就简单了(p.s. SNMP 的相关概念请参阅其他文档)
首先要仔细查看CISCO-PING-MIB-V1SMI 这个mib 文件,搞清楚mib 中每个分支的意
思,其次为了方便使用命令时快速查找,我们还需要找到对应oid 表 (参见3)
在CISCO-PING-MIB-V1SMI.my 的开头部分我们看到如下内容:
-- snip --
A management station wishing to create an entry should
first generate a pseudo-random serial number to be used
as the index to this sparse table. The station should
then create the associated instance of the row status
and row owner objects. It must also, either in the same
or in successive PDUs, create the associated instance of
the protocol and address objects. It should also modify
the default values for the other configuration objects
if the defaults are not appropriate.
-- end snip --
读懂了这个mib 文件,剩下的工作就简单得很了,我们按照对上面ppt 的内容逐行解释
一下大家立刻就能明白:
首先ciscoPingEntry 的oid 是1.3.6.1.4.1.9.9.16.1.1.1,如上面所引用内容,我们
要先给它建立一个实例,这里随便选一个,333
1. "ciscoPingEntryStatus" "1.3.6.1.4.1.9.9.16.1.1.1.16"
第一步需要设置ping entry 的状态,在mib 文件中ciscoPingEntryStatus 描述如

--snip--
ciscoPingEntryStatus OBJECT-TYPE
SYNTAX RowStatus
-- Rsyntax INTEGER {
-- active(1),
-- notInService(2),
-- notReady(3),
-- createAndGo(4),
-- createAndWait(5),
-- destroy(6)
-- }
-- end snip --
为了保险起见,我们先destroy(6)以前可能有的实例,这就是ppt 中的第一行:
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.16.333 integer 6
2. 然后我们要create 这个实例,并等待后面的动作,设置 createAndWait(5), 这就
是ppt 中的第二行
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.16.333 integer 5
3. 设置一个ciscoPingEntryOwner,这就是ppt 中的第三行:
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.15.333 s "yiming"
4. 设置使用IP 协议来执行Ping 动作,这就是ppt 中的第四行:
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.2.333 integer 1
5. 设置ping 的destination IP 地址,注意目的IP 是16 进制表示,这就是ppt 中的
第五行:
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.3.333 x "DB 96 20 C5"
6. 设置超时时间,ppt 中的第6 行
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.6.333 integer 1000
7. 设置要发出的ping packets 数目,ppt 中的第7 行
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.4.333 integer 10
8. 设置ping 包的大小,ppt 中的第8 行
• snmpset -v 1 -c private 192.168.1.1 .1.3.6.1.4.1.9.9.16.1.1.1.5.333 integer 111
9. 将PingEntryStatus 设置为1,激活开始执行命令动作,ppt 中的第9 行
• snmpset -v 1 -c 100wxs9dj 219.150.128.1 .1.3.6.1.4.1.9.9.16.1.1.1.16.333 i 1
10. 取结果的平均RTT 值,ppt 中的第10 行
• snmpwalk -v 1 -c private 192.168.1.1 1.3.6.1.4.1.9.9.16.1.1.1.12.333
1 到9 的输出结果不必要copy 出来了,这里单把第10 个命令的输出结果copy 如下:
Yiming# snmpwalk -v 1 -c private 192.168.1.1 1.3.6.1.4.1.9.9.16.1.1.1.12.333
SNMPv2-SMI::enterprises.9.9.16.1.1.1.12.333 = INTEGER: 28
也就是说从此次测算的router 到dst IP 的平均RTT 是28 毫秒。
同样,我们可以对照MIB 表查询本次动作的其他各个指标,常见的如
.1.3.6.1.4.1.9.9.16.1.1.1.10.333
.1.3.6.1.4.1.9.9.16.1.1.1.12.333
.1.3.6.1.4.1.9.9.16.1.1.1.14.333 等等等等,
通过这些分支,我们可以得知执行每个实例的最小最大RTT, 接收,发送的报文数等等
项目,具体内容大家可以查看这些mib 文件的说明,此外我们可以改动实例值和目的
IP,同时起n 个remote ping 的实例,对多个目的地址remote ping,然后将结果导入
rrdtools 之类的软件,这里就不废话了。
本小文只是简单的举了个利用snmp 实现remote ping 的例子,其实在我们的日常工作
中,还有非常多的技术问题等待挖掘,管理员利用开源的东西,自己动手搞一些东西出来,
可能会比商用产品起到更好的效果。
链接:
NETSNMP http://www.net-snmp.org/
CISCO-PING-MIB-V1SMI ftp://ftp.cisco.com/pub/mibs/v1/CISCO-PING-MIB-V1SMI.my
CISCO-PING-MIB.oid ftp://ftp-sj.cisco.com/pub/mibs/oid/CISCO-PING-MIB.oid

posted on 2005-05-28 08:31  cunshen  阅读(3625)  评论(0编辑  收藏  举报