使用 Linux 进行网络管理与监控
在当今世界,所有的计算都围绕着网络的概念进行,系统管理员的工作变得越来越繁重。他们的任务是维护路由器、集线器、服务器以及网络中每个关键设备的可用性。
管理者希望监控网络设备的原因有很多:带宽利用率、链路的运行状态、瓶颈、电缆或设备之间路由信息分布的问题等等。监控网络活动也是发现安全问题和不良行为的一个很好的起点。
在许多情况下,一个组织的网络包括到远程网络(WAN)或互联网的昂贵链路,其成本可能基于流量。因此维护通过这些链路的流量统计数据非常重要。这在欧洲很常见,因为 X.25 链路仍然很普遍。这些链路的收费是基于发送和接收的数据包数量。
其他类型的链路,如点对点或帧中继,通常按固定费率收费。对于这些链路,电信公司确保的带宽非常重要,需要进行监控。
在本文的最后一部分,我们将重点介绍一种旨在监控路由器接口流量的工具,它能以图形化的方式很好地展示这些信息。它可以很容易地修改以监控其他类型的信息。
满足所有这些需求的是一种名为简单网络管理协议 (SNMP) 的协议。SNMP 设计于 80 年代,最初的目的是通过一个简单的设计,尽可能减少对网络的压力,从而集成不同类型网络的管理。
SNMP 在应用层使用 TCP/IP 传输层协议运行,因此它可以忽略底层网络硬件。这意味着管理软件使用 IP,因此可以控制任何连接网络上的设备,而不仅仅是连接到其物理网络的设备。这也存在缺点:如果两个设备之间的 IP 路由无法正常工作,则无法访问目标进行监控或重新配置。
SNMP 架构中有两个主要元素:代理和管理器。它是一个客户端-服务器架构,其中代理是服务器,管理器是客户端。
代理是一个在网络中每个被监控或管理的节点上运行的程序。它提供了一个接口,可以访问其配置的所有项目。这些项目存储在一个名为管理信息库 (MIB) 的数据结构中,我们稍后会解释它。它是服务器端,因为它维护着被管理的信息,并等待来自客户端的命令。
管理器是在网络的监控站中运行的软件,其作用是联系网络中运行的不同代理,轮询其内部数据的值。它是通信的客户端。
SNMP 命令集中有一个特殊的命令叫做 trap,它允许代理将未经请求的数据发送给管理器,以通知它事件,如错误、关闭等。
本质上,SNMP 是一个非常简单的协议,因为它执行的所有操作都涉及获取和存储的范例,这使得命令集很小。管理器只能对代理执行两种不同的操作:请求或设置代理 MIB 中变量的值。这两种操作被称为 get-request 和 set-request。还有一个命令来响应 get-request,称为 get-response,它只被代理使用。
协议的可扩展性与 MIB 存储新项目的能力直接相关。如果制造商想向路由器等设备添加一些新命令,他必须将适当的变量添加到其数据库 (MIB) 中。
几乎所有的制造商都在他们的设备(路由器、集线器、操作系统等)中实现了 SNMP 代理的版本。Linux 也不例外,可以在互联网上找到公开可用的 Linux SNMP 代理。
SNMP 对身份验证方案的支持非常有限。它只支持一个双密码方案。 public 允许管理器请求变量的值, private 允许设置这些值。SNMP 中的这些密码被称为 communities。连接到 SNMP 管理网络的每个设备都必须配置这两个 community。通常将 public community 设置为 “public”,将 private community 设置为 “private”,但非常重要的一点是要更改这些值,以反映您组织的安全策略。
SNMP 为协议管理的数据定义了一个单独的标准。该标准定义了网络中设备维护的数据以及允许对这些数据执行的操作。数据以树的形式结构化,并且存在到达每个变量的唯一路径。这个结构化的树被称为管理信息库(MIB),并在多个 RFC 中记录。
TCP/IP MIB 的当前版本是 MIB-II,在 RFC-1213 中定义。它将 TCP/IP 设备应维护的信息分为八类(如表 1 所示),并且此信息中包含的每个变量必须属于其中一类。
特定项目的 MIB 定义还指定了它可以包含的数据类型。通常,MIB 的项目可以存储单个整数,但它们也可以包含字符串或更复杂的结构,如表。MIB 中的项目称为对象。对象是 MIB 树的叶节点,但一个对象可以有多个实例——例如,一个表对象。要引用对象中包含的值,必须添加实例的编号。当一个对象只有一个实例时,它是 0 实例。
例如,来自“interfaces”类别的对象 ifNumber 包含一个整数,表示该设备中存在的接口数量,但来自“ip”类别的对象 ipRoutingTable 包含该设备的路由表。
请记住使用实例的编号来检索对象的值。在这种情况下,可以使用实例 ifNumber.0 查看路由器中存在的接口数量。
对于表对象,必须使用表的索引作为最后一个数字来指示特定的实例(表的行)。
还有另一个定义和识别 MIB 变量的标准,称为管理信息结构 (SMI)。SMI 指定 MIB 变量必须以 ISO 形式语言 ASN.1 声明,该语言使这些变量的形式和内容明确。
ISO 命名空间位于全局命名空间内,该全局命名空间还包含其他标准组织的树。在 ISO 命名空间内,有一个用于 MIB 信息的特定树。在该 MIB 树部分中,有来自所有协议和应用程序的对象的区域,以便可以明确地表示它们的信息。
图 1 显示 TCP/IP MIB 命名空间位于 IAB 的 mgmt 命名空间下方。层次结构还为每个级别指定了一个数字。
重要的是要注意,大多数软件需要前导点(根)才能在 MIB 中找到对象。如果不包含前导点,则它会假定一个从 .iso.org.dod.internet.mgmt.mib-2 的相对路径。
这样,来自“interfaces”类别的对象 ifNumber 可以命名为
.iso.org.dod.internet.mgmt.mib-2.interfaces.ifnumber
或者它的数字等价物
.1.3.6.1.2.1.2.1以及实例为
.iso.org.dod.internet.mgmt.mibxi-2.interfaces.ifnumber.0或者它的数字等价物
.1.3.6.1.2.1.2.1.0随着供应商创建和发布合适的 RFC,可以将其他 MIB 添加到此树中。
一个名为 SNMPv2 的新规范正在积极开发中。它通过关注隐私、身份验证和访问控制的机制来解决实际协议缺乏安全性的问题。它还允许更复杂地指定变量,并具有一些额外的命令。SNMPv2 的问题是它仍然不是一个普遍接受的标准,不像 SNMPv1。不容易找到 SNMPv2 版本的代理和软件来利用新命令。让我们看看在不久的将来会发生什么……
最流行的 SNMP 包之一是 CMU-SNMP。它最初由卡内基梅隆大学设计,已被 Juergen Schoenwaelder 和 Erik Schoenfelder 移植到 Linux。它完全符合 SNMPv1 标准,并包含 SNMPv2 的一些新提出的功能。
该发行版包含一些管理器工具,允许以命令行样式向运行 SNMP 代理的设备发送请求。它还包含一个 SNMP 代理程序,旨在在 Linux 下运行,为网络(或同一系统)上运行的管理器提供有关接口状态、路由表、运行时间、联系信息等的信息。
CMU-SNMP 附带的一个非常有价值的附加组件是 SNMP C-API,它允许程序员基于发行版的网络功能构建更复杂的管理工具。
在 Linux 系统上安装很容易,但与原始 CMU 发行版略有不同。该发行版带有管理器工具、守护程序和 API 库的预编译二进制版本。
首先,您必须决定是获取二进制发行版还是源代码发行版。很容易在互联网上找到该软件包(查看资源侧边栏)。二进制发行版可以在 2.0 内核系列上干净地运行,并且是基于 ELF 的。我们将解释如何安装二进制发行版。一个好的做法是从受信任的站点获取二进制发行版,以避免病毒、特洛伊木马式攻击和其他安全问题。
将文件 cmu-snmp-linux-3.2-bin.tar.gz 放在 Linux 系统的根目录 (/) 中,并使用命令解压缩它
gunzip cmu-snmp-linux-3.2-bin.tar.gz
然后,使用命令将发行版解压缩到其最终位置
tar xvf cmu-snmp-linux-3.2-bin.tar现在,除了 SNMP 代理配置文件 /etc/snmpd.conf 之外,所有实用程序和库都已正确安装在您的系统上。您可以通过运行脚本来创建它
/tmp/cmu-snmp-linux-3.2/etc/installconf具有以下选项
/tmp/cmu-snmp-linux-3.2/etc/installconf -mini <password>其中 password 是您想要使用的 public community。现在您可以编辑新安装的配置文件 /etc/snmpd.conf。在其中,您可以更改代理使用的 UDP 端口、systemContact、systemLocation 和 systemName 变量以及网络卡和 PPP 端口的接口速度参数的值。
您获得的最重要的管理工具是
/usr/bin/snmpget 一种用于请求网络中代理(路由器、集线器等)的 MIB 中的具体值的工具。
/usr/bin/snmpgetnext 它允许您获取 MIB 树中的下一个对象,而无需知道其名称。
/usr/bin/snmpset 一种在远程代理中设置值的工具
/usr/bin/snmpwalk 无需指定确切实例即可请求完整对象或一系列对象的工具。它对于请求表对象很有用。
/usr/bin/snmpnetstat
/usr/bin/snmptrapd 侦听代理发送的陷阱的守护程序
/usr/bin/snmptest 用于演示 API 功能的交互式工具。
代理位于 /usr/sbin/snmpd 目录中。
CMU-SNMP 还在 /usr/lib/mib.txt 中安装了一个 MIB 文件。这是一个很好的参考,可以搜索我们可以从设备请求的信息。
代理必须在启动时运行,并且可以通过在系统启动文件(例如 /etc/rc.d/rc.local)中添加以下行来设置:
/usr/sbin/snmpd -f ; \ echo 'starting snmpd'
一旦您的 Linux 系统运行了 SNMP 代理,您就可以使用管理工具对其进行测试,输入:
/usr/bin/snmpget -v 1 localhost \ public interfaces.ifNumber.0这将返回系统中配置的网络接口的数量,而:
/usr/bin/snmpwalk -v 1 localhost \ public system将返回 MIB 系统子树中的所有值。(有关此命令的输出,请参见图 2。)
C-API 位于 /lib/libsnmp.so.3.1。
您可以按如下方式检查相关的头文件:
/usr/include/snmp/snmp.h
/usr/include/snmp/snmp_impl.h
/usr/include/snmp/asn1.h
/usr/include/snmp/snmp_api.h
更多信息请参阅 man 手册 snmp_api(3) 和 variables(5)。
还有一个 Perl 扩展模块可以与 CMU C-API 接口,从而可以轻松地在 Perl 脚本中集成对该库的调用。
MRTG 是 Tobias Oetiker 和 Dave Rand 编写的高级工具,用于以图形方式表示 SNMP 代理提供给 SNMP 管理器的数据。 它会生成漂亮的 HTML 页面,其中包含有关网络接口中传入和传出流量的 GIF 图形,并且 几乎 是实时的。 这抽象了使用像 CMU-SNMP 这样的命令行工具直接处理 MIB 对象的概念。 这是我在互联网上找到的用于监控我的路由器的最简单和最强大的工具。
MRTG 使用完全用 Perl 编写的 SNMP 实现,因此无需安装其他软件包。 主程序是用 C 编写的,以加快日志记录过程和 GIF 图像的生成速度。 这些图形是在 Thomas Boutell(WWW FAQ 的作者)的 GD 库的帮助下生成的。
MRTG 的亮点之一是其可扩展性和强大的配置。 很容易监控任何 SNMP 变量,而不是流量,例如错误数据包、系统负载、调制解调器可用性等。 甚至可以从外部程序导入数据来提供数据,因此您可以使用它来监控登录会话和其他无法通过 SNMP 获取的信息。
它附带了一些工具来监视路由器中的接口,提取其特征,并生成一个基本配置文件,您可以轻松地对其进行调整以满足您的需求。
MRTG 的另一个有趣的功能是它生成的信息量。 它允许每个接口具有四个详细程度:过去 24 小时的流量、过去一周的流量、过去一个月的流量以及年度图形。 这使您可以收集信息以用于统计目的。 它借助合并算法维护一个包含所有这些信息的累积数据库,该算法可防止日志中的数据占用您的磁盘空间。
它还生成一个主页面,其中包含路由器每个接口每日详细信息的 GIF 图像,这使您可以一目了然地了解路由器中发生的情况。 您可以在图 3 和图 4 中看到 MRTG 生成的主页面和详细页面。
让我们看看一个基本的安装过程。 首先,您需要 MRTG 的发行版。 在撰写本文时,最新版本是 2.1; 请查看参考侧栏中的 URL 以获取最新版本。
在编译 MRTG 之前必须安装的一个软件包是 GD 图形库。 该 URL 也位于参考侧栏中。 GD 的当前版本是 1.2,您应该不会在编译和安装它时遇到任何问题。 只需在解压发行版的目录中运行 make,就会生成一个名为 libgd.a 的文件。 将此文件复制到 /usr/local/lib,并将所有 .h 文件复制到目录 /usr/local/include/gd。
此时,您应该已经启动并运行了 GD。 现在是构建 MRTG 包的时候了。 解压发行版,并编辑 Makefile,指示在哪里可以找到 GD 库和头文件,以及 Perl 5.003 二进制文件,通常是 /usr/bin/perl 或 /usr/local/bin/perl。 这是通过变量 GD_LIB、GD_INCLUDE 和 PERL 完成的。
通过键入 make rateup 来构建主程序,并且在编译完成后,输入 make substitute 以在 MRTG 使用的 Perl 脚本集中包含到 Perl 解释器的正确 PATH。
将以下文件复制到二进制文件的最终目标位置(例如,/usr/local/mrtg):BER.pm、SNMP_Session.pm、mrtg 和 rateup。 您也可以将两个配置程序 indexmaker 和 cfgmaker 复制到此位置。
确保所有程序都设置了执行位。 现在我们准备构建一个简单的配置文件。 此时,您应该具有对路由器的 SNMP 读取权限。 在 Cisco 路由器中,允许这样做的配置行如下:
access-list 99 permit 193.147.0.8 access-list 99 permit 193.147.0.9 access-list 99 permit 193.147.0.130 snmp-server community public RO 99
这允许使用“public”作为密码(community)从访问列表 99 中指定的地址发出只读请求。 如果您希望允许网络中的每个节点对路由器具有只读 (RO) 访问权限,您可以拥有如下行:
snmp-server community public RO如果您有其他品牌的路由器,请查阅手册以确定如何允许对它们进行 SNMP 访问。
cfgmaker 脚本大大简化了构建配置文件的任务。 您所要做的就是使用以下参数运行它:
cfgmaker <community>@<router-host-name or IP>
例如:
cfgmaker public@mec-router.rediris.es > mrtg.cfg它将发现路由器中的每个接口,并在文件中写入一个部分,其中包含接口数量、最大速度、描述等规范,以及一些 HTML 标记以将它们包含在详细信息页面中。 可以编辑此 HTML 布局以适合您的语言、偏好等。 您可以在 图 5 中看到我的路由器的一个接口的输出。
现在您可以第一次运行 mrtg 程序。 简单地执行:
./mrtg mrtg.cfg
如果一切顺利,它将联系您的路由器,请求一些值,并在当前目录中生成一些日志文件和几个 GIF。 不要担心关于找不到日志和图形的投诉,因为这只会发生第一次。 删除图形并再次运行该程序。 生成的图形显示自您上次运行该程序以来的时间间隔内的流量。 它还为每个接口生成 HTML 页面。
现在是指导 MRTG 在您的系统中正确运行的时候了。 首先,在您的 Web 服务器的 Document Root 下创建一个目录(假设您在同一系统上运行 Web 服务器)以容纳 MRTG 每次运行时将生成的页面和图形。 将此目录添加到配置文件的顶部,指令为 WorkDir: /usr/local/web/mrtg(假设您的 Document Root 位于 /usr/local/web)。 下次 MRTG 运行时,它将在此目录中创建日志和图形,从而允许您通过 http://your_host.domain/mrtg 访问它们。
现在,您想要构建一个像图 3 中所示的包含所有接口的主页面。 这无法使用 indexmaker 工具完成。 运行:
indexmaker mrtg.cfg <router-name regexp> > /usr/local/web/mrtg/index.html
它将生成一个 HTML 页面,其中包含路由器名称与先前正则表达式匹配的接口的每日图形,并链接到其单个详细信息页面。
正如您可以想象的那样,必须定期运行 MRTG 程序,以收集每个时间间隔的数据并定期生成图形,以便保持实时监控的错觉。 这是通过 crontab 中的以下行完成的(假设 /usr/local/mrtg-bin 作为 mrtg 程序的最终目标):
0,5,10,15,20,25,30,35,40,45,50,55 * * * * \ /usr/local/mrtg-bin/mrtg \ /usr/local/mrtg-bin/mrtg.cfg > \ /dev/null 2>&1
在 Red Hat 发行版中,要附加到 /etc/crontab 文件的正确行是:
0,5,10,15,20,25,30,35,40,45,50,55 * * * * root \ /usr/local/mrtg-bin/mrtg \ /usr/local/mrtg-bin/mrtg.cfg >\ /dev/null 2>&$如果一切正常,您可以花一些时间调整您的配置和 HTML 索引页面。 一个很好的增强是在索引页面的 <HEAD> 部分中包含一个 <META .....>,以强制浏览器每 300 秒重新加载一次,以保持屏幕上的最新信息。
您可以在配置文件中包含的另一个增强功能是 WriteExpire 指令,该指令强制 MRTG 为每个 GIF 和 HTML 页面创建 .meta 文件,从而消除了代理服务器和浏览器不必要的缓存时间。 为了使此功能正常工作,您还必须配置您的 Apache 服务器(假设您运行 Apache Web 服务器)以读取这些 .meta 文件,并使用 XXXX 文件中的 MetaDir 指令发送正确的“Expire”标头。
您可以在发行版的示例配置中查找其他指令; 它有非常好的文档。 可以更改 MRTG 生成的图像和页面的所有布局。
我希望您喜欢这个程序。 如果您喜欢,请给作者发送一张明信片; 您可以在 MRTG 主页上找到他们的地址。
有一个类似的程序,称为 Router-Stats,由著名的 tin 新闻阅读器的作者 Iain Lea 编写。 Router-Stats 每天更新一次图形,并显示关于每小时使用情况和其他方面的非常有趣的统计信息。 Router-Stats 的一个问题是它使用了大量的外部程序来完成其工作(CMU-SNMP 用于 SNMP 任务,GNUPLOT 用于绘制图形,NetPBM 用于进行一些图形转换,GIFTOOL 用于将它们转换为最终的 GIF)。 您可以在参考侧栏中查看 Router-Stats 的 URL。
还有另一类软件在网络管理任务中更进一步,并为整个网络的监控和维护不同配置提供了一个完整的解决方案。 这种解决方案允许我们绘制我们网络的复杂图形表示,并浏览节点,检查配置的特定项目和其他有趣的功能。
在这个层面上,我们可以讨论两种广泛使用的商业解决方案:Hewlett-Packard 的 HP-OpenView 和 Sun 的 SunNet Manager。 它们提供了一个完整的平台,用于通过出色的图形界面管理网络的所有资源。 它们还附带网络发现工具,用于查找所有运行 SNMP 代理的网络元素,以及用于存储从网络收集的所有数据以进行统计目的的数据库。 这些环境的一个重要功能是它们能够与其他供应商的更具体的产品集成,例如 Cisco 的 CiscoWorks,它允许网络管理员维护包含其所有路由器配置的数据库,甚至以图形方式监控其路由器的后面板及其所有连接。
这些产品有两个缺点:它们是商业软件,并且没有 Linux 端口。当然,也有一些公有领域的解决方案可以完成这些任务。我发现最好的软件包之一是 Scotty。Scotty 是一个基于 TCL 的软件包,它允许你使用高级的、基于字符串的 API 来实现特定站点的网络管理软件。它的配套产品 Tkined 是一个网络编辑器,它提供了扩展来构建一个完整的框架,集成了设计用来发现 IP 网络、支持网络布局过程或使用 SNMP 结合其他标准工具(例如,traceroute)来排除 IP 网络故障的工具。Scotty 还包括一个图形化的 MIB 浏览器,允许你浏览 MIB 信息。
您可以查看参考文献列表,以获取商业和公有领域网络管理软件的链接。
SNMP 是一个简单但强大的协议,它可以帮助我们以较小的网络压力来监控我们的资源。现在正在开发的扩展可能会增加此工具的复杂性和功能,但它们也会增加实施它们所需的资源。
在本文中,我们探讨了在网络上找到的几个工具。每天都有大量的工具被开发出来。您可以查看 Usenet 新闻组 comp.protocols.snmp,以获取有关新软件和 MIB 的公告。
