用sniffer诊断Linux网络故障

发表于:2007-06-23来源:作者:点击数: 标签:
上次介绍了嗅探器的基本原理,以及如何用Tcpdump来截获 网络 上的数据包。但Tcpdump只是一个命令行方式下的 网络 嗅探器,虽然功能强大,可分析起数据包来却不是很方便。 好在 Linux 下还有一些具有良好GUI界面的嗅探器可以借助。Ethereal和EtherApe就是其中

   

上次介绍了嗅探器的基本原理,以及如何用Tcpdump来截获网络上的数据包。但Tcpdump只是一个命令行方式下的网络嗅探器,虽然功能强大,可分析起数据包来却不是很方便。

好在Linux下还有一些具有良好GUI界面的嗅探器可以借助。Ethereal和EtherApe就是其中的佼佼者。有了Tcpdump的基础,再使用这两个嗅探器就感觉很轻松。

用Ethereal分析
协议数据包

Ethereal是一个图形用户接口(GUI)的
网络嗅探器,能够完成与Tcpdump相同的功能,但操作界面要友好很多。Ehtereal和Tcpdump都依赖于pcap库(libpcap),因此两者在许多方面非常相似(如都使用相同的过滤规则和关键字)。Ethereal和其它图形化的网络嗅探器都使用相同的界面模式,如果能熟练地使用Ethereal,那么其它图形用户界面的嗅探器基本都可以操作。

Ethereal的安装

在http://www.ethereal.com网站上可以下载到最新的Ethereal源码包。下面以Ethereal0.9.9为例,讲述如何安装Ethereal,此处使用的操作
系统是RedHat8.0。

首先下载最新的源码包,并将其解压缩:

#cpethereal-0.9.9.tar.bz2/usr/local/src/

#cd/usr/local/src/

#bzip2-dethereal-0.9.9.tar.bz2

#tarxvfethereal-0.9.9.tar

同Tcpdump一样,在编译Ethereal之前应先确定已经安装pcap库(libpcap),这是编译Ethereal时所必需的。如果该库已经安装,就可以执行下面的命令来编译并安装Ethereal:

#cdethereal-0.9.9

#./configure

#make

#makeinstall

设置Ethereal的过滤规则

当编译并安装好Ethereal后,就可以执行“ethereal”命令来启动Ethereal。在用Ethereal截获数据包之前,应该为其设置相应的过滤规则,可以只捕获感兴趣的数据包。Ethereal使用与Tcpdump相似的过滤规则,并且可以很方便地存储已经设置好的过滤规则。要为Ethereal配置过滤规则,首先单击“Edit”选单,然后选择“CaptureFilters...”菜单项,打开“EditCaptureFilterList”对话框(如图1所示)。因为此时还没有添加任何过滤规则,因而该对话框右侧的列表框是空的。

用sniffer诊断Linux网络故障(图一)

图1 Ethereal过滤器配置对话框
在Ethereal中添加过滤器时,需要为该过滤器指定名字及规则。例如,要在主机10.1.197.162和www.sohu.com间创建过滤器,可以在“Filter name”编辑框内输入过滤器名字“sohu”,在“Filter string”编辑框内输入过滤规则“host 10.1.197.162 and www.sohu.com”,然后单击“New”按钮即可,如图2所示。

用sniffer诊断Linux网络故障(图二)

图2 为Ethereal添加一个过滤器
在Ethereal中使用的过滤规则和Tcpdump几乎完全一致,这是因为两者都基于pcap库的缘故。Ethereal能够同时维护很多个过滤器。网络管理员可以根据实际需要选用不同的过滤器,这在很多情况下是非常有用的。例如,一个过滤器可能用于截获两个主机间的数据包,而另一个则可能用于截获ICMP包来诊断网络故障。 当所有需要的过滤器都创建好后,单击“Save”按钮保存创建的过滤器,然后单击“Close”按钮来关闭“Edit Capture Filter List”对话框。要将过滤器应用于嗅探过程,需要在截获数据包之前或之后指定过滤器。要为嗅探过程指定过滤器,并开始截获数据包,可以单击“Capture”选单,选择“Start...”选单项,打开“Capture Options”对话框,单击该对话框中的“Filter:”按钮,然后选择要使用的过滤器,如图3所示。

用sniffer诊断Linux网络故障(图三)

图3 为Ethereal指定过滤器
注意在“Capture Options”对话框中,“Update list of packets in real time”复选框被选中了。这样可以使每个数据包在被截获时就实时显示出来,而不是在嗅探过程结束之后才显示所有截获的数据包。

在选择了所需要的过滤器后,单击“OK”按钮,整个嗅探过程就开始了。Ethereal可以实时显示截获的数据包,因此能够帮助网络管理员及时了解网络的运行状况,从而使其对网络性能和流量能有一个比较准确的把握。

用Ethereal分析数据包

Ethereal和其它的图形化嗅探器使用基本类似的界面,整个窗口被分成三个部分:最上面为数据包列表,用来显示截获的每个数据包的总结性信息;中间为协议树,用来显示选定的数据包所属的协议信息;最下边是以十六进制形式表示的数据包内容,用来显示数据包在物理层上传输时的最终形式。

使用Ethereal可以很方便地对截获的数据包进行分析,包括该数据包的源地址、目的地址、所属协议等。图4是在Ethereal中对一个HTTP数据包进行分析时的情形。

在图3最上边的数据包列表中,显示了被截获的数据包的基本信息。从图中可以看出,当前选中数据包的源地址是10.1.197.162,目的地址为61.135.150.65,该数据包所属的协议是超文本传输协议(HTTP)。更详细的信息表明该数据包中含有一个HTTP的GET命令,要求下载starrtlog.js文件到客户端的Web浏览器。

用sniffer诊断Linux网络故障(图四)

图4 用Ethereal分析数据包内容
图4中间是协议树,通过协议树可以得到被截获的数据包的更多信息,如主机的MAC地址(Ethernet II)、IP地址(Internet Protocol)、TCP端口号(Transmission Control Protocol),以及HTTP协议的具体内容(Hypertext Trnasfer Protocol)。通过扩展协议树中的相应节点,可以得到该数据包中携带的更详尽的信息。

图4最下边是以十六制显示的数据包的具体内容,这是被截获的数据包在物理媒体上传输时的最终形式,当在协议树中选中某行时,与其对应的十六进制代码同样会被选中,这样就可以很方便地对各种协议的数据包进行分析。

Ethereal提供的图形化用户界面非常友好,管理员可以很方便地查看到每个数据包的详细信息,协议树及其对应的十六进制表示对分析每个数据包的目的很有帮助,综合使用Ethereal和Tcpdump能够基本满足网络管理员在Linux系统上的所有嗅探要示。

用EtherApe查看网络流量

EtherApe也是一个图形化的网络嗅探器。与Ehtereal不同,EtherApe通过验证主机与主机之间的链接,图形化地显示网络目前所处的状态。EtherApe使用不同颜色的连线来表示位于不同主机之间的连接,而连线的粗细则表明主机间数据流量的大小。这些信息都是实时变化的,因而能够协助管理员随时了解到网络中各部分流量的变化情况。

EtherApe的安装

EhterApe支持Ethernet、FDDI和Token Ring等多种网络,能够实时地从网络或文件中读取网络流量的变化情况。此外它还可以将网络流量信息保存下来,以便在之后需要时再显示出来。在http://www.sourceforge.net/projects/etherape/网站上可以下载到最新的EtherApe源码包。下面以Ethereal 0.8.2为例,讲述如何安装EtherApe(使用的操作系统是RedHat 8.0)。

首先下载最新的源码包并将其解压缩,代码如下:

# cp etherape-0.8.2.tar.gz /usr/local/src/
# cd /usr/local/src/
# tar xzvf etherape-0.8.2.tar.gz


EtherApe使用的是GNOME这一图形用户接口库。与Ethereal和Tcpdump一样,它也使用pcap库(libpcap)对网络上传输的数据包进行截获和过滤。在编译EtherApe之前,应先确定所需的这些库已经安装好,因为这是编译EtherApe时所必需的。如果这些库已经安装,就可以执行下面的命令来编译并安装EtherApe:

# cd etherape-0.8.2
# ./configure
# make
# make install


用EtherApe分析网络流量

当编译并安装好EtherApe后,就可以执行“etherape”命令来启动EtherApe。

当用EtherApe截获在网络上传输的数据包时,也需要先为其指定过滤规则,否则EthreApe将捕获网络中的所有数据包。单击工具栏上的“Pref.”按钮,打开“Preferences”对话框,在该对话框中的“Capture”属性页中,可以找到用于设置过滤规则的“Capture filter”下拉框。由于采用的都是pcap库,因此EtherApe过滤规则的设置与Tcpdump和Ethereal是相同的。

设置好过滤规则后,单击工具栏上的“Start”按钮,就可以开始对网络中感兴趣的数据包进行嗅探。EhterApe图形化地显示网络流量,图5是当EtherApe处于Ethernet模式下时的网络流量图。

用sniffer诊断Linux网络故障(图五)

图5 EtherApe监测的Ethernet流量图
EtherApe提供了Token Ring、FDDI、Ethernet、IP和TCP五种监听模式。当处于Ethernet模式下时,EtherApe会截获所有符合过滤规则的以太网数据包,但有时网络管理员可能只对IP数据包感兴趣,这时可以将EtherApe切换到IP模式。单击“Capture”菜单,选择“Mode”菜单项,然后再选择相应的模式,就可以完成模式之间的切换。图6是当EhterApe处于IP模式下时的网络流量图。

用sniffer诊断Linux网络故障(图六)

图6 EtherApe监测的IP流量图

EtherApe能够以图形的方式显示网络流量。用户看到的是一个很直观的用于表示网络上各主机间流量大小的图,而不是单个的数据包,因而更容易从整体上把握整个网络的运行状况,在定位网络故障时相对来说也变得更加容易。

Tcpdump的输出结果

在对网络中的数据包进行过滤后,Tcpdump的输出结果中包含网络管理员关心的网络状态信息。由于Tcpdump只是一个命令行方式的嗅探器,因而其输出结果不是很直观,下面以几种典型的输出信息为例,介绍如何对Tcpdump的输出结果进行分析。

1. 数据链路层头信息

使用“tcpdump -e host tiger”命令截获主机“tiger”所有发出和收到的数据包,并在输出结果中包含数据链路层的头部信息。

“tiger”是一台装有Linux的主机,其MAC地址是00:D0:59:BF:DA:06;“mag”是一台装有SCO Unix的工作站,其MAC地址是08:90:B0:2F:AF:46,上述命令的输出结果如下:

20:15:20.735429 eth0 
< 08:90:b0:2f:af:46 00:d0:59:bf:da:06 ip 60: mag.36579 >
 tiger.ftp 0:0(0) ack 25565 win 8970 (DF)


在输出的信息中,“20:15:20”为截获数据包的时间,“735429”是毫秒数,“eth0 <”表示从网络接口eth0接收该数据包(若为“eth0 >”,则表示从网络接口eth0发送数据包)。“08:90:b0:2f:af:46”是主机mag的MAC地址,指明发送该数据包的源主机为“mag”,“00:d0:59:bf:da:06”是主机tiger的MAC地址,指明该数据包发送的目标主机为“tiger”。“ip”表明该数据包是IP数据包,“60”是数据包的长度,“mag.36579 > tiger.ftp”表明该数据包是从主机“mag”的36579端口发往主机“tiger”的FTP(21)端口。“ack 25565”表示对序列号为25565的包进行确认,“win 8970”则指明发送窗口的大小为8760。

2. ARP包的输出信息

若使用“tcpdump arp -c 2”命令截获ARP数据包,得到的输出结果可能是:

20:42:22.713502 eth0 
> arp who-has mag tell tiger 
(00:d0:59:bf:da:06)
20:42:22.713907 eth0 
< arp reply mag is-at 08:90:b0:2f:af:46
 (00:d0:59:bf:da:06)


在输出的信息中,“20:42:22”为截获数据包的时间;“713502”和“713907”为毫秒数;“eth0 >”表明从主机发出该数据包;“eth0 <”表明从主机接收该数据包。“arp”表明该数据包是ARP请求,“who-has mag tell tiger”表明是主机“tiger”请求主机“mag”的MAC地址,“00:d0:59:bf:da:06”是主机“tiger”的MAC地址。“reply mag is-at”表明主机“mag”响应“tiger”的ARP请求,“08:90:b0:2f:af:46”是主机“mag”的MAC地址。

3. TCP包的输出信息

用Tcpdump截获的TCP包的一般输出格式如下:

src > dst: flags data-sequno ack window urgent options


“src > dst:”标明从源地址到目的地址;flags是TCP包中的标志信息,包括S(SYN)标志、F(FIN)标志、P(PUSH)标志、R(RST)标志和“.”(没有标志);data-sequno是数据包中的数据序列号;ack是下次期望的数据序列号;window是接收缓存的窗口大小;urgent标明数据包中是否有紧急指针;options是可能的选项值。

4. UDP包的输出信息

用Tcpdump截获的UDP包的一般输出格式如下:

src.port1 > dst.port2: udp lenth


UDP中包含的信息很简单。上面的输出结果表明从主机“src”的“port1”端口发出的一个UDP数据包被送到主机“dst”的“port2”端口,数据包的类型是UDP,其长度为“lenth”。

通过上面的介绍可以知道,Tcpdump是一个命令行方式的嗅探器。它可以根据需要显示出经过一个网络接口的所有数据包,供网络管理员对网络进行检测。但由于采用的是命令行方式,对这些数据包的分析可能会比较困难。利用Tcpdump提供的表达式过滤一些截获的数据包,可以从截获的大量数据包中提取出有用的信息,从而能够有针对性地对网络进行监测。

由于所有网络嗅探器的原理都大体相似,因而Tcpdump的基本知识可以应用于几乎所有的嗅探器。Tcpdump是基于命令行方式的嗅探器,其输出结果比较难于分析,因此很多网络管理员都使用图形化的嗅探器来检测网络故障,并处理可能存在的安全问题。下次将介绍两个图形化的网络嗅探器—Ethereal和EhterApe。同Tcpdump相比,使用这两个嗅探器的分析过程要简单许多。

原文转自:http://www.ltesting.net