发展简史
1997年底,Gerald Combs需要一个能够追踪网络流量的工具软件作为其工作上的辅助。因此他开始撰写Ethereal软件。
Ethereal在经过几次中断开发的事件过后,终于在1998年7月发布其第一个版本v0.2.0。自此之后,Combs收到了来自全世界的补丁、错误回报与鼓励信件。Ethereal的发展就此开始。不久之后,Gilbert Ramirez看到了这套软件的开发潜力并开始参予低级程序的开发。1998年10月,来自Network Appliance公司的Guy Harris在查找一套比tcpview(另外一套网络数据包截取程序)更好的软件。于是他也开始参与Ethereal的开发工作。
1998年底,一位在教授TCP/IP课程的讲师Richard Sharpe,看到了这套软件的发展潜力,而后开始参与开发与加入新协定的功能。在当时,新的通信协定的制定并不复杂,因此他开始在Ethereal上新增的数据包截取功能,几乎包含了当时所有通信协定。
自此之后,数以千计的人开始参与Ethereal的开发,多半是因为希望能让Ethereal截取特定的,尚未包含在Ethereal默认的网络协定的数据包而参予新的开发。
软件特征
Ethereal主要具有以下特征:
在实时时间内,从网络连接处捕获数据,或者从被捕获文件处读取数据;
Ethereal可以读取从tcpdump(libpcap)、网络通用嗅探器(被压缩和未被压缩)、SnifferTM专业版、NetXrayTM、Sun snoop和atmsnoop、Shomiti/Finisar测试员、AIX的iptrace、Microsoft的网络监控器、Novell的LANalyzer、RADCOM的WAN/LAN分析器、ISDN4BSD项目的HP-UX nettl和i4btrace、Cisco安全IDS iplog和pppd日志(pppdump格式)、WildPacket的EtherPeek/TokenPeek/AiroPeek或者可视网络的可视UpTime处捕获的文件。此外Ethereal也能从Lucent/Ascend WAN路由器和Toshiba ISDN路由器中读取跟踪报告,还能从VMS的TCPIP读取输出文本和DBS Etherwatch。
从以太网、FDDI、PPP、令牌环、IEEE 802.11、ATM上的IP和回路接口(至少是某些系统,不是所有系统都支持这些类型)上读取实时数据。
通过GUI或TTY模式tethereal程序,可以访问被捕获的网络数据。
通过editcap程序的命令行交换机,有计划地编辑或修改被捕获文件。
当前602协议可被分割。
输出文件可以被保存或打印为纯文本或PostScript格式。
通过显示过滤器精确显示数据。
显示过滤器也可以选择性地用于高亮区和颜色包摘要信息。
所有或部分被捕获的网络跟踪报告都会保存到磁盘中。
系统介绍
Ethereal是一个开放源码的网络分析系统,也是是目前最好的开放源码的网络协议分析器,支持Linux和windows平台。Ethereal起初由Gerald Combs开发,随后由一个松散的Etheral团队组织进行维护开发。它目前所提供的强大的协议分析功能完全可以媲美商业的网络分析系统,自从1998年发布最早的0.2版本至今,大量的志愿者为Ethereal添加新的协议解析器,如今Ethereal已经支持五百多种协议解析。
很难想象如此多的人开发的代码可以很好的融入系统中;并且在系统中加入一个新的协议解析器很简单,一个不了解系统的结构的新手也可以根据留出的接口进行自己的协议开发。这都归功于Ehereal良好的设计结构。事实上由于网络上各种协议种类繁多,各种新的协议层出不穷。一个好的协议分析器必需有很好的可扩展性和结构。这样才能适应网络发展的需要不断加入新的协议解析器。
一、Ethereal的捕包平台
网络分析系统首先依赖于一套捕捉网络数据包的函数库。这套函数库工作在在网络分析系统模块的最底层。作用是从网卡取得数据包或者根据过滤规则取出数据包的子集,再转交给上层分析模块。从协议上说,这套函数库将一个数据包从链路层接收,至少将其还原至传输层以上,以供上层分析。
在Linux系统中,1992年Lawrence Berkeley Lab的Steven McCanne和Van Jacobson提出了包过滤器的一种的实现,BPF(BSD Packet Filter)。Libpcap是一个基于BPF的开放源码的捕包函数库。现有的大部分Linux捕包系统都是基于这套函数库或者是在它基础上做一些针对性的改进。
在window系统中,意大利人Fulvio Risso和Loris Degioanni提出并实现了Winpcap函数库,作者称之为NPF。由于NPF的主要思想就是来源于BPF,它的设计目标就是为windows系统提供一个功能强大的开发式数据包捕获平台,希望在Linux系统中的网络分析工具经过简单编译以后也可以移植到windows中,因此这两种捕包架构是非常相似的。就实现来说提供的函数调用接口也是一致的。
Ethereal网络分析系统也需要一个底层的抓包平台,在Linux中是采用Libpcap函数库抓包,在windows系统中采用winpcap函数库抓包。
二、层次化的数据包协议分析方法
取得捕包函数捕回的数据包后就需要进行协议分析和协议还原工作了。由于OSI的7层协议模型,协议数据是从上到下封装后发送的。对于协议分析需要从下至上进行。首先对网络层的协议识别后进行组包还原然后脱去网络层协议头。将里面的数据交给传输层分析,这样一直进行下去直到应用层。
由于网络协议种类很多,就Ethereal所识别的500多种协议来说,为了使协议和协议间层次关系明显。从而对数据流里的各个层次的协议能够逐层处理。Ethereal系统采用了协议树的方式。上图就是一个简单的协议树。如果协议A的所有数据都是封装在协议B里的,那么这个协议A就是协议B是另外一个协议的儿子节点。我们将最低层的无结构数据流作为根接点。那么具有相同父节点的协议成为兄弟节点。
那么这些拥有同样父协议兄弟节点协议如何互相区分了?Ethereal系统采用协议的特征字来识别。每个协议会注册自己的特征字。这些特征字给自己的子节点协议提供可以互相区分开来的标识。比如tcp协议的port字段注册后。Tcp.port=21就可以认为是ftp协议,特征字可以是协议规范定义的任何一个字段。比如ip协议就可以定义proto字段为一个特征字。
在Ethereal中注册一个协议解析器首先要指出它的父协议是什么。另外还要指出自己区别于父节点下的兄弟接点协议的特征。比如ftp协议。在Ethereal中他的父接点是tcp协议,它的特征就是tcp协议的port字段为21。
这样当一个端口为21的tcp数据流来到时。首先由tcp协议注册的解析模块处理,处理完之后通过查找协议树找到自己协议下面的子协议,判断应该由那个子协议来执行,找到正确的子协议后,就转交给ftp注册的解析模块处理。这样由根节点开始一层层解析下去。
由于采用了协议树加特征字的设计,这个系统在协议解析上由了很强的扩展性,增加一个协议解析器只需要将解析函数挂到协议树的相应节点上即可。
三、基于插件技术的协议分析器
所谓插件技术,就是在程序的设计开发过程中,把整个应用程序分成宿主程序和插件两个部分,宿主程序与插件能够相互通信,并且,在宿主程序不变的情况下,可以通过增减插件或修改插件来调整应用程序的功能。运用插件技术可以开发出伸缩性良好、便于维护的应用程序。它著名的应用实例有:媒体播放器winamp、微软的网络浏览器ie等。
由于现在网络协议种类繁多,为了可以随时增加新的协议分析器,一般的协议分析器都采用插件技术,这样如果需要对一个新的协议分析只需要开发编写这个协议分析器并调用注册函数在系统注册就可以使用了。通过增加插件使程序有很强的可扩展性,各个功能模块内聚。
在协议分析器中新增加一个协议插件一般需要插件安装或者注册,插件初始化,插件处理3个步骤,下面以Ethereal为例进行分析如何利用插件技术新增加一个协议分析模块。
Ethereal由于采用插件技术,一个新加入开发的程序员开发一种新的协议分析模块的时候不需要了解所有的代码,他只需要写好这个协议模块的函数后,写一个格式为proto_reg_handoff_XXX的函数,在函数内调用注册函数告诉系统在什么时候需要调用这个协议模块。比如你事先写好了一个名为dissect_myprot的协议解析模块,它是用来解析tcp协议端口为250的数据。可以利用这些语句来将这个解析器注册到系统中。
proto_reg_handoff_myprot(void)
{dissector_handle_t myprot_handle;
myprot_handle=create_dissector_handle(dissect_myprot,
proto_myprot);
dissector_add("tcp.port",250,myprot_handle)}
这段代码告诉系统当tcp协议数据流端口为250的时候要调用dissect_myprot这个函数模块。
在Ethereal中有一个脚本专门来发现开发者定义的类式proto_reg_handoff_xxx这样的注册函数名,然后自动生成调用这些注册函数的代码。这样开发者不需要知道自己的注册函数如何被调用的。这样一个新的协议分析模块就加入到系统中了。
由于采用了插件方式,Ethereal良好的结构设计让开发者只需要关系自己开发的协议模块,不需要关心整个系统结构,需要将模块整合进系统只需要写一个注册函数即可,连初始化时调用这个注册函数都由脚本自动完成了。正是因为有很好的体系结构,这个系统才能够开发出如此多的协议解析器。
尽管Ethereal是目前最好的开放源码的网络分析系统,但Ethereal仍然有一些可以改进的地方,一个优秀的网络分析器,尽可能的正确分析出数据协议和高效的处理数据是两个重要的指标。在协议识别方面Ethereal大多采用端口识别,有少量协议采用内容识别。这就让一些非标准端口的协议数据没有正确解析出来。比如ftp协议如果不是21端口的话,Ethereal就无法识别出来,只能作为tcp数据处理。
另外对于内容识别式。Ethereal是将所以内容识别的函数组成一张入口表。每次协议数据需要内容识别时,按字母顺序逐个调用表里的每个识别函数。比如对于识别yahoo massanger协议。主要是看数据前几个字节是不是’ymsg’.由于协议名为y开头。所以当识别出协议时已经把所有内容识别函数调用了一遍。这些都是由于Ethereal没有实现tcp协议栈,无法做到流级别的识别。导致在协议识别方面有点缺陷。
应用范围
Ethereal是一种开放源代码的许可软件,允许用户向其中添加改进方案。Ethereal适用于当前所有较为流行的计算机系统,包括Unix、Linux和Windows。
使用入门
Ethereal可以用来从网络上抓包,并能对包进行分析。下面介绍windows下Ethereal的使用方法:
安装
1、安装winpcap
2、安装Ethereal
使用:
windows程序,使用很简单。启动ethereal以后,选择菜单Capture->Start,就OK了。当你不想抓的时候,按一下stop,抓的包就会显示在面板中,并且已经分析好了。
Ethereal使用-capture选项
interface:指定在哪个接口(网卡)上抓包。一般情况下都是单网卡,所以使用缺省的就可以了。
Limit each packet:限制每个包的大小,缺省情况不限制。
Capture packets in promiscuous mode:是否打开混杂模式。如果打开,抓取所有的数据包。一般情况下只需要监听本机收到或者发出的包,因此应该关闭这个选项。
Filter:过滤器。只抓取满足过滤规则的包(可暂时略过)
File:如果需要将抓到的包写到文件中,在这里输入文件名称。
use ring buffer:是否使用循环缓冲。缺省情况下不使用,即一直抓包。注意,循环缓冲只有在写文件的时候才有效。如果使用了循环缓冲,还需要设置文件的数目,文件多大时回卷。
其他的项选择缺省的就可以了
Ethereal的抓包过滤器
抓包过滤器用来抓取感兴趣的包,用在抓包过程中。抓包过滤器使用的是libcap过滤器语言,在tcpdump的手册中有详细的解释,基本结构是:[not] primitive [and|or [not] primitive ..]
个人观点,如果你想抓取某些特定的数据包时,可以有以下两种方法,你可以任选一种,个人比较偏好第二种方式:
1、在抓包的时候,就先定义好抓包过滤器,这样结果就是只抓到你设定好的那些类型的数据包;
2、先不管三七二十一,把本机收到或者发出的包一股脑的抓下来,然后使用下节介绍的显示过滤器,只让Ethereal显示那些你想要的那些类型的数据包;
etheral的显示过滤器(重点内容)
在抓包完成以后,显示过滤器可以用来找到你感兴趣的包,可以根据1)协议2)是否存在某个域3)域值4)域值之间的比较来查找你感兴趣的包。
举个例子,如果你只想查看使用tcp协议的包,在ethereal窗口的左下角的Filter中输入tcp,然后回车,Ethereal就会只显示tcp协议的包。
值比较表达式可以使用下面的操作符来构造显示过滤器自然语言类c表示举例eq==ip.addr==10.1.10.20ne!=ip.addr!=10.1.10.20gt>frame.pkt_len>10 lt < frame.pkt_len<10 ge >= frame.pkt_len>=10 le<=frame.pkt_len<=10
表达式组合可以使用下面的逻辑操作符将表达式组合起来自然语言类c表示举例and&逻辑与,比如ip.addr=10.1.10.20&&tcp.flag.fin or||逻辑或,比如ip.addr=10.1.10.20||ip.addr=10.1.10.21 xor^^异或,如tr.dst[0:3]==0.6.29 xor tr.src[0:3]==not!逻辑非,如!llc
在Ethereal使用协议插件
Ethereal能够支持许多协议,但有些协议需要安装插件以后才能解,比如H.323,以H.323协议为例,首先下载Ethereal的H.323插件,
1)启动Ethereal
2)菜单Edit->Preference
3)单击Protocols前面的"+"号,展开Protocols4)找到Q931,并单击
5)确保"Desegment....TCPsegments"是选中的(即方框被按下去)
6)单击TCP
7)确保"Allow....TCPstreams"是选中的
8)确保没有选中"Check....TCP checksum"和"Use....sequence numbers"
9)单击TPKT
10)确保"Desegment....TCP segments"是选中的
11)点击Save,然后点击Apply,然后点击OK你也完全可以不断地重新安装新版本winpcap和Ethreal,这样就可以不需在旧的ethreal的版本中安装新的插件来支持新的协议插件。这也是懒人的一种做法。