编者按:大家往往抱怨:做网管的收入为何如何低?然而,当一般网管仅仅使用网络管理工具的时候,有的人却在偿试去改造、二次开发网络管理工具,从而实现更好的网络管理效率,而这个过程,正是网管们的高薪之路!
本文是祥子继"祥子的自传:如何成长为高级工程师"的又一篇自传式力作。MRTG软件是网络流量监控的工具,是很多网管进行网络管理的必备工具。然而,当很多人仅仅在使用MRTG时,祥子却对MRTG进行了深度挖掘,特别是结合Linux的脚本编程,对MRTG进行了二次开发,通过改造而得到了更高的网络管理效率。
无疑,祥子的做法值得大家学习。就在前几天,祥子高兴地与笔者提到:已经通过了内部岗位竞聘,荣升为项目经理。于是,祥子就从此前的高级网络工程师成长为负责整个网络系统项目团队的项目经理了。在此,向祥子表示祝贺。相信,这也是很多网管们的愿望吧。
最基本应用:设置MRTG为自启动程序
MRTG中级应用:设置参数,让输出信息更加准确
中高级技巧一 利用脚本来简化命令的输入
中高级技巧二 善用FC命令比较得出的结果
高级脚本开发应用:让MRTG与交换机端口随需而变
【IT168 专稿】祥子和同事们使用MRTG软件已经有些年头了,现在很多同事都已学会使用MRTG来监控局域网中的网络设备(比如交换机、路由器、防火墙)的流量情况,但是我们在使用过程中也发现一些问题,比如实际网络中交换机端口连接的终端设备经常会发生改变,每做一次这样的改动都要重新改一遍配置文件,输入一行行长长的配置字符串很麻烦,而且手工做很容易出错,又或者重启服务器的时候忘记开启MRTG进程了,导致一段时间内网络流量是空白,再或者本来要监控局域网中内的多台网络设备,结果启动进程时由于漏写了参数,结果过了几天才发现还有几台设备没有生成流量统计等等。
工具应用:不能只停留在肤浅的层面上
种种不便,让我们感觉到对于MRTG的应用不能只停留在肤浅的层面上,而是应该潜下心来,深层次的挖掘一下MRTG的高级应用,结合Linux的Shell编程进行二次开发,由此,得到了意想不到的管理效率。下面是对这一段时间研究成果的汇报(我们以红旗LINUX6.0桌面版+MRTG2.16.2作为本次研究的平台)
最基本应用:设置MRTG为自启动程序
让MRTG进程跟随系统一同启动,这是一个最基本的需求,因为MRTG的最基本功能就是实时记录网络设备的流量,操作系统总有重启的时侯,我们要实现的是当系统重新启动后,MRTG也随之启动了,怎么做呢?做一个脚本,放在/etc/rc.5/目录下即可,这里面有几点需要注意的地方。
(一)正确判断放置脚本的目录
在此要说明一下,本文中MRTG程序是运行在红旗LINUX6.0操作系统的桌面环境下,因此这个环境下启动文件是放在/etc/rc5.d/目录下的。
(二)创建一个启动脚本
内容如下:
[root@jncatvrd6a htdocs]# more /etc/rc5.d/S31mrtg
#!/bin/sh
cd /usr/local/mrtg-2/bin && ./mrtg /usr/local/mrtg-2/bin/cfg/192.168.3.1.cfg
该文件以大写的"S"开头,表示为一个启动文件,后面跟两位数字,再后面跟标志该程序的字符串。
(三)为脚本设置正确的权限
即使创建了符合格式的文件名,脚本的内容也正常,重启计算机后也可以无法正确的启动MRTG进程,不成功的原因很可能是由于没有设置正确的权限,可以看一下这个目录下的其它文件的取限设置,发现它们都是可执行文件,照它们的样子写即可:
[root@jncatvrd6a rc5.d]# chmod 777 S31mrtg
[root@jncatvrd6a rc5.d]# ls -l S31mrtg
-rwxrwxrwx 1 root root 87 10-27 16:25 S31mrtg
以上三步做完,MRTG就可以跟随系统一起启动了。
(四)不要忘了同时启动WWW发布进程
我们发布网页(也就是MRTG监控的结果)是通过APACHE程序,也需要把这个程序设置为自动启动
[root@jncatvrd6a rc5.d]# chmod 777 S65apache
[root@jncatvrd6a rc5.d]# more S65apache
#!/bin/sh
cd /usr/local/apache2/bin && ./apachectl start
MRTG中级应用:设置参数,让输出信息更加准确
这是我们研究的重点,我们以往配置MRTG的时侯,一般来说都是按照默认的参数来做的,即先生成配置文件(cfgmaker),再生成网页文件(mrtg),最后生成合并的网页文件(indexmaker),但是仔细观查生成的网页文件时却会发现一些问题,比如网页中显示的端口号与交换机实际的端口上对应不上,或者出现了一些交换机上没有的端口(这在三层交换机上表现的尤为明显,一台24口的交换机,MRTG输出的网页上可能出现七、八十个端口,点击进去以后结果发现是VLAN),实际上通过对于cfgmaker命令的深入研究,我们发现是可以通过设置相应参数来得到我们最终想要的结果。
(一)如何获得最详尽的cfgmaker命令使用方法的帮助信息
打这个命令就可以了:cfgmaker -man
为了方便查看,可以将此帮助输出到一个文件里面。
[root@jncatvrd6a rc5.d]# cd /usr/local/mrtg-2/bin
1027.txt cfg cfgmaker indexmaker mrtg mrtg-traffic-sum rateup
[root@jncatvrd6a bin]# ./cfgmaker --man >>1029.txt
[root@jncatvrd6a bin]# more 1029.txt
通过FTP的方式将这个文件传到一台WINDOWS的电脑,在WORD中打开这个文件,可以方便的进行标注及翻译。
(二)了解cfgmaker最基本的语法格式
通过查看cfgmaker的帮助文件的开并头部分,我们可以大概了解到cfgmaker命令的基本语法
[root@jncatvrd6a bin]# more 1029.txt
NAME
cfgmaker - Creates mrtg.cfg files (for mrtg-2.16.2)
SYNOPSIS
cfgmaker [options] [community@]router [[options] [community@]router ...]
OPTIONS
--ifref=nr interface references by Interface Number (default)
--ifref=ip ... by Ip Address
--ifref=eth ... by Ethernet Number
--ifref=descr ... by Interface Description
--ifref=name ... by Interface Name
--ifref=type ... by Interface Type
--ifdesc=nr interface description uses Interface Number (default)
--ifdesc=ip ... uses Ip Address
--ifdesc=eth ... uses Ethernet Number
--ifdesc=descr ... uses Interface Description
--ifdesc=name ... uses Interface Name
--ifdesc=catname ... uses CatOS Interface Name
--ifdesc=ppname ... uses Passport Port Name
--ifdesc=alias ... uses Interface Alias
--ifdesc=type ... uses Interface Type
如上面的信息所显示的,cfgmaker命令主要通过后面所跟的相应参数来生成相应的配置文件,最后面跟的是要监控设备的community串和主机名
(三)主要的参数
1、--ifref系列参数
Ifref系列参数的主要作用就是告诉配置文件依据什么指标来标记端口,可以通过端口号(nr)、端口的IP地址(ip)、端口的以太地址(eth)、端口的描述(descr)、端口的名字(name)、端口的类型(type)来标记,一般情况下我们就是使用端口号来标记端口的,我们可以写一下看看,命令如下:
cfgmaker --global "WorkDir:/usr/local/apache2/htdocs/mrtg/" --output /usr/local/mrtg-2/bin/cfg/3switch.cfg --ifref=nr public@192.168.3.1
可以到指定的目录去看一下生成的配置文件,可以看到跟用默认的命令生成的配置文件内容是一样的,因为系统默认就是通过nr来标识端口的。
中高级技巧一 利用脚本来简化命令的输入
相信大家在配置MRTG的过程中,总为要不断的敲入一长串一长串的命令犯愁,其实我们可以通过将配置命令做成脚本来简化操作,比如我们要学习-ifref=nr这个参数的配置,可以写如下一个脚本:
[root@jncatvrd6a bin]# more sifrefnr
#!/bin/sh
cd /usr/local/mrtg-2/bin && cfgmaker --global "WorkDir:/usr/local/apache2/htdocs/mrtg/" --output /usr/local/mrtg-2/bin/cfg/192.168.3.1.des1029.cfg --ifref=nr public@192.168.3.1
[root@jncatvrd6a bin]# ls -l sifrefnr
-rwxrwxrwx 1 root root 189 10-29 17:09 sifrefnr
下次如果我们要看-ifref=eth的效果时,只需将这个脚本复制另一个文件,然后再稍微的改动一下这个新文件的内容即可,我们可以这样写:
[root@jncatvrd6a bin]#cp sifrefnr sifrefeth
[root@jncatvrd6a bin]# more sifrefeth
#!/bin/sh
cd /usr/local/mrtg-2/bin && cfgmaker --global "WorkDir:/usr/local/apache2/htdocs/mrtg/eth" --output /usr/local/mrtg-2/bin/cfg/192.168.3.1.eth1029.cfg --ifref=eth public@192.168.3.1
[root@jncatvrd6a bin]# ls -l sifrefeth
-rwxrwxrwx 1 root root 204 10-30 11:42 sifrefeth
为什么可以这样做,因为cfgmaker命令的语法是相同的,不同之处只是所跟的参数,而且只是各别具体的值,所以我们可以针对一个参数系列写成一个模板脚本,每次要尝试一个萁中小项参数的功能的时侯,稍微修改一下模板的内容就可以了。
中高级技巧二 善用FC命令比较得出的结果
特别是在研究cfgmaker命令应用的初期,好不容易利用替换不同的参数得到了配置文件,怎么样才能快速比较出各个配置文件之间内容的差异呢(也就是不同参数所实现的效果),用FC命令可以快速的得到结果。
下面我列出了比较两个文件所得到的结果的一小部分:
正在比较文件 192.168.3.1.nr.cfg 和 192.168.3.1.ETH.CFG
***** 192.168.3.1.nr.cfg
# Created by
# ./cfgmaker --global WorkDir:/usr/local/apache2/htdocs/mrtg/ --ifref=nr --output /usr/local/mrtg-2/bin/cfg/192.168.3.1.nr.cfg ublic@192.168.3.1
***** 192.168.3.1.ETH.CFG
# Created by
# ./cfgmaker --global WorkDir:/usr/local/apache2/htdocs/mrtg/eth --ifref=eth --output /usr/local/mrtg-2/bin/cfg/192.168.3.1.eth.cf public@192.168.3.1
***** 192.168.3.1.nr.cfg
EnableIPv6: no
WorkDir:/usr/local/apache2/htdocs/mrtg/
***** 192.168.3.1.ETH.CFG
EnableIPv6: no
WorkDir:/usr/local/apache2/htdocs/mrtg/eth
***** 192.168.3.1.nr.cfg
Target[192.168.3.1_1]: 1:public@192.168.3.1:
SetEnv[192.168.3.1_1]: MRTG_INT_IP="" MRTG_INT_DESCR="FastEthernet0/1"
MaxBytes[192.168.3.1_1]: 12500000
Title[192.168.3.1_1]: Traffic Analysis for 1 -- 3550
PageTop[192.168.3.1_1]: <h1>Traffic Analysis for 1 -- 3550</h1>
<div id="sysdetails">
***** 192.168.3.1.ETH.CFG
Target[192.168.3.1_00-0d-bc-04-1b-01]: !00-0d-bc-04-1b-01:public@192.168.3.1:
SetEnv[192.168.3.1_00-0d-bc-04-1b-01]: MRTG_INT_IP="" MRTG_INT_DESCR="FastEthernet0/1"
MaxBytes[192.168.3.1_00-0d-bc-04-1b-01]: 12500000
Title[192.168.3.1_00-0d-bc-04-1b-01]: Traffic Analysis for 00-0d-bc-04-1b-01 -- 3550
PageTop[192.168.3.1_00-0d-bc-04-1b-01]: <h1>Traffic Analysis for 00-0d-bc-04-1b-01 -- 3550</h1>
<div id="sysdetails">
从中可以明显的看出指定生成网页文件路径不同,生成的配置文件存放的路径不同,接下来就是重点了,第一个文件是用端口口号来标识的,
Target[192.168.3.1_1]: 1:public@192.168.3.1:
第二个文件是用以太地址来标识的(即00-0d-bc-04-1b-01这一串字符)。
Target[192.168.3.1_00-0d-bc-04-1b-01]: !00-0d-bc-04-1b-01:public@192.168.3.1:
利用FC命令,我们可以在生成配置网页文件以前就立即知道各个参数所产生的不同效果是什么,实际上,综合利用好这两个小技巧,可以让我们在学习cfgmaker的各项参数时达到事半功倍的效果,快速的掌握选项中每个参数的用法,从一个胜利走向另一个胜利。
2、--ifdesc参数系列
这组参数主要解决什么问题呢,以我们单位实际的网络情况来说吧,利用MRTG来监控一台CISCO3550三层交换机的各个端口的流量,在用indexmaker命令得到全部端口组成的网页时,会发现前面关于1-24端口的描述还是可以看懂的,但是后面出现的端口就看不懂了,只是一个24口的交换机,怎么出现了七、八十个监控的端口,只是当点击某个端口的图标进去看到详细信息以后再发现这其实是某个VLAN,怎么能让indexmaker生成的网页文件直接显示相应的VLAN号呢?其实利用-ifdesc的相关参数就可以做到,只需使用一个"descr"参数就可以了,命令这样写:
cfgmaker --global "WorkDir:/usr/local/apache2/htdocs/mrtg/3/" --output /usr/local/mrtg-2/bin/cfg/3switch.cfg --ifref=nr --ifdesc=descr public@192.168.3.1
现在再看生成的网页文件,就是显示的相应的VLAN号了,如图1所示。
图1
这样看起来就直观多了。
3、MRTG还支持中文
太神奇了吧,这简直是MRTG赐予我们的礼物,本来要说起来在单位中会使用MRTG来监控流量的人多少都懂点英语,但是如果我们某天要给领导演示一下MRTG的效果的话,网页中显示的内容是中文的话,效果还是要好很多的,怎么做呢?利用--global "language: chinese" 这个参数就可以了,命令这样写:
cfgmaker --global "WorkDir:/usr/local/apache2/htdocs/mrtg/3/" --global "language:chinese" --output /usr/local/mrtg-2/bin/cfg/3switch.cfg --ifref=nr --ifdesc=descr public@192.168.3.1
写完以后,生成的网页就会用中文显示相关的信息了,如图2所示
图2
4、在一条cfgmaker命令中同时监控多台网络设备的流量
以前我们是通过写多个配置文件,开启多个mrtg进程来实现的对于多台网络设备的流量临控,但是通过学习cfgmaker命令发现如果需要同时监控几台网络设备时,只需在cfgmaker命令的后面写几个相应的"[community@]router"参数即可,比如我们这次要同时监控三台交换机,IP地址分别为192.168.3.1、192.168.3.253、172.19.97.2,命令可以这样写:
cfgmaker --global "WorkDir:/usr/local/apache2/htdocs/mrtg/3/" --global "language:chinese" --output /usr/local/mrtg-2/bin/cfg/3switch.cfg --ifref=nr --ifdesc=descr --show-op-down public@192.168.3.1 public@192.168.3.253 public@172.19.96.2
就是这么简单,在生成的配置文件中我们就可以看到里面包含了这三台交换机所有的端口信息,附带提一下,这条命令中出现了一个"--show-op-down",它的意思是不论端日是处于"up"还是"down"的状态,都对其进行流量监控。
5、为每一个网络设备都定义相应的目录
当我们实现了同时监控多台网络设备后,却发现又出现了一个问题,那就是所有网络设备被采集到的信息都存一个目录里,太杂乱了,能不能该不同的网络设备的信息分别分别与之对应的目录里呢,可以的,利用-subdis参数就可以实现,命令如下:
cfgmaker --global "WorkDir:/usr/local/apache2/htdocs/mrtg/s3sub/" --global "language:chinese" --output /usr/local/mrtg-2/bin/cfg/3switchsub.cfg --ifref=nr --ifdesc=descr --show-op-down --subdirs=HOSTNAME public@192.168.3.1 public@192.168.3.253 public@172.19.96.2
利用这条命令先得到配置文件,再利用mrtg进程生成相应的网页文件,就会发现mrtg自动在相应的目录下新建三个子目录:"192.168.3.1"、"192.168.3.253"、"172.19.96.2",里面分别存放着各自对应的网页文件。
6、其它有待进一步学习的参数
很早以前就了解到MRTG还可以监控到网络设备的诸如CPU的占用率等指标,但是实际使用起来感觉用处不大,而且有一些成熟的网管软件可以实现类似的功能,所以我就没有再继续学习。
高级脚本开发应用:让MRTG与交换机端口随需而变
作为一名网络管理员,经常会对网络设备进行调整,比如要经常调换交换机端口所连接的网络节点,这样一来,交换机上有些端口就处于空闲状态了,又有些端口处于使能状态,这种情况下,为了保证MRTG记录流量的准确性,就要重新生成配置文件,以前我见网上介绍过一个方法,是通过复杂的shell编程实现的自动生成配置文件,其实有了祥子前面介绍的脚本大法,当网络设备的接口情况有所改变时,根据改变的端口生成新的网页并不是一件很难的事,一个脚本(包括一次生成多台交换机的配置文件、生成网页文件、合并网页文件)就搞定了,下面是具体实现步骤。
(一)解决在配置文件末尾添加"RunAsDaemon=Yes"语句的问题
其实生成配置文件没什么难的,但是每次生成配置文件以后都要手动往里面添加一行语句:"RunAsDaemon:Yes",当然我们也可以通过脚本来实现的,用最简单的echo语句即可
举个例子:
echo -e "RunAsDaemon:Yes" >>test
这条命令即可将RunAsDaemon:Yes添加到文本文件test的末尾。
(二)功能强大的脚本
这个脚本特别适合祥子单位的情况,即网络设备相对固定,但是网络接口经常改变的情况。
[root@jncatvrd6a bin]# more s3all
#!/bin/sh
htmdir=/usr/local/apache2/htdocs/mrtg/s3all/
htmdir1=/usr/local/apache2/htdocs/mrtg/s3all/192.168.3.1/
htmdir2=/usr/local/apache2/htdocs/mrtg/s3all/192.168.3.253/
htmdir3=/usr/local/apache2/htdocs/mrtg/s3all/172.19.96.2/
conf=/usr/local/mrtg-2/bin/cfg
rm -rf /usr/local/mrtg-2/bin/cfg/s3all.cfg
cd /usr/local/mrtg-2/bin && cfgmaker --global "WorkDir:$htmdir" --global "language:chinese" --output $conf/s3all.cfg --ifref=nr --ifdesc=descr --show-op-down --subdirs=HOSTNAME public@192.168.3.1 public@192.168.3.253 public@172.19.96.2
echo -e "RunAsDaemon:Yes" >>$conf/s3all.cfg
#mrtg /usr/local/mrtg-2/bin/cfg/s3all.cfg
mrtg $conf/s3all.cfg
indexmaker --output=$htmdirindex.htm $conf/s3all.cfg
然后再将这个脚本拷由到/etc/rc5.d中,改名为S33mrtg,即可。
长期的工作经验告诉我们,需求是最好的老师,我们在工作实际中发现了使用MRTG的默认配置所生成的监控结果中存在着一些问题,又通过继续的学习将这些问题一一解决了,既解决了问题,又学习了新的知识,以上是这一段时间对于MRTG学习过程的总结,写出来供大家参考。