如何利用Ethereal进行协议分析
---使用Ethereal
概要:
Ethereal是什么?它是一个图形用户接口(GUI)的网络嗅探器,能够完成与TCPDUMP相同的功能,用来捕获网络数据;但其有TCPDUMP无法相比的友好界面;而且其支持的协议之广和全也是别的嗅探器没有办法相提并论的。
那么你想知道如何快速地掌握Ethereal来帮助你的工作吗?你还想了解Ethereal能给你带来些什么惊喜吗?那么你可以试着阅读本文。
1.
简单介绍
Ethereal是一个图形用户接口(GUI)的网络嗅探器,能够完成与TCPDUMP相同的功能,但操作界面要比TCPDUMP友好的多。Ethereal和TCPDUMP都依赖于pcap库(libcap),因此两者在许多方面非常相似(有相同的数据抓取过滤条件和关键字)。同时Ethereal有与其他图形化网络嗅探器相同的界面模式,实际上如果你能够熟练地使用Ethereal,那么你也同样可以使用其他用户界面的网络嗅探器。
Ethereal也是一个跨平台的开源项目,支持Windows和Linux平台。Ethereal起初由Gerald Combs开发,随后由一个松散的Ethereal团队组织进行维护开发。它目前所提供的强大协议分析功能完全可以同商业的网络协议分析系统媲美,从1998年发布最早的0.2版本至今,大量的志愿者为Ethereal添加新的协议解析器,如今Ethereal已经支持500多种协议解析。很难想象如此多的人开发的代码是如何很好的融入系统中的;实际上在Ethereal中添加一个新的协议解析器非常简单,笔者曾经就在很短的时间内向Ethereal添加一个协议解析器;其实系统为添加协议解析器留出了接口,而在面向程序员的开发文档中对如何添加协议解析器有很好的说明;其实网络协议种类繁多,随着时间推移,各种新的协议层出不穷,如果不是设计良好的系统,也不可能适应不断发展的网络协议。一句话,Ethereal是一个结构设计良好的系统。
那么可以利用Ethereal来做什么呢?实际上Ethereal可以用来捕获网络的数据包,然后利用其对现有协议的分析能力来帮助工作。
2.
安装Ethereal
正如前面所说Ethereal是一个开源的项目,可以从http://www.ethereal.com下载,你不但可以从这里下载到可执行程序,也可以下载到源程序。当前最新版本是0.99.0版。不过正如我们前面说过的,Ethereal是建立在libcap基础之上,所以在安装Ethereal之前请先安装一个libcap的库,可以从http://www.winpcap.org/下载。
Ethereal比较具有吸引力的地方是可以通过阅读其协议分析器的源代码来了解一些不容易得到的协议的详细情况;当然这是比较费力的途径,如果能够得到协议的文档说明还是不要走这条路。
3.
使用Ethereal来捕获数据包
下面以Windows平台上的Ethereal 0.99.0版本介绍一下如何使用Ethereal。
3.1. 捕获数据初级篇
启动Ethereal之后选择Capture菜单,然后选择子菜单Start就可以开始捕获数据包了。

图1:Ethereal开始界面
一旦启动捕获程序以后,Ethereal界面最前面显示一个窗口,这个窗口用来显示各种协议捕获到的数据包数量,以及已经运行的时间。图2显示这个对话框:

图2:Ethereal捕获对话框
3.2. 网络数据的分析
如果你想停止捕获数据包,只需要单击Stop按钮即可。在停止捕获数据包以后,Ethereal将捕获到的数据包进行分析,然后以图形的形式展现在用户面前;如图3所示:

图3:Ethereal网络数据包显示窗口
图3主要包括3部分,分别是:
1. 协议数据包窗口;该窗口中概要的显示数据包捕获的时间,源和目的IP地址,以及使用协议的概况。
2. 协议树窗口;该窗口以树形结构显示捕获到的数据包,实际上当在协议数据包窗口中选择一个数据包的时候,该窗口显示的就是该数据包的结构;树的形状按照网络协议的层次从上到下排列。
3. 16进制数据包窗口;该窗口以16进制的形式显示协议数窗口中对应的数据包。
注意,窗口的整体布局(1、2、3窗口的位置)可以通过菜单:Edit->Preferences…来设置。
下面具体介绍上面3个窗口的功能。
3.2.1.
协议数据包窗口
3.2.1.1. 格式
捕获的数据包默认按照时间的顺序全部显示在该窗口中,窗口的选项从左到右分别是:包序号、时间(单位为秒)、数据包源的IP地址、数据包目标的IP地址、协议类型、包信息概述。下面是一个HTTP数据包的例子:

包号是20;当前包到达时间距离第一个包是59.886024秒;包的源IP地址是210.77.145.167;包的目的地址是60.166.179.164,由于是HTTP协议(基于TCP),所以有一个地址应该是本地计算机地址,该目的地址就是本地机器地址。协议类型为HTTP协议,也就是TCP端口号为80,Ethereal对支持的协议都会在这里以协议的名称显示出来,否则这里显示TCP端口号或UDP端口号,当然对于非TCP和UDP的另当别论。
最后的信息一栏对于TCP和UDP数据包显示数据包从端口到端口,如果有TCP和UDP标志,也会显示在该栏中;对于TCP会显示其他的参数,如窗口、ACK序号等。下面是另外一个例子。

3.2.1.2. 颜色选项
Ethereal对于不同的协议可设置不同的颜色,从而方便用户观察任何异常的数据包,设置颜色选项通过菜单View->Coloring Rules来设置。选择该菜单以后,出现颜色设置对话框,如下所示:

图4,协议颜色选项
系统提供了默认的协议颜色设置,对于某些铭感的协议标志采用红色或黑色来表示。例如:Bad TCP标志。
3.2.1.3. 浏览TCP数据流的内容
Ethereal提供了一个选项,可以用来浏览一个TCP连接上的数据,这些数据以ASCII码等形式显示;可以在协议数据包窗口中选择一个TCP数据包,然后选择右键菜单:Follow TCP Stream,然后出现如图5所示的窗口:

图5,浏览TCP数据流
Ethereal提供了4种形式来显示数据;如果选择ASCII码,对于明码传递的文本数据都可以在这里查看到,例子中的是一个HTTP协议的TCP流(HTTP是使用80端口的一种TCP协议)。
注意,你可能通过该方式一不小心浏览别人明码方式传递的帐户和口令信息哦。
3.2.2.
协议树窗口
当在协议数据包窗口中选择一个数据包的时候,该数据包的协议树就在协议树窗口中被创建。下图是一个TCP数据包的协议树窗口:

图6,协议树窗口
上面是一个HTTP协议的数据包窗口。协议树窗口显示的协议层次与网络协议的层次对应;下表是上面这个例子的对应关系:
|
树节点名称
|
对应的协议层次
|
说明
|
|
Frame
|
帧
|
|
|
Ethernet
II
|
数据链路层
|
以太网协议
|
|
Internet
Protocol
|
网络层
|
IP协议
|
|
Transmission
Control Protocol
|
传输层
|
TCP协议
|
|
HTTP
Protocol
|
应用层
|
HTTP协议
|
每个树节点下的都是该数据包在该层的具体参数和数据。要了解每个树节点的含义需要熟读TCP/IP协议族。这里需要记住一点,从应用层到最底层,通过逐渐添加数据包头来完成的,在数据链路层有一个尾部。这里仅仅举两个三个例子:IP协议节点、TCP协议节点、HTTP协议节点。
注意:帧这层没有对应的网络层,实际上该层是Ethereal为了管理自己建立的,其中的帧序号通常是显示过滤条件的重要参数。
3.2.2.1. IP协议节点

图7,IP协议节点
上面节点说明如下:
|
树节点名称
|
说明
|
|
Version
|
IP版本,IPV4
|
|
Header
Length
|
20个字节的IP头,没有其他选项
|
|
Total
Length
|
该IP包携带的670字节
|
|
Flags
|
不分片标志被设置,该IP在通过各种类型网络时候不分片传输;如果该网络的最大数据包小于该IP包的长度,数据包将不能传输。
|
|
Time
to live
|
TTL值为64,最多数据传输64个节点就被抛弃
|
|
Protocol
|
上面的协议数据包是TCP协议的
|
|
Header
Checksum
|
头的检验和,通过该字段可以知道数据是否有错误
|
|
Source,
Destination
|
数据包的网络层源和目标地址
|
3.2.2.2. TCP协议节点

图8,TCP协议节点
上面节点说明如下:
|
树节点名称
|
说明
|
|
Source
port
|
源端口,传输层的源地址
|
|
Destination
port
|
目的端口,传输层的目的地址
|
|
Sequence
number
|
当前包所载有效数据的起始序号,在一个连接中从开始记数;以字节记数。
|
|
Next
sequence number
|
下一个包的序号,是起始需要加包的有效数据长度的和
|
|
Acknowledgement
number
|
是源用来确认目标在该连接上的到该序号的数据都已经收到。
|
|
Header
length
|
头的长度
|
|
Flags
|
TCP标志,上面的例子中表示该包是一个PUSH标志和ACK标志,ACK标志几乎每个包都有(握手和终止的时候可能没有);PUSH标志用来告诉目标尽快将数据提交给应用程序。一般意义上PUSH标志用于一个应用层包的结束。例如:通过SOCKET的SEND来发送4K的数据,对于TCP来说需要分解成多个TCP包,只有在最后一个TCP包传送的时候才设置该标志,用来告诉对方4K数据已经发送完毕,对方的TCP可以将数据返回给其RECV了。这个标志以前可以自己设置,现在一般实现为自动设置。
|
|
Windows
size
|
告诉对方TCP窗口的数据大小;对方还可以发送多少数据
|
|
Checksum
|
检验和
|
|
Options
|
选项字段,特殊的TCP用途。
|
3.2.2.3. 应用层协议节点

图9,应用层协议节点
上面的例子是一个HTTP协议数据包;通常这层节点是应用层数据;例如:WEBEX的TP/ARM协议,SSL协议等。具体协议参数的含义取决于不同的一些类型。现在的大部分新增的协议都是在这一层之上的,例如:腾讯公司的QQ协议,微软MSN协议等;对于这些来说,他们一般使用一个固定的端口,而Ethereal解析这些协议也正是基于这些端口。作者本人当写添加的协议就是在该层。如果你想为自己公司的协议添加一个协议解析器,你可以工作在这一层;后面我们将介绍如何添加协议解析器。
3.2.3.
16进制数据包窗口
16进制数据包窗口将数据包的所有内容以16进制的形式显示出来,如下图所示:

图10,16进制数据包窗口
该窗口包括3部分,分别是:
1.
16进制的序号,字节为单位
2.
16进制的数据内容;16个字节一行
3.
ASCII码数据内容
用户可以通过直接观察数据包的内容来检查数据。16进制数据包窗口和协议树窗口联合在一起用来完整的表示一个数据包;在协议树上选择一个节点会对应到16进制数据包窗口,当然这个协议应该是被解析的。下面就是一个例子:

图11,协议树和16进制窗口的对应关系
图中显示TCP的窗口大小对应的实际值。
提示,如果数据以明码的形式传输,我们可以在3会观察到数据的具体内容。
3.3. 数据捕获高级篇
为了更精确的捕获数据,Ethereal提供了捕获数据的过滤条件,可以通过设置过滤条件将不需要的数据过滤掉。
Ethereal使用pcap (libpcap /winpcap)的过滤语言作为过滤条件。在http://www.tcpdump.org站点上对该过滤条件有详细的解释;如果对过滤条件有特殊的需要请到这里查找。下面介绍几种常有的数据过滤条件。
3.3.1.
如何设置过滤条件
在3.1节简单介绍如何捕获数据,实际上那里没有设置任何过滤条件,所以所有流过你网卡的数据都会被捕获。
Ethereal提供了两种方式来开始捕获数据:一种是前面已经介绍的;另一种是通过菜单Capture->Interfaces来启动。一旦选择该菜单,就出现一个对话框,如下图:

图12,Capture Interfaces
这里的Interfaces对应机器上的网卡,如果有多块网卡对于Ethereal来说就是多个Interfaces,对于用户来说,需要指定具体捕获那块网卡的数据。在我的计算机中其实只有一块网卡,也就是D-LINK;这个对话框也概要地显示流过该网卡包数量和流速。一旦确定捕获那块网卡上的数据,选择对应的Capture按钮就可以开始捕获了,这个时候会出现如图2的对话框。
当然如果需要进一步设置过滤条件,可以通过上图中Capture旁边的Prepare这个Button来激活,菜单:Capture->Options也提供了这个功能。激活后就出现下面的过滤条件设置对话框:

图13,过滤条件设置
在这个对话框中也提供了网卡选择的选项。下面具体介绍过滤条件每部分的含义。
这里将过滤条件分成了主要的6部分,其他部分这里不介绍,如图13所示。
1.
Interface,用于选择网卡
2.
用来捕获数据的缓冲区;如果注意到有包被丢失,可以将其增大;默认是1MB。
3.
过滤条件;在3.3.2节详细介绍。
4.
捕获模式;一般情况下,网卡只捕获到其本身网络地址的数据,其他都丢弃;但如果想捕获所有网卡能够看到的数据,必须选择这个选项。这里需要注意的是,在交换式网络环境中,很难捕获到目标或源不是Ethereal所在机器的网络数据包(广播包目的是网络中的所有计算机),这是由交换式网络环境决定,因为数据传输过程不需要在目标和源之间直接建立的链路上传输的,也就是数据根本不会到达无关的计算机网卡上;如果你的计算机连接到一个交换机上,那么它肯定是这样的;如果你的计算机连接到一个HUB上,是由HUB的类型决定,交换式的就不会;但如果不是交换式的,它传输数据的方式是广播,这种情况下无关的计算机可以捕获到数据包。更多信息可以参考帮助文档的FAQ5.1。
5.
限制每个被捕获包的大小
6.
设置Ethereal在满足什么样的条件下自动停止捕获;可以是时间、包的数量、包的字节数等。
7.
设置捕获数据的存储方式;可以是单个文件,也可以是多分文件。
3.3.2.
常用的过滤条件
对于过滤条件,这里介绍几个常用的简单例子。
1. 捕获到或来自指定以太网地址的数据包
ether host 08:00:08:15:ca:fe(以太网地址)
2. 捕获所有来自或去向指定IP地址的数据
host 192.168.0.10(IP地址)
3. 捕获指定协议指定端口的数据包
Tcp(协议关键字,小写) port(关键字) 5150(端口)
捕获所有TCP协议,使用5150端口的数据
4. 条件的合并;条件可以通过关键字and和or来联合,例如捕获指定IP地址的指定协议和端口的数据包
Host 192.168.0.10 and tcp port 5150
3.4. 显示数据过滤
在数据捕获以后,如果没有过滤条件,所有的数据都出现在协议数据包窗口中;Ethereal考虑的很周到,为挑选数据节省时间其使用了显示过滤条件。这里值得一提的是,这个过滤条件不同于捕获过滤条件,这些条件是由Ethereal自己定义的。
3.4.1.
设置显示过滤条件
在Ethereal主界面协议数据包窗口的上面有一个TOOLBAR就是用来设置过滤条件的,如图:

图14,显示过滤条件BAR
设置方式有四种:直接输入过滤条件、通过Filter来激活以往配置好的条件、选择+Expression来增加新的条件、选择Combo box的下拉箭头来选择以往条件。
由于过滤条件是Ethereal自己定制的,与捕获过滤条件比较起来好用许多,许多参数可以+Expression激活的协议参数对话框直接选择。
3.4.2.
常用的过滤条件
语法:其有一种类似C语言的语法;判断条件符号和逻辑操作符号都是C语言的符号;当然其还可以使用and或or等关键字来逻辑的&&和||。
下面是几个简单的例子:
1. 查看指定包号到指定包号的数据
frame.no>=100 and
frame.no<=200(从100到200之间的所有包)
2. 查看指定IP地址的包
Ip.addr == 172.16.201.109
3. 查看指定协议端口的包
Tcp.port == 80(使用TCP协议端口为80的所有数据包)
4. 查看指定源和目标之间指定协议端口的数据包
Ip.src == 172.16.201.109 and ip.dst
== 172.16.202.107 and tcp.port ==1800
所有TCP端口为1800从172.16.201.109到172.16.202.107数据包
5. 查看设置了指定TCP协议标志的所有包
tcp.flags.push == 1,所有设置了push标志的包
4.
小结
到目前为止,本文基本上介绍如何通过Ethereal来捕获数据、怎么样分析数据以及过滤数据;这些只是Ethereal的入门,Ethereal还为用户提供了很多其他有用的功能,限于篇幅和时间,这里不在介绍,由读者自己去实践。如果有必要的话,笔者后面可能写一篇面向程序员的文章,介绍如何在Ethereal增加自己的协议分析器。
最后笔者提醒读者,要想熟练使用Ethereal,那么请首先熟练掌握TCP/IP协议机制。