以太坊 (Ethereal) 导览
我最近开始使用一个名为 Ethereal 的网络工具。对于熟悉 tcpdump 的人来说,可以将 Ethereal 视为 tcpdump 的 GUI 形式,它可以显示整个数据包,并可以将数据包分解以显示各个字段。对于那些没有使用过 tcpdump 或类似数据包嗅探器的人来说,最好通过几个示例来展示 Ethereal 的功能。
当您启动 Ethereal 时,它看起来像图 1 中显示的图形。通常,您需要从连接到您工作站的网络捕获一些数据;通过选择“Capture→Start...”来执行此操作,这将弹出图 2 中显示的对话框。当您捕获了所需的数据后,停止捕获并检查它。图 3 显示了一些 IPv6 流量的捕获,我在其中选择了一个 ICMPv6 数据包(在顶部框架中),并展开了 IPv6 和 ICMPv6 内容以选择 IPv6 源地址(在中间框架中)。Ethereal 会自动突出显示底部框架中数据包内与所选字段(在本例中为源地址)相对应的原始字节。这种类型的功能使 Ethereal 非常适合理解各种网络协议,我绝对建议将其用作教学或自学辅助工具,并结合网络 RFC 使用。Ethereal 也可用于教育用户和管理层了解使用明文发送数据的协议的危险,如图 4 中针对文件传输协议所示。
Ethereal 也可用于调查专有协议或其他没有良好文档记录的网络协议。图 5 显示了一个有些牵强的示例——rsync。由于 rsync 能够节省大量带宽,因此该协议被广泛使用,但它本质上是由应用程序的源代码定义的。我使用 Ethereal 捕获了许多 rsync 事务,并弄清楚了该协议的工作原理——至少足以编写一个 Ethereal 的 rsync 协议分析器。据我了解,Samba 团队使用 Ethereal 和许多其他工具来开发与 Microsoft CIFS 实现互操作的客户端和服务器,因为 Microsoft 关于这些协议的文档不完整或不正确。
我还使用 Ethereal 作为网络应用程序测试(在 zcip 和服务定位协议上)的一部分,以评估正确性和响应时间。Ethereal 为每个事务添加时间标签,因此您可以轻松查看数据包之间的关系。
Ethereal 通过一个名为 libpcap 的相当可移植的库来捕获数据包,该库在 Linux 上通过使用名为数据包套接字的内核机制访问网络上的数据包。可以在 Linux 下禁用此选项,尽管可能所有供应商内核都启用了它,并且它在 Linux 内核上大多数架构的默认内核配置中都已启用。其他操作系统有不同的接口,但 libpcap 将其抽象化并提供了一个通用的 API。
收到网络数据包的副本后,Ethereal 会构建一个内部链表并将数据包保存到文件中。然后,它根据端口号、支持协议中的类型字段或基于字段内容猜测协议的启发式方法来确定数据包正在承载的协议。值得注意的是,这种方法本质上是基于推测的,绝非万无一失。例如,端口 53 的流量很可能是 DNS,但网络管理员完全可以选择在该端口上运行另一项服务。此外,Ethereal 支持使用“Tools→Decode As”选项将特定数据包解释为不同的协议。
基于猜测的协议,Ethereal 解码(在 Ethereal 术语中称为“分析”)数据包。Ethereal 支持的每个协议都通过一段称为分析器的代码来处理。在撰写本文时,Ethereal 中内置了 333 个分析器,其中一些分析器处理多个协议。协议也可以作为插件提供,这些插件是动态加载的。根据协议和分析器代码提供的复杂程度,可以分解数据包以分析各个位,也可以在非常高的级别上呈现数据包。图 6 描绘了这两种选项,其中 TCP 分析器显示了标志中设置的各个位,但 IMAP 分析器仅分解了两个字段。值得注意的是,IMAP 是一种基于文本的协议,因此数据包内容的简单 ASCII 转储是显示它们的适当方式。
在我看来,Ethereal 的主要功能是它在单个应用程序中捕获和分析网络流量的能力,以及其显示和过滤代码的复杂性。
尽管我们在本文前面已经了解了如何捕获网络流量,但 Ethereal 可以捕获的不仅仅是以太网流量。Ethereal 通常可以(至少在 Linux 上)同时从以太网、令牌环、FDDI、串行(PPP 和 SLIP)、802.11 无线局域网、ATM 连接和所有网络设备捕获数据。在 Ethereal 捕获对话框中称为“any”设备,此功能仅在 Linux 中有效。当然,需要启用合适的网络硬件和内核驱动程序才能获取数据包。
在繁忙的网络上,您的捕获文件中可能有数千个数据包,而您只对其中的一部分感兴趣。为了更容易解释可能变得非常繁忙的 Ethereal 显示,您可以使用颜色。从“Display→Colorize Display...”选项中,您可以选择以各种颜色显示数据包;图 7 显示了如何指定过滤器。在本例中,我仅对单个字段(服务定位协议的版本号)进行过滤,但您可以使用布尔逻辑构建复杂的过滤器。图 8 显示了一个包含几个过滤器的典型示例,图 9 显示了工作显示(服务定位协议版本 2 为红色,DNS 为绿色,ARP 为蓝色)。您可以使用各种文本颜色以及背景颜色来区分各种协议。
在对显示进行着色后,下一步是删除不感兴趣的数据包,Ethereal 通过显示过滤来处理此任务。图 10 显示了一个简单的示例,其中添加 srvloc 过滤器(在窗口的左下方)已删除了所有其他协议,仅留下服务定位协议。如果这仍然太复杂,您可以选择再次更改着色,这次以不同的颜色显示来自特定主机的数据包,或以特定颜色显示包含特定类型的客户端请求或服务器响应的数据包。
另一个选择是不首先捕获不需要的数据包。为此,Ethereal 支持 tcpdump 使用的相同捕获过滤器语法。图 11 显示了此语法的示例,其中对话框仅捕获发送到或来自 IP 为 192.168.0.1 的计算机的数据包。不幸的是,捕获过滤器中使用的语法与显示过滤器中使用的语法不同,这一事实使得偶尔使用的用户更难访问捕获过滤。

图 11. 捕获过滤器对话框
有些人觉得有用的另一个功能是“Follow TCP Stream...”工具,它以文本形式表示对话。我个人不经常使用此功能,但它是查看基于文本的协议(如 IMAP)(图 12)的强大工具。
除了捕获和显示过滤器所需的语法不同之外,在我使用 Ethereal 的这段时间里,我还遇到了一些其他问题。其中一些与个人偏好有关,另一些是从监控 Ethereal 邮件列表中收集到的。
在撰写本文时,我最大的问题是支持文档的质量,尤其是用户指南,它不完整且已过时。此外,用户指南的很大一部分(约占最后 80%)是自动生成的,并且不用户友好。此外,网站上的版本已经有一段时间没有重新生成了。我个人觉得 GUI 有点难以习惯,但随着我越来越熟悉各种菜单,我对 Ethereal 的工作效率也越来越高。也许一些更好的文档会有助于解决这个问题。开发人员文档也很有限,尽管考虑到您可以从中学习的大量示例,我认为这是一个不太重要的问题。
各种用户偶尔会问“何时会支持某个协议?” 在我发现 Ethereal 不支持的少数协议(rsync、distcc 和 ACAP)的情况下,我通常需要自己编写支持代码。使用 Ethereal 这样做相当容易。但是,如果您需要支持特定协议,而 Ethereal 目前不支持该协议,则在承诺使用 Ethereal 之前,您应该考虑一些开发工作(无论是内部开发还是以合同为基础)。如果您确实开发了额外的分析器或增强了现有的分析器,我强烈建议您将其合并到 Ethereal 源代码树中,以确保其保持最新。
其他数据包分析工具支持的另一个功能是在远程主机上捕获数据并在本地显示它。如果您可以在远程主机上运行 Ethereal,则可以实现此方案,但通常您希望在充当路由器或服务器的计算机上捕获数据,而在这种情况下,完整的 X 环境是不受欢迎的。这种缺失可能会在未来的版本中克服,也可能并不特别重要,具体取决于您的环境。
唯一值得一提的另一个问题是,用户支持邮件列表上的大量查询似乎来自遇到各种问题的 Windows 用户。我个人没有运行 Windows 版本,因此我不知道这些困难是否与底层工具(尤其是 WinPcap)、Windows 本身或用户的技能水平有关。
资源
有关 Ethereal 的更多信息,请从 www.ethereal.com 开始。此页面包含指向 Ethereal 手册、下载和邮件列表的链接。
为了更好地理解 Ethereal 向您显示的内容,您需要有关网络协议的相应文档。这些协议由 Internet 工程任务组编纂,可在 www.rfc-editor.org 上找到。
rsync 是一个高效的网络文件传输应用程序,最初由 Andrew Tridgell(Samba 的创始人)开发。请参阅 rsync.samba.org。
zcip 是一种用于自动分配(零配置)IPv4 地址的工具,无需 DHCP 服务器。请参阅 zeroconf.sourceforge.net。
服务定位协议是一种客户端以网络高效的方式查找服务器的方法。有关该协议的更多详细信息,请参阅 www.srvloc.org,或参阅 RFC 2608、RFC 2609、RFC 2610 和 RFC 2614,这些文档可从 www.rfc-editor.org 获得。Matt Peterson 开发的免费实现可在 www.openslp.org 上获得。
Ethereal 的捕获功能依赖于 TCPDUMP 组开发的 libpcap。您需要 libpcap 才能构建 Ethereal,尽管大多数发行版都附带 libpcap 软件包。请参阅 www.tcpdump.org。
libpcap 的 Windows 版本是 WinPcap。有关更多信息和下载安装程序包,请参阅 winpcap.polito.it。
IMAP(Internet 消息访问协议)是一种基于服务器的电子邮件协议,在许多方面优于广泛使用的邮局协议 (POP)。有关更多详细信息,请从 www.rfc-editor.org 获取 RFC 2060。
distcc 是 Martin Pool 开发的分布式编译应用程序,它使用各种网络计算机参与构建 C 代码。请参阅 distcc.samba.org。
Brad Hards 是 Sigma Bravo 的技术总监,Sigma Bravo 是一家位于澳大利亚堪培拉的小型专业服务公司。除了 Linux 之外,他的技术重点还包括飞机系统集成和认证、GPS 和电子战。对本文的评论可以发送至 bradh@frogmouth.net。