标题：MRTG
简介
MRTG（Multi Router Traffic Grapher）是一套可用来绘出网络流量图的软件，由瑞士奥尔滕的Tobias Oetiker与Dave Rand所开发，此软件以GPL授权。[1]​
是一个监控网络链路流量负载的工具软件，通过snmp协议得到设备的流量信息，并将流量负载以包含PNG格式的图形的HTML 文档方式显示给用户，以非常直观的形式显示流量负载。
历史发展
MRTG最早的版本是在1995年春天所推出，以Perl所写成，因此可以跨平台使用，它利用了SNMP送出带有物件识别码（OIDs）的请求给要查询的网络设备，因此设备本身需支援SNMP。MRTG再以所收集到的资料产生HTML档案并以GIF或PNG格式绘制出图形，并可以日、周、月等单位分别绘出。它也可产生出最大值最小值的资料供统计用。[1]​
原本MRTG只能绘出网络设备的流量图，后来发展出了各种plug-in，因此网络以外的设备也可由MRTG监控，例如服务器的硬盘使用量、CPU的负载等。[1]​
最常用的管理协议就是简单的网络管理协议(SNMP，Simple Network Management Protocol)。而我们用的MRTG(Multi Router Traffic Grapher)就是通过SNMP协议实现管理工作站与设备代理进程间的通讯，完成对设备的管理和运行状态的监视。[1]​
特色
可移植性：目前可以运行在大多数 Unix 系统和 Windows 之上。 
源码开放：mrtg是用 perl编写的，源代码完全开放。 
高可移植性的SNMP支持：mrtg 采用了 Simon Leinen 编写的具有高可移植性的 SNMP 实现模块，从而不依赖于操作系统的SNMP模块支持。 
支持SNMPv2c：MRTG 可以读取 SNMPv2c 的64位记数器，从而大大减少了记数器回转次数。
可靠的接口标识：被监控设备的接口可以以IP地址、设备描述、SNMP对接口的编号及Mac 地址来标识。 
常量大小的日志文件：MRTG 的日志不会变大，因为这里使用了独特的数据合并算法。 
自动配置功能：MRTG 自身有配置工具套件，使得配置过程非常简单。 
性能：时间敏感的部分使用 C 代码编写，因此具有很好的性能。PNG格式图形：图形采用GD 库直接产生 PNG 格式。 
可定制性：MRTG 产生的 web 页面是完全可以定制的。
兼容性
mrtg软件可以运行在以下的操作系统上：
Linux 1.2.x, 2.0.x, 2.2.x, 2.4.x (Intel and Alpha and Sparc and PowerPC) 
Linux MIPS, Linux S/390 
SunOS 4.1.3 
Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8 
AIX 4.1.4, 4.2.0.0, 4.3.2 
HPUX 9,10,11 
WindowsNT 3.51, 4.0, 2k, XP
IRIX 5.3, 6.2 
BSDI BSD/OS 2.1, 4.x, 3.1 
NetBSD 1.5.x 
FreeBSD 2.1.x, 2.2.x, 3.1, 3.4, 4.x 
OpenBSD 2.x 
Digital Unix 4.0 
SCO Open Server 5.0 
Reliant UNIX 
NeXTStep 3.3 
OpenStep 4.2 
Mac OS X 10.1 
And about and other sensible Unix
MRTG的安装配置
安装支持软件这里以Rehat7.2为例子讨论MRTG的配置和安装。要安装MRTG需要安装以下软件包：GCC、Perl、gd、libpng和zlib。配置SNMP服务对于不同的设备，配置SNMP支持的方法是不一致的，具体请参考设备的随机文档，一般里面都有详细的介绍。这里讨论在Linux环境下配置SNMP服务器，以实现对本机流出流入数据的分析和报表。
为了配合mrtg使用，还要修改snmpd的配置，以使其允许mrtg读取其interface(网络接口) 流量数据。
vi /etc/snmp/snmpd.conf
将
#view systemview included mib2
的内容修改为：
view mib2 included .iso.org.dod.internet.mgmt.mib-2 fc
然后将
access notConfigGroup "" any noauth exact systemview none none
修改为：
access notConfigGroup "" any noauth exact mib2 none none
然后再重新启动snmpd：
/etc/rc.d/init.d/snmpd restart配置MRTG下一步就是要配置mrtg，实现对网络设备的监控。mrtg的配置信息都是保存在mrtg.cfg文件中的，创建该文件并且在其中定义希望的监控特性。幸运的是一般不需要直接手工编辑该配置文件，因为mrtg软件包提供有cfgmaker配置工具，这是一个脚本文件，根据运行参数可以自动生成mrtg.cfg配置文件。在mrtg源码目录的bin子目录下可以得到该工具。运行mrtg一旦生成正确的配置文件，就运行下面的命令：
/usr/local/mrtg-2/bin/mrtg /etc/mrtg.cfg
这将查询被监控的设备并在工作目录下创建初始的流量图和web页面，在前三次运行时可 能会报告遗失日志文件的告警信息，不要理睬这些信息，只需要连续运行三次以后再运行 就不会产生告警信息了。如果仍然出现告警那么就需要察看问题出在哪里了。
使用手工运行mrtg并不能定时产生适当的统计信息，因此最好还是定时自动运行mrtg来生 成统计信息，默认为五分钟运行一次。作为root身份crontab -e进入编辑状态，添加内容如下：
*/5 * * * * /usr/local/mrtg-2/bin/mrtg /etc/mrtg.cfg
或者在配置文件中加入：RunAsDaemon: yes以守护进程的方式运行，自动五份钟生成一次，就不用加ctrontab了。
显示中方时错误处理方法： A. 
看详细页时流量那里显示$1$2/秒。 
在英文下： 
In 935.6 kb/s (0.9%) 
Out 5306.4 kb/s (5.3%) 
可是在中文下显示： 
流入 935.6 $1$2/秒 (0.9%) 
流出 5306.4 $1$2/秒 (5.3%) 
vi /usr/local/mrtg/lib/mrtg2/locales_mrtg. pm 
找到sub gb2312下面： 
'([kMG]?)([bB])/s' => '\$1\$2/秒', 
'([kMG]?)([bB])/min' => '\$1\$2/分', 
'([kMG]?)([bB])/h' => '$1$2/时', 
改成： 
'([kMG]?)([bB])/s' => '$1$2/秒', 
'([kMG]?)([bB])/min' => '$1$2/分', 
'([kMG]?)([bB])/h' => '$1$2/时', 
重新运行一次： 
env LANG=C /usr/local/mrtg/bin/mrtg /etc/mrtg/mrtg.cfg 
再看： 
流入 935.6 kb/秒 (0.9%) 
流出 5306.4 kb/秒 (5.3%)
然后就可以通过浏览器访问地址http://192.168.0.1/mrtg/选择适当的接口地址察看流量信息了。
SNMP简介
SNMP元素①若干个需要被管理的网络设备节点，如路由器、服务器等设备，每个节点上都运行着一个称为设备代理(agent)的应用进程，其实现对被管理设备的各种被管理对象的信息如流量等的搜集和对这些被管对象的访问的支持；
②至少一个管理工作站，该管理站运行着管理平台应用系统，实现为管理员提供对被管设备的可视化的图形界面，从而使管理员可以方便的进行管理；
③一个管理协议，用来定义设备代理和管理工作站之间管理信息传送的规程。其中管理协议的操作是在管理框架下进行的，管理框架定义了和安全相关的认证,授权,访问控制和加密策略等各种安全防护框架。
在运行 TCP/IP 协议的互联网环境中，管理协议标准是简单网络管理协议(Simple Network Management Protocol,SNMP)，其定义了传送管理信息的协议消息格式及管理站和设备代理相互之间进行消息传送的规程。业界需求出于业界对网络管理协议标准化的迫切要求的驱动，IETF于1990发布了SNMPv1的正式RFC 文档；其设计思想重点放在保证协议的简单性、灵活性和可扩展性上，并希望把SNMP作为 一个过渡性的网管协议来作为实现对互连的网络设备进行管理时遵循的标准，待OSI的网 络管理协议—CMIP的开发、实现和标准化成熟和完善到可以在业界推广之后，再用CMIP来替换SNMP。但是由于各种的原因，CMIP并没有替代SNMP，而SNMP发展为业界的标准。
主版本
分别为SNMPv1 ，SNMPv2和SNMPv3。其中SNMPv2又分为若干个子版本，其中SNMPv2c应用最为广泛:SNMPv1是第一个正式协议版本，在RFC1155-RFC1158中定义，该版本采用了基于共同体 名的安全机制SNMPv2c这个版本被称为基于共同体名的SNMPv2，使用基于共同体名的安全机制和 SNMPv2p做出的协议操作方面的扩充，由RFC1901-RFC1906定义SNMPv3该协议版本采用基于用户的安全机制，其安全机制是在SNMPv2u和SNMPv2*基础上 进行大量的评议以后进行了更新，并且对协议机的逻辑功能模块的进行了划分而保证了良好的可扩充性，由RFC2271-RFC2275所定义。
SNMP管理系统及SNMP协议
使用SNMP协议的网络管理系统管理结构工作一般包括：管理进程通过定时向各个设备的设备代理进程发送查询请求消息(以轮询方式)，来跟踪各个设备的状态；而当设备出现异常事件如设备冷启动等时，设备代理进程主动向管理进程发送陷阱消息，汇报出现的异常事件。这些轮询消息和陷阱消息的发送和接受规程及其格式定义都是由SNMP协议定义的；而被管理设备将其各种管理对象的信息都存放在一个称为管理信息库（Management Information Base）库结构中。
其中SNMP协议是运行在UDP协议之上，它利用的是UDP协议的161/162端口。其中161端口被设备代理监听，等待接受管理者进程发送的管理信息查询请求消息；162端口由管理者进程监听等待设备代理进程发送的异常事件报告陷阱消息，如Trap。
设备的所有的需要被管理的信息被看作一个各种被管理对象的集合，这些被管理对象由 OSI 定义在一个被称作管理信息库(Management Information Base,MIB)的虚拟的信息库中。
管理对象库MIB
是一个按照层次结构组织的树状结构（定义方式类似于域名系统），管理对象为定义为树中的相应叶子节点。管理对象是按照模块的形式组织，每个对象的父节点表示该种对象属于上层的哪一个模块。而且OSI为树中每一层的每个节点定义唯一的一个数字标识， 每层中的该数字标识从1开始递增，这样树中的每个节点都可以用从根开始到目的节点的相应的标识对应的一连串的数字来表示，如1.3.6.1.2.1.1表示了MIBII中系统组子树,而 1.3.6.1.2.1.1.1.0表示系统组中的系统描述(sytem Descrption)对象。每个对象的一连串数字表示被称为对象标识符（Object Indentifier,OID）。
相关的一组对象的集合被定义为一个MIB模块。这些模块使用OSI的抽象语法标记 (Abstract Syntax Notation One，ASN.1)的一个子集写成。该子集被定义为管理信息结 构(Management Information，SMI)。
SNMP的消息在发送和传输时消息是采用基本编码规则（BER）对消息进行编码。
SNMP基本的标准MIB库是MIBII，具体请参考RFC 1213。
SNMP协议操作
SNMP提供有三类操作，分别为Get，Set和Trap。
Get操作实现对被管理对象所表示的管理信息的读操作。在SNMPv1中，GET操作具体一共有 两种形式
Get和GetNext操作： Get操作指示直接读取操作参数指定的OID所表示的被管理对象的管 理信息值。GetNext操作指示读取操作参数指定的OID所表示的被管理对象在MIB树中按照 字典顺序的下一个被管理对象的管理信息的值。在SNMPv2中，增加了一种GetBulk操作， 其是Get和GetNext的综合，是为了提高对被管理信息的访问的效率而增加的。
Set操作实现对被管理对象的管理信息进行写操作，其实现直接对操作参数指定的OID所表示的被管理对象对应的管理信息的值的设置。
前面几种消息是由管理工作站主动实现对被管理设备进行轮询访问时发出以得到被管理设 备的各种信息；而在被管理设备出现异常事件需要及时向管理工作站报告时，就需要Trap 操作，该操作实现被管理设备向管理工作站报告设备上出现的异常事件，如网络接口出现故障或恢复工作，设备重新启动等信息。另外在SNMPv2中新增加了一种Inform操作来实现 管理站与管理站之间的通信。
其中上述操作的消息都可以在操作参数中一次指定一个或多个管理对象OID信息，也就是说一个消息一次可以实现对多个被管理对象的操作。
SNMPv1和SNMPv2c
管理站和被管设备上都存储有该充当密码作用的共同体名；消息发送者(一般是管理者)在 要发送的消息中的共同体名字段中填入对应于接收者的共同体名，然后以明文方式在网络 上发送消息，接收方(被管理设备)接收到消息以后，如果消息格式是正确的，则读取该字 段，与自身保存的共同体名相比较，来实现对发送消息者的认证。在一些实现中，对应于 每个共同体名还有一个机器地址列表，来表示只有地址在这个列表中的机器使用该共同体 名发送的消息才认为是可信的。这里的共同体名就担任密码的作用。同时对应于每个共同 体名都有一个访问控制权限，可能值为读或读写。只有请求的操作和使用的共同体名的权 限一致才允许进行。
详细情况请参考RFC 1157、RFC 1902、RFC 2273、RFC 2274。