1、MRTG 能做什么 MRTG 是一套适用范围广泛的流量统计工具,与一般 Server 的流量分析不同,后者是对 Server 产生的 log 档进行分析。而 MRTG 则需以 SNMP 或 外挂程式的方式来收集资料,产生即时统计图。 进一步的比较,Server 的流量分析程式,因为资料内容资讯量较大,比较耗费系统资源,因此通常无法提供即时的统计结果,而是设定成一天执行一次(一般状况而言)。MRTG 仅只统计 24 个量,资讯相对较为简略,所以系统资源负荷轻,可以提供即时统计,一般是设定成五分钟执行一次。 MRTG 在 Linux 平台上,已经利用来做以下各式各样的统计(反观 Windows平台
2、,因为 Microsoft 并未开放系统,资讯整合困难,开发的人也不多): 系统资源负荷量统计,例如:磁碟空间、CPU 用量、记忆体用量等等 Server 流量统计,例如:Mail 、News、DNS、Web、BBS、IRC 、MUD等等 网路设备流量统计,例如:防火墙、Router、Switch 、拨接终端机、ATM 交换机等等 另类统计,例如:Modem 流量、Login 人数、雷神之槌连线游戏人数 等等 以 MRTG 的机制来说,它会以 SNMP 通讯协定去询问 Router,然后将传回来的数值画成统计图。或者去执行一支外挂程式,该程式将要统计的数值传回来,然后 MRTG 只负责将它画成
3、统计图。上面所提各种场合的应用,除了 Router、Switch 之外都是利用外挂程式的方式,来达成目的。 在此我将不详叙如何撰写外挂程式,而把重点放在安装与 Router 流量统计的建立。如果您不是很熟悉 Router 或者不太了解网路机制无法独立侦错,请不要贸然在对外提供服务的机器上安装测试。 MRTG 哪里来 您可以到 http:/www.mrtg.org 取得最新版本,该站台上也有讨论群组及 FAQ等诸多技术文件可供参考,所下载的压缩档解开后,也附有与网站内容相同的网页文件。您也可以直接在这里取得我改版的中文版本,此版本同时也附有我修改过的范例组态档。 执行 MRTG 需要先安装 Pe
4、rl ,Windows 版的 Perl 已经支援 windows 2000,您可以在 http:/ 找到,该套装是直接以 windows installer 打包成 Msi 档案,所以安装时,还必须到微软公司取得最新版的 windows installer,这支程式虽然已经随着 Office 2000 发行,但是 Office 2000 所附的版本无法安装 Perl。请您按这里取得上述两个套件。注意:这个版本不支援 Win 9x,如果您要在 Win 9x 上面执行 MRTG ,请另行从 Active Perl 官方网站 http:/ 下载。 从市网中心下载的 MRTG,解压缩后内含三个 ZIP
5、 档,分别是 MRTG-2.8.12 主程式、95MRTGscheduler 是一支排程程式,以 VB 撰写的,很可惜只能在 Win9x 上面执行、 fiveminute 则是 DOS 批次档,也是用来排程功能与 95MRTGscheduler 相同,但可以在 Win 9x、NT、2000 里执行。 设定 SNMP(Simple Network Management Protocol) MRTG 统计 Router 流量时,是透过 SNMP 来取得资讯,由 MRTG 送出 SNMP 查询要求给 Router,这时候我们称此工作站叫做 SNMP Agent,而把 Router 称为 SNMP S
6、erver 。SNMP 查询要求是使用 TCP 161 Port,SNMP Server 收到要求后会将要求的资讯以 UDP 1024 以后的 Port 传送回 SNMP Agent。 由于每一种 Router 所支援的功能不同,而且即使是相同功能,也可能是用不同机制开发完成的。因此要让 SNMP 通讯协定来应付所有 Router 的需求,必须设计的相当有弹性才行。这个弹性就是 MIB 模组,MIB 模组是 Router 上所提供功能的定义集合,已尽量涵盖所有 Router 功能,不足部分仍可由开发 Router 的厂商自行来制定,以 Cisco 公司来说,甚至是让不同型号的 Router 都
7、有自己专用的一组 MIB 模组。当然 MIB 模组也涵盖非 Router 的其他各种网管机制,例如:防火墙、Radius、Novell、各种 Server 等等。MIB 模组将 Router 的功能以 tree 架构来分类,每项功能都有一个功能名称和一个 OID 号码,与 DNS 和 IP 的关系一样,功能名称是给人看的,OID 号码则是给机器辨识用的,有些 OID 可以用来读取状态,有些则只用来当分类项目用,另外还有少数的 OID 可以设定指定的值。想知道 Router 的 MIB 资讯,可以查看购买 Router 时厂商所附的文件光碟,如果已经找不到该光碟,您也可以直接从该公司网页查询。有
8、一个站台已经将各厂商所支援的 MIB 表列出来(只有大的分类项,没有详细内容),您也可以参考看看,网址是 http:/www.ibr.cs.tu-bs.de/cgi-bin/sbrowser.cgi。 要让 MRTG 能够读取流量资讯,首先必须把 Router 上的 SNMP Server 功能打开,如果您要监测学校对外流量,由于学校端是以 Router 连上 ATU-R,所以只要监测 Router 就可以了,不要去管 ATU-R(ATU-R 是中华电信租给学校的设备,除非中华电信同意,否则不能在上面做任何调整,以免触犯法律)。 其实学校对外流量已经由市网中心监测了,所以在学校端另行监测没有什
9、么用处。如果利用 MRTG 来监测各单位的流量,如:电脑教室、各处室等等,相信对学校来说,更为有用。 首先 Telnet 到 Router 上,进入 enable 指令层。 进入 config 指令层,并以 snmp ? 来查看详细指令语法。这里是以 Cisco Router 当范例,如果您购买的 Router 品牌不一样,从这个步骤以后,都会不太一样,请自行依照 Router 说明来操作。 我们看到说明里面,community 是用来将 SNMP Enable。如果还是不知道下一步的做法,可以用 snmp community ? 来查看进一步的说明。 community string 就是
10、SNMP 的连线密码,一般是设成 public,如果您不希望别人也来监测您的 Router 的 MIB,可以将此字串改为您自定的密码。当然待会儿设定 MRTG 时,也要修改。 我们将此密码设定为 RO,也就是允许知道密码的人,可以来读取 Router 上的 MIB 状态。如果是设定成 RW,那就是允许可以设定或重置 Router 状态,由于 MRTG 只需要读取,所以只设 RO 就够用了。 如果您觉得这样还不够安全,还可以指定 ACL Rule,通常是用编号来表示。ACL 主要功能为过滤来源 IP,只有特定 IP 的 SNMP 要求,Router 才会回应,其余的 IP 来源不予理会。设定方法
11、这里就不详述,请自行参考说明设定。 设定好了以后,先以 exit 退回到 enable 指令层,然后以 sh run 来查看设定是否成功,检查没有问题后,以 copy run start 将设定值备份到 flash ROM 上面,以免停电重开机后,设定值遗失。 安装 Perl 和 MRTG 假设您已经安装过 Webalizer NT 版,应该对解压缩、安装、设定 PATH 路径.等工作很熟悉了,这里就简单以文字来说明。 首先是安装 Windows Installer,直接在解开的 InstMsi.exe 上面按两下执行。安装完毕后,以同样方法把 ActivePerl-5.6.0.613 装起来
12、。 Perl 在安装时,会自动增加 PATH 环境变数的设定,同时会自动设定应用程式的相关性,并将 IIS 或 PWS Server 上的 CGI 设定也一起设好,这些工作都不需要我们操心。(如果您抓到的是旧版本,那可就累了。) MRTG 主程式解开后,放在 c:mrtg 目录中,其中 run 目录里面所摆放的,就是 mrtg 几支主要程式与相关组态档。由于这些程式都是 Perl 程式,执行方式是在命令列下指令: C:perl mrtg mrtg.cfg 或者将该档案改名为 mrtg.pl 就可以直接在 Windows 里面点两下执行。其余程式也是如此。 修改 MRTG 主程式 现在我们先来修
13、改 MRTG 主程式,使它可以在 Windows 下面执行。先探讨一下在 Windows 环境写 Perl 程式的问题。 Perl 只接受 UNIX 的纯文字格式,所以换行符号与 Windows 系统不同。在 UNIX 下面按 Enter 换行会产生内码为 0A 的字元(也就是写程式时的 n 字元),但是在 Windows 下面按 Enter 则会产生 0A 和 0D 两个字元( 也就是写程式时的 nr 字串) 。由于这个缘故,写 Perl 程式时,可千万不能按 Enter。另外写 Perl 程式时,不要用记事本来写,因为它不知道 0A 也是换行的意思,通常我们会用 WordPad 来写,以下
14、就是两者的比较。 当然如果您有更好的工具,例如:UtraEdit。拿来写 Perl 程式是最好用的了。 通常写 Perl 程式时的第一行要指定 Perl 的所在路径,但在 Windows 下面,这项工作已经由 PATH 环境变数代劳了,所以第一行只要写 #!Perl 就可以了。当然如果不去改它,也是可以执行,不过比较容易造成误解就是了。 MRTG 主程式要修改主要是中文显示的问题,和以下这一个变数设定: $main:OS = UNIX;#$main:OS = NT;#$main:OS = VMS; 改为 #$main:OS = UNIX;$main:OS = NT;#$main:OS = VM
15、S; 如果您的主程式是我修改过的版本,那么就不需要自己改了,我已经将它改为中文版了,可以直接使用。 设定 MRTG 组态 MRTG 的使用流程是这样:首先执行 cfgmaker 来送出 SNMP 封包,侦测 Router 上所支援的 OID 号码,并建立组态档。这项工作可以使用以下指令来完成: c:mrtgrunperl cfgmaker public163.21.236.254 mrtg.cfg 以上指令是用来建立 163.21.236.254 这个 Router 的组态,使用 public 来当 SNMP community string,建立好的组态则是放在 mrtg.cfg 组态档中(
16、 记得前面改 Router 时,曾经设定过 community string 吗?如果您不是设 public,这里可别照着做)。 如果是在 Linux 的平台上,这个步骤应该可以很容易就完成。但是在 Windows 平台上你可能会遇到程式执行过久(感觉很像程式当掉) ,或是做出完全空白的组态档,以 Netxray 来监看封包可以找出原因,如下图: 我们可以发现,当 163.21.236.71 (SNMP Agent) 从 163.21.236.254 (SNMP Server) 取得 OID 号码后,找到一个路由介面 IP 是 163.21.158.254 ,接着 Windows 对该 IP
17、进行反查,向 DNS Server 163.21.236.4 查询(图上反白的那一行),反查成功后,SNMP Agent 继续询问 SNMP Server,结果得到第二个路由介面 IP 是 163.21.234.254 ,一样对此 IP 进行反查,结果查不到,于是 Windows 继续以 NetBios Name 进行广播找人 ,但也查不到.最后什么组态也做不出来。 由于在 Linux 上执行 cfgmaker 时,不会去反查 IP,所以一切都很顺利。在 Windows 上就没那么幸运了。解决方法是什么呢?其实很简单,只要为 Router 上的每一个 IP 都做好 DNS 纪录就可以了。 如果
18、你有 Linux 的机器已经装好 Perl,也可以拷贝 cfgmaker 到 Linux 上,利用 Linux 来做组态档,然后再将做好的组态档拷贝回 Windows,这样也可以。 否则还有第三个方法,就是手动来建立组态档。在市网中心所提供的 MRTG 套件中,内含有我修改过的范例组态档 mrtg.cfg,我们就以此档案为例,来了解一下组态档参数的意义。以下就是该档案内容(前面已经说过,使用 WordPad 来编辑,记得千万不要按 Enter): WorkDir: e:Inetpubwwwrootmrg 以上这一行是设定 MRTG 流量统计图的摆放位置,当然要摆放在网页所在的目录里 # Des
19、cription: Cisco Internetwork Operating System Software IOS (tm) C2600 Software (C2600-IS56I-M), Version 12.0(2a), RELEASE SOFTWARE (fc1) Copyright (c) 1986-1999 by cisco Systems, Inc. Compiled Fri 01-Jan-99 16:32 by phanguye# Contact: # System Name: Router# Location: #. 以上是 Router 上的 SNMP Server 讯息,
20、其实都是注解行,如果觉得讨厌可以直接将它移除。 Targetg_point: 1:public163.21.204.254 这是定义资料来源,前面说过资料来源有两类:如果是以 OID : Community string 来定义,则来源由 SNMP Server 提供;如果要由外挂程式提供资料,则会定义成Target上线人数: perl myfinger.pl 注意:中括弧里面是定义做出来的网页的档名,在这里会做出 g_point.html 的统计网页。 MaxBytesg_point: 1250000 这是定义流量的最大值,用来计算目前流量的百分比。如果只设定一笔,就表示流入流出的频宽相同。
21、 Titleg_point: 本校总流量统计 网页的抬头。 Optionsg_point: growright,bits 定义统计图的方向(由左至右)以及统计的单位(以 bits 来计算,而不是 bytes) PageTopg_point: 本校总流量统计(Ethernet0/0) 网页显示时第一行的内容 #- Targeta_point: 6:public163.21.204.254 这里的 OID 号码是 6,这并不是完整的 OID。完整的 OID 应该是 1.3.6.1.2.1.2.1.6,在 MIB 里的定义是 IF-MIB!ifDescr,也就是指定 Router 上面的介面编号,要
22、注意的是该编号是浮动式的,每次 Enable 或 Disable 一个介面,该编号都会有异动。所以当 MRTG 执行后,会产生 mrtg.ok 档案,此档案会纪录目前哪一个编号对应到哪一个介面,当发生错误时,必须要自行核对此档案,然后手动去修改介面编号的正确值。 MaxBytes1a_point: 187500MaxBytes2a_point: 48000 以上也是在定义最大流量,以方便计算百分比。分开写成两行是因为流入与流出频宽不同, MaxBytes1 是流入的上限量,而 MaxBytes2 则是流出的上限量。 Titlea_point: 本校对市网中心流量统计Optionsa_point
23、: growright,bitsPageTopa_point: 本校对市网中心流量统计(Ethernet0/1) #- 关于组态设定更详细的资讯,可以在 MRTG 的 doc/config.html 找到。许多微调选项在 Windows 环境里面并不能使用,请自行参考测试。 建立 MRTG 统计网页 使用 indexmaker 来建立目录网页,使用下列指令: c:mrtgrunperl indexmaker -o e:inetpubwwwrootmrtgdefault.htm mrtg.cfg 更详细的说明请直接打 c:mrtgrunperl indexmaker 查询。 在建立目录网页之前,
24、必须先修改 indexmaker 主程式,请将 $title = 台北市教育网路中心流量分析; 改为贵校名称。 关于 95MRTGscheduler 由于 Windows 环境里的排程设计的不够理想,只能排定每日一次,无法设定成五分钟执行一次,因此 MRTG 的排程工作,必须要用变通方法。 这支程式是以 VB 所撰写的排程程式,必须要常驻在记忆体里面执行,而且因为开发时的 VB 版本较旧,所以只能给 Win 9x 的作业系统执行。如果您的 MRTG 刚好也是在 Win 98 上面执行,那么请您把它装起来吧! 这个设定介面非常一目了然,所以我就不再详细说明。如果您装了这支程式,以后的步骤您都不需
25、要再去理会。 有一个细节要特别注意,当您设定好以上三个路径后,千万不要再去搬移,否则这支程式会执行不起来,出现系统错误讯息,而且重新安装也没用。当然是有办法补救,我用的办法是直接以 Regedit 去修改系统登录档,将该三个机码的值,档名去除,只留下路径。这样可以将该程式救回来。修改系统登录有很高的风险,请务必照图操作。 机码的位置在 HKEY_CURRENT_USERSoftwareVB and VBA Program SettingsMRTGSchedulerParameters 执行排程批次档 在 Win NT(包括 Win 2000) 中,MRTG 排程只好使用 NT 系统提供的 at
26、 指令(auto task,在 Resource kit 里面,请自行安装)。请将 fiveminute.zip 解开到 c:mrtg 目录中,总共有六支批次档,现在逐一说明其功能: mrtgkick.bat 是最底层的批次档,主要是执行 mrtg 主程式 echo offc:perlbinperl c:mrtgrunmrtg c:mrtgrunmrtg.cfgexit A.bat、B.bat、C.bat 这三支批次档是为了避免连续呼叫 mrtgkick.bat 造成 Recursive(递回,也就是说前一个执行实体尚未执行完毕,还未释放系统资源,下一个执行实体又建立,而资源被使用中无法取得,
27、造成死结),因此这三支批次档内容都相同。 echo offstart c:mrtgmrtgkick.batexit 2.bat 的内容只有一行,主要是参数传递方式设定 at 自动排程,第一个参数(%1)是执行时间,第二个参数(%2) 是执行的程式内容。 at %1 /every:m,t,w,th,f,s,su “%2“ 注意:/every:m,t,w,th,f,s,su 中 m 是指 monday,其余依此类推。也就是说每周的星期一到星期日都要执行,换句话说就是每天执行的意思。 3a.bat 是最上层的批次档,也是将来要做排程设定的对象。这支批次档是呼叫 2.bat 并且传入两个参数,参考上面
28、的说明,我们可以了解其实就是按时去轮流执行 A.bat、B.bat、C.bat 三支批次档,轮流执行的原因是为了避免造成 Recursive。 call 2.bat 0:00 C:mrtgA.BATcall 2.bat 0:05 C:mrtgB.BATcall 2.bat 0:10 C:mrtgC.BATcall 2.bat 0:15 C:mrtgA.BATcall 2.bat 0:20 C:mrtgB.BATcall 2.bat 0:25 C:mrtgC.BAT了解了排程的原理以后,现在我们就将它执行起来: c:mrtg3a 这支批次档只要执行一次就可以了。它会在 at 清单上建立 288
29、个执行项目,也就是每天每小时的五分、十分、十五分、二十分.各执行一次 MRTG。 我完成 MRTG 流量统计了 现在让我们来欣赏一下成果吧!在画面最右边,已经可以看到流量跑出来了! 下一步是什么? 学会安装和使用 MRTG,并不是这个主题的结束,而仅仅是开始。前面提过透过外挂程式的方式,可以做到特殊应用系统的即时统计,如果您需要这方面的资料,可以参考 c:mrtgcontrib 目录里面的文件与原始程式码。 我在这里要再提醒大家一次,那里面的原始码是为 UNIX 或特定系统开发的,在 Winodws 上面不可直接拿来执行。 至于 Windows 下面,MRTG 可以拿来做哪些应用,这个主题留待下回分解。