在 LAN 上自动化 IP 主机数据收集
Linux 的敏捷性和强大功能激发了针对特定任务的高效工具的设计和实施。在数据网络上,工程师和管理员欣赏 Linux 可以轻松灵活地作为数据收集、分析和处理平台的实施。在本文中,我将演示实施 ACEDB(面向对象的数据库)和一些其他工具的技术,以提供对您可能已经在网络上收集的行政数据的全面访问。
TCP/IP 局域网的管理通常需要持久地努力控制地址空间。随着组织结构和数据流的变化,工作站、服务器和托管子系统(路由器、防火墙等)都会添加到网络中或从网络中移除。然而,记住哪台机器分配给特定的 IP 地址并不总是像维护最新的 IP 地址到节点分配列表那样简单。即使在最佳情况下——包括 DHCP、BOOTP、无处不在的 SNMP 和托管中继器端口——有时网络架构也会在没有适当文档的情况下发生变化。然而,跟踪 IP 地址分配非常重要。由于 IP 子网的逻辑地址空间有限,因此回收 IP 地址是必须的。当在 LAN 上执行数据分析(指标收集、故障排除、安全审计等)时,了解负责特定数据包生成实例的机器类型也很有用。自动化此信息的收集和访问将大大有助于回收丢失或未知的管理数据。
如果您尚未发现 Arpwatch(可通过匿名 ftp 在 ftp://ftp.ee.lbl.gov/arpwatch.tar.Z 获取),请允许我向您介绍一下。从 Arpwatch 的手册页中,“Arpwatch 跟踪以太网和 IP 地址配对。它记录活动并通过电子邮件报告某些更改。” Arpwatch 使用 libpcap API (ftp://ftp.ee.lbl.gov/libpcap.tar.Z) 监听和捕获本地以太网接口上的 ARP(地址解析协议)请求和回复。
RFC 826 介绍了地址解析协议的起源,但您可能会在您最喜欢的网络手册中找到更最新的描述。对于本专栏的目的,ARP 是逻辑 TCP/IP 子网上的任何机器确定同一逻辑子网上任何其他机器的以太网地址(有时称为硬件或 MAC(强制访问控制)地址)的方法。关于 LAN 上单播数据通信的 ARP 为“发送节点”提供“接收节点”的以太网地址——这是成功完成通信事务必不可少的信息。发送节点生成 ARP 请求,这是一个网络上所有机器都能听到的广播,要求分配了特定 IP 地址的机器以其以太网地址进行响应。ARP 回复来自拥有特定 IP 地址的机器,并包含其自身的以太网地址作为对查询的答案。
Arpwatch 监听网络上机器之间发生的 ARP 对话,从对话中提取以太网地址、IP 地址配对,并将结果与时间戳一起存储在本地表中。随着 ARP 随时间推移而发生,此表不断增长,以表示网络上可用节点的准确列表。Arpwatch 将机器的以太网地址与网络接口的供应商描述列表进行交叉引用,格式化其发现的报告,最后,通过电子邮件发送报告或将其打印到 STDERR,如下所示
From: arpwatch (Arpwatch) To: root Subject: new station (node.yourdomain.com) hostname: node.yourdomain.com ip address: 192.168.10.10 Ethernet address: 0:a0:24:56:c4:3a Ethernet vendor: 3com timestamp: Sunday, May 9, 1999 11:16:57 -0400
Arpwatch 仅处理从其监听接口参与的同一逻辑网络收集的信息。即使 LAN 的设计使得不同的子网共享同一物理线路进行数据传输,情况也是如此。从多个逻辑子网收集数据需要执行 Arpwatch 的单独实例,每个逻辑子网一个实例,每个实例都绑定到自主网络接口。由于 Linux 允许同一系统驻留多个网络接口(参考“关于将多个以太网适配器与 Linux 一起使用的 Mini-HOWTO”),因此可以在单个盒子上方便地完成此操作。一台配备 Intel 486 DX-2 66 处理器和 ISA 总线的普通 PC 可以轻松地从多个繁忙的子网收集数据。相反,由于 Linux 和 Arpwatch 都很容易获得,因此如果需要,可以为每个子网建立多个 Arpwatch 收集站。
通常,Arpwatch 配置为通过 sendmail 分发其收集的信息。这可以很好地作为网络基础设施内或网络基础设施新增内容的警报机制,但 Arpwatch 报告的实用性因此仅限于以静态电子邮件消息表达此信息。当然,可以搜索和存档这些报告,但是将 Arpwatch 收集的信息处理并导入数据库不是很有用吗?这样,Arpwatch 的报告可以补充节点的责任人、其物理位置、其操作系统、其主要功能或任何其他有用的属性的描述。
ACEDB 数据库系统由 Richard Durbin 和 Jean Thierry-Mieg 创建,旨在为复杂数据集提供灵活和动态的存储介质,以支持他们的生物研究。ACEDB 的灵活性在于它允许存储各种不同类型的数据。它的动态性在于数据库的结构很容易修改,因为数据随着时间的推移被不同地理解,或者随着数据的形状发生变化,例如通过添加新属性或新数据类型。ACEDB 也是面向对象的,这意味着系统内数据的组织保留了每个单独数据对象在现实世界中的独特性和自主性。ACEDB 数据库中的数据很容易访问,因为它没有被切分成组成部分并存储在关系表中。与许多经典的关系数据库或对象关系数据库管理系统中的典型情况相比,这提供了更直观的数据访问。不要太执着于 ACEDB 的“面向对象”标签。ACEDB 对对象的偏爱仅仅意味着创建和理解不同类型数据之间的复杂关系很容易。
ACEDB 很容易在 Linux 中实现。您可以在 ftp://ftp.ncbi.nlm.nih.gov/repository/acedb/ace4/ 的索引中找到最新的发行版。获取 INSTALL 脚本的副本并检查 NOTES 和 README 文件以获取新闻和安装说明。下载 ACEDB 数据库和服务器的二进制发行版,每个发行版都已针对 libc6 预编译。
与 Linux 一样,ACEDB 也享受了开源软件产品特有的协作工程和开发的优势。ACEDB 项目的主要贡献者之一是 Lincoln Stein,他最出名的是他作为 Perl-based CGI 脚本的 CGI.pm 模块的作者的工作。Stein 先生创建了 Jade,这是一个基于 Java 的 ACEDB 和 Java 编程语言之间的接口。他还编写了一个屡获殊荣的面向对象的 Perl 接口 AcePerl,用于 ACEDB。AcePerl 提供了连接和更新 ACEDB 数据库、执行查询、获取对象和其他管理任务的功能。为了配合 AcePerl,Stein 先生创建并发布了 AceBrowser,这是一小组 CGI 脚本,可与 AcePerl 一起工作,以便轻松创建任何 ACEDB 数据库的 Web 可浏览界面。在本专栏中,我们将使用 AcePerl 和 AceBrowser 来构建、查看和修改 Arpwatch 收集的 IP 主机数据数据库。您可以在 http://stein.cshl.org/ 找到 AcePerl 和 AceBrowser 最新版本的链接。下载这些发行版并确保您的本地 Perl 是最新的(perl -v 应报告版本 5.004_04 或更高版本)。此项目的目标之一是使 ACEDB 数据库中存储的数据可通过 Web 访问,因此您还需要 Web 服务器。当然,Apache Web 服务器可以从 https://apache.ac.cn/ 免费获得。最后,AceBrowser 引用了 CGI.pm,因此请确保您已安装版本 2.46 或更高版本。CGI.pm 可在 http://stein.cshl.org/WWW/software/CGI/ 获得。
我们将使用 Linux 构建一个单一系统,该系统充当 Arpwatch 收集站(用于在 ACEDB 数据库中存储收集的数据的平台)、ACEDB 服务器和 Web 服务器,以便从网络上的任何位置提供对此数据的自然访问。
通过 INSTALL 脚本安装 ACEDB 发行版。ACEDB 配备了图形化 (xace) 和基于文本的 (tace) 前端,每个前端都提供对系统的轻松访问。访问 ACEDB 数据库就像从 ACEDB 安装的顶层目录运行 acedb 脚本并使用 GUI 导航数据结构一样简单。尽管 ACEDB 功能强大且高度可定制,但在开始之前必须了解其他一些事项。
在 ACEDB 安装中,/wspec 目录中文件的内容定义了 ACEDB 环境——从 xace 的 GUI 界面的外观和本地磁盘上缓存空间的分配到数据结构的内部定义。依赖于这些文件中提供的默认值,并验证您的用户名是否包含在 passwd.wrm 文件中的授权用户列表中。理解 ACEDB 并开始使用的关键来自于对 models.wrm 文件的检查,该文件也称为“模型文件”。模型文件是一个模板,它定义了数据库中对象的结构以及对象之间存在的关系。ACEDB 数据库中的每个对象都有一个类和一个名称。对象的类描述了对象的类型,对象的名称用于唯一标识对象。使用 ACEDB 行话,我可以将自己描述为类“person”的对象,名称为“Joe”。或者,如果我正在为一家公司构建人事数据库,那么将我自己描述为类“Engineer”的对象,名称为“NasalJS”,例如,可能更有用。我可以通过在对象“NasalJS”上附加一个名为“Full_name”的标签,值为“Joseph S. Nasal”,以及一个名为“Birthday”的标签,值为“06June1969”,从而使对象“NasalJS”更有用,这样使用我的数据库的人就可以了解关于“NasalJS”的一些附加信息。ACEDB 对象就是这样构建的,具有标签和值的树状层次结构。对象文件的内容(称为模式)表示 ACEDB 数据库中每个对象类的通用结构(或形式),包括用于构建对象并赋予其含义的标签。
模式可能很复杂(就像 ACEDB 最初编写的基因组序列数据库一样),也可能很简单,具体取决于数据和应用程序的要求。我们将从一个非常简单的模式开始,以表示通过 Arpwatch 收集的数据。我们可以使用 Arpwatch 报告的格式来建议我们的 ACEDB 对象的结构,并创建一个如下所示的模式
?Host host_name UNIQUE Text ip_address UNIQUE Text ethernet_address current_ea UNIQUE Text previous_ea Text ethernet_vendor current_ev UNIQUE ?EtherType XREF participating_nodes previous_ev Text timestamp current_ts UNIQUE Text previous_ts Text delta_ts Text ?EtherType participating_nodes ?Host XREF ethernet_vendor
此模式定义了两个对象类,Host 和 EtherType(类使用语法 ?Classname 标识)。在 Host 类中,host_name 标签已构建为包含文本值,该文本值由大写指令 UNIQUE 进一步描述。因此,在类 Host 的对象中,host_name 标签将包含文本并且最多只有一个数据值。类似地,ip_address 标签也使用 UNIQUE 指令,并且可能只包含 Text 类型的数据。请注意,标签 ethernet_address、ethernet_vendor 和 timestamp 都是复杂数据类型,它们由各自的子标签进一步描述。
ACEDB 数据库可以使用其他数据类型(例如 Int、Float 和 DateType),但我们将保持简单,并将所有 Arpwatch 数据视为纯文本。除了 UNIQUE 之外,还有其他指令可用。在此示例中,XREF 指令用于在 Host 类中的 current_ev 子标签和 EtherType 类中的 participating_nodes 标签之间建立交叉引用关系。这样做的效果是构建共享通用网络接口供应商的 Host 对象列表。
为了测试此模式,我们可以通过 acedb 脚本启动 xace 并加载包含示例数据的平面文件,如列表 1 所示。在此示例文件中,对象由空行分隔,并且每个对象的每个标签都占用自己的行。请注意,当为复杂数据类型提供值时,只需要指定最右边的子标签。要测试模式,请将此数据保存在 ACEDB 安装的顶层目录中扩展名为 .ace 的文件中。编辑 /wspec 目录中 layout.wrm 文件的内容以包含两行,第一行是 Host,第二行是 EtherType,以便 xace 默认在 GUI 中显示这些示例对象。启动 xace 并通过选择“编辑”和“读取 .ace 文件”来导入数据文件。打开数据文件并读取数据后,使用 GUI 导航数据集。观察对象是如何按照模型文件中建立的模板呈现的,包括类 Host 的对象和类 EtherType 的对象之间交叉引用关系的结果。
在实时系统中,我们将使用 AcePerl 将 Arpwatch 记录直接导入数据库。第一步是将 Arpwatch 的输出捕获到文件中。Arpwatch 的手册页上写着,“使用 -d 标志启动 Arpwatch 会禁止分叉到后台并发送电子邮件报告。相反,它们被发送到 STDERR。” 使用重定向,我们可以将 Arpwatch 的报告保存到文件中,如下所示
arpwatch -d > report.data
Perl 是提取记录数据和构建数据库的完美工具。在列表 2 中,您将找到利用 Stein 先生的 AcePerl 模块连接到本地机器上端口 20000100 上侦听的 ACEDB 服务器的代码。连接到服务器后,脚本会进入从数据文件中获取 Arpwatch 记录的循环。当构建完整的记录后,while 循环中的最后一个“else”条件会调用“process”子例程来更新数据库。首先,子例程删除不必要的空格并检查 $host_name 是否包含字符串 <unknown>(如果 Arpwatch 无法解析与节点 IP 地址关联的名称,则将其标记为 <unknown>)。由于我们将使用 $host_name 中的数据来命名 ACEDB Host 对象,因此代码会将 <unknown> 转换为基于时间戳和当前以太网地址的唯一标识符。
接下来,使用 $host_name 中的数据和 AcePerl 的 fetch 方法来查看是否存在相应的 Host 对象。如果不存在,则使用 AcePerl 的 new 方法创建一个新的 Host 对象,并通过使用 AcePerl 的 add 方法向其标签添加值来构建该对象。最后,通过调用 AcePerl 的 commit 方法将新的 Host 对象写入数据库。
如果事实证明 Arpwatch 只是报告有关现有 Host 对象的一些新信息,则 process 使用 AcePerl 的 add 和 commit 方法来简单地使用新数据更新现有对象。最后,重置新记录标志,子例程退出回到 while 循环以收集更多记录数据。
当文件中的所有记录都已对象化并添加到数据库后,脚本会暂停五分钟,然后利用 Perl 的本机 seek 函数来重置文件结束错误条件。此技巧允许代码在 Arpwatch 继续收集更多记录时,跟踪和处理不断增长的数据文件(模拟 UNIX 的 tail -f 命令)。
就这么简单,我们通过将 Arpwatch 报告转换为对象并使用 AcePerl 处理它们来构建了一个 ACEDB 数据库。但是,我们几乎没有触及 ACEDB 在数据表示方面的强大功能以及 AcePerl 作为构建和操作 ACEDB 对象的 API 的灵活性。例如,只需稍微多编写一些代码,我们就可以调用 SNMP Perl 模块中的方法来探测和收集来自网络上支持 SNMP 的设备的数据,并将此数据添加到在构建或更新时添加到 Host 对象。或者,我们可以根据机器类型(服务器、路由器、防火墙等)向 Host 对象添加子类。任何需要更改模式中对象定义的功能修改都可以通过 ACEDB 轻松处理。继续进行更改,然后让 ACEDB 自动更新数据库中现有对象的结构。
最后一步是通过 Web 使此 Arpwatch 记录数据库可用。Stein 先生的 AceBrowser CGI 脚本提供了一个简单的解决方案。解压缩 AceBrowser 并将其安装在 Web 服务器 CGI 目录的子目录中。AceBrowser 附带一组脚本,用于获取、显示和交互存储在 ACEDB 数据库中的文本和静态 GIF 图像。AceBrowser 代码是创建任何 ACEDB 数据库的自定义 Web 界面的绝佳起点。但是,AceBrowser 的独立于模型的脚本可以开箱即用地用于显示我们的数据,无需修改。按照说明提供站点特定的全局定义(ACEDB 服务器的位置、HTML 样式表等)中的信息,然后启动 Web 浏览器。我使用了 simple 搜索脚本来发现图 1 中呈现的 Host 对象。该对象使用 AceBrowser 的 tree 脚本显示,并在屏幕上表示,以镜像模型文件中定义的对象结构。请注意,current_ev 标签中的数据表示为热链接。模式中定义的交叉引用关系创建了共享通用网络接口供应商的 Host 对象列表。在此示例中,热链接指向使用 3Com Corporation 制造的网络接口的主机的可浏览列表。
通过轻松的操作和少量编码,我们使用 Linux 和 ACEDB 数据库创建了一个强大的工具,用于收集 LAN 上的 IP 管理数据。Linux 和 ACEDB 非常匹配,因为它们都足够灵活,可以即时发明专门的数据库,并且足够强大,可以确保数据完整性。Lincoln Stein 的 AcePerl 模块提供了一个强大且友好的 API,用于与 ACEDB 数据库交互,并且他的 AceBrowser 脚本已准备就绪,可以通过 Web 与任何 ACEDB 数据库进行交互。
还在等什么?您能让 Linux 和 ACEDB 做什么?
本文中提及的所有列表均可通过匿名下载文件 ftp.linuxjournal.com/pub/lj/listings/issue67/3517.tgz 获取。
