作者:Phoenix
前言:在如令网络系统中,随着网络重要性、复杂性的不断增长,作为一名网络工程师、监测者、分析者或者是网络性能的评估者,您所扮演的角色对公司的成功是至关重要的。为了更好的完成工作,您需要透视整个网络,识别关键的性能问题——从应用的响应时间到带宽的瓶颈以至于识别网络每一层所出现的问题。在您每天的工作中,常常会着眼于未来用新的技术和应用扩展您的网络。网络探针分布在重要网段,监视该网络线路上各协议,各计算机占用情况,监控网络上各种业务的网络流量及带宽,记录网络操作,实现分布集中的网络分析Sniffer系统。本文将为你介绍如何利用嗅探器(sniffer)之网络数据采集分析工具TcpDump来详细网络及其安全分析。+ `6 G4 C- k) i7 t& N* M* g* b
一 嗅探器技术在网络中的应用
2 Z* _& A' U7 P& f- _
1 Sniffer简介
Sniffer即嗅探器的英文写法,嗅探器(sniffer)是最常见,也是最重要的技术之一。用过windows平台上的sniffer工具(例如,netxray和sniffer pro软件)的朋友可能都知道,在共享式的局域网中,采用sniffer工具简直可以对网络中的所有流量一览无余!Sniffer工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。其实,sniffer工具既可以适合于黑客的使用,也同样有利于网络管理员和网络程序员。对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。对于网络程序员来说,通过sniffer工具来调试程序。 , R. W8 N( H+ P
它也可以理解为一个安装在计算机上的窃听设备它可以用来窃听计算机在网络上所产生的众多的信息。简单一点解释:一部电话的窃听装置,可以用来窃听双方通话的内容,而计算机网络嗅探器则可以窃听计算机程序在网络上发送和接收到的数据。可是,计算机直接所传送的数据,事实上是大量的二进制数据。因此,一个网络窃听程序必须也使用特定的网络协议来分解嗅探到的数据,嗅探器也就必须能够识别出那个协议对应于这个数据片断,只有这样才能够进行正确的解码。计算机的嗅探器比起电话窃听器,有他独特的优势:很多的计算机网络采用的是“共享媒体"。就是说,你不必中断他的通讯,并且配置特别的线路,再安装嗅探器,你几乎可以在任何连接着的网络上直接窃听到你同一掩码范围内的计算机网络数据。我们称这种窃听方式为“基于混杂模式的嗅探”(promiscuousmode)。尽管如此,这种“共享”的技术发展的很快,慢慢转向“交换”技术,这种技术会长期内会继续使用下去, 它可以实现有目的选择的收发数据。 ' L( M/ ?6 E/ [8 j, j
2 Sniffer在工作原理
以太网的数据传输是基于“共享”原理的:所有的同一本地网范围内的计算机共同接收到相同的数据包。这意味着计算机直接的通讯都是透明可见的。正是因为这样的原因,以太网卡都构造了硬件的“过滤器”这个过滤器将忽略掉一切和自己无关的网络信息。事实上是忽略掉了与自身MAC地址不符合的信息。嗅探程序正是利用了这个特点,它主动的关闭了这个嗅探器,也就是前面提到的设置网卡“混杂模式”。因此,嗅探程序就能够接收到整个以太网内的网络数据了信息了。
二 网络数据采集分析工具TcpDump的应用
1 网络数据采集分析工具TcpDump的简介
5 q% ~& i& i" P
顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。tcpdump就是一种免费的网络分析工具,尤其其提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。我们用尽量简单的话来定义tcpdump,就是:dump the traffice on a network.,根据使用者的定义对网络上的数据包进行截获的包分析工具。作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的东西之一。tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
, j3 @% k4 W+ M4 B$ U+ d' ^
2 网络数据采集分析工具TcpDump的安装
( ^, @2 L2 z% ]! z- X! x0 {
在linux下tcpdump的安装十分简单,一般由两种安装方式。一种是以rpm包的形式来进行安装。另外一种是以源程序的形式安装。( J. m: U" ]# J8 {# b4 Q
rpm包的形式安装:这种形式的安装是最简单的安装方法,rpm包是将软件编译后打包成二进制的格式,通过rpm命令可以直接安装,不需要修改任何东西。以超级用户登录,使用命令如下:
#rpm -ivh tcpdump-3_4a5.rpm2 X- Z( k0 T. b/ k! n2 X) S
- H2 a8 T& {5 r
这样tcpdump就顺利地安装到你的linux系统中。怎么样,很简单吧。
% E$ k: g+ u, e1 U6 x. m! E7 n
源程序的安装:既然rpm包的安装很简单,为什么还要采用比较复杂的源程序安装呢?其实,linux一个最大的诱人之处就是在她上面有很多软件是提供源程序的,人们可以修改源程序来满足自己的特殊的需要。所以我特别建议朋友们都采取这种源程序的安装方法。
第一步 取得源程序 在源程序的安装方式中,我们首先要取得tcpdump的源程序分发包,这种分发包有两种形式,一种是tar压缩包(tcpdump-3_4a5.tar.Z),另一种是rpm的分发包(tcpdump-3_4a5.src.rpm)。这两种形式的内容都是一样的,不同的仅仅是压缩的方式.tar的压缩包可以使用如下命令解开:$ x& ?: | m5 W! ]7 Q( {# C
#tar xvfz tcpdump-3_4a5.tar.Z
rpm的包可以使用如下命令安装:
#rpm -ivh tcpdump-3_4a5.src.rpm
这样就把tcpdump的源代码解压到/usr/src/redhat/SOURCES目录下. - P C5 f% L; Q6 l+ @
3 J# e1 [( T* U, [7 F
第二步 做好编译源程序前的准备活动
在编译源程序之前,最好已经确定库文件libpcap已经安装完毕,这个库文件是tcpdump软件所需的库文件。同样,你同时还要有一个标准的c语言编译器。在linux下标准的c 语言编译器一般是gcc。 在tcpdump的源程序目录中。有一个文件是Makefile.in,configure命令就是从Makefile.in文件中自动产生Makefile文件。在Makefile.in文件中,可以根据系统的配置来修改BINDEST 和 MANDEST 这两个宏定义,缺省值是3 ?" I Z. X6 n7 ]6 ^/ F6 b7 |
BINDEST = @sbindir@ 4 r, G3 Y: p; j
MANDEST = @mandir@
第一个宏值表明安装tcpdump的二进制文件的路径名,第二个表明tcpdump的man 帮助页的路径名,你可以修改它们来满足系统的需求。
第三步 编译源程序
使用源程序目录中的configure脚本,它从系统中读出各种所需的属性。并且根据Makefile.in文件自动生成Makefile文件,以便编译使用.make 命令则根据Makefile文件中的规则编译tcpdump的源程序。使用make install命令安装编译好的tcpdump的二进制文件。
总结一下就是:
# tar xvfz tcpdump-3_4a5.tar.Z) ?5 |, E* O$ }6 i5 w# v5 J8 A& `. D
# vi Makefile.in
# . /configure
# make1 V: |2 _7 N: X) E
# make install
, z7 o, I; r+ {$ c v
3 网络数据采集分析工具TcpDump的使用7 t) O. t% k5 A( E2 M2 Q2 n
$ ^6 p: S! Y/ M: G+ R
普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
# tcpdump ) J. W, U* B3 t; J7 B
tcpdump: listening on fxp0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43# E% x, ^/ N2 |! m% `% }
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=971 N6 Z9 q7 U h
ffff 0060 0004 ffff ffff ffff ffff ffff( m$ c6 |" s) i7 x2 _& i
0452 ffff ffff 0000 e85b 6d85 4008 00020 T! [: h0 l, u
0640 4d41 5354 4552 5f57 4542 0000 00006 A& O0 a0 I1 y
0000 00$ {7 E h- n0 F; ]6 E) T( e" u! U
^C
9 I) K) o: a( z ?- U& A, Z
tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。
6 O6 k) S) x% [9 ~
然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。请使用man tcpdump查看这些过滤规则的具体用法。, `- C8 W/ p0 s5 c
! L- q4 ~4 x4 Z1 D8 H
显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。在FreeBSD下,这就需要内核支持伪设备bpfilter。因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。. W- Q$ {: b2 e2 k# ^3 V/ ^( l
: U7 r3 @) J4 o* I
并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。
* B2 b9 L+ V5 M
May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled
虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。, |+ F! `' J# B. w' e9 F
. }4 Z. d M" S
从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。FreeBSD提供的一个有效的解码程序为tcpshow,它可以通过Packages Collection来安装。; _- ^) [$ ^6 N
0 f/ ]( R' [. T, n/ ~) H: q
# pkg_add /cdrom/packages/security/tcpshow*% \( i E- t. [0 Y. @- x0 t
# tcpdump -c 3 -w tcpdump.out. \0 v7 e- _/ {
tcpdump: listening on fxp0
# tcpshow < tcpdump.out
---------------------------------------------------------------------------6 @. R2 X% n: P% C
Packet 1 }- i/ q* W* ]6 M
TIME:12:00:59.984829. \( l- y* z X, H- q! y
LINK:00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026
<*** No decode support for encapsulated protocol ***>
---------------------------------------------------------------------------) a, Y- E% c3 [& O H% q
Packet 2
TIME:12:01:01.074513 (1.089684)$ m. v0 |' G- m/ O) H( Z
LINK:00:A0:C9:AB:3C
F -> FF:FF:FF:FF:FF:FF type=ARP
ARP:htype=Ethernet ptype=IP hlen=6 plen=4 op=request& S% t9 y- Y0 S9 ^3 v, x+ R
sender-MAC-addr=00:A0:C9:AB:3C
F sender-IP-address=202.102.245.3
target-MAC-addr=00:00:00:00:00:00 target-IP-address=202.102.245.3
---------------------------------------------------------------------------. m2 l$ C8 q1 s: D
Packet 3" s+ ^* a. {( a( s8 h _
TIME:12:01:01.985023 (0.910510)+ L( L, J, O$ R& @$ c
LINK:00:10:7B:08:3A:56 -> 01:80:C2:00:00:00 type=0026' W% c, G! h- c3 O
<*** No decode support for encapsulated protocol ***>
tcpshow能以不同方式对数据包进行解码,并以不同的方式显示解码数据,使用者可以根据其手册来选择最合适的参数对截获的数据包进行分析。从上面的例子中可以看出,tcpshow支持的协议也并不丰富,对于它不支持的协议就无法进行解码。4 c3 X9 E+ L; ]* g# ?# t
除了tcpdump之外,FreeBSD的Packages Collecion中还提供了Ethereal和Sniffit两个网络分析工具,以及其他一些基于网络分析方式的安全工具。其中Ethereal运行在X Window 下,具有不错的图形界面,Sniffit使用字符窗口形式,同样也易于操作。然而由于tcpdump对过滤规则的支持能力更强大,因此系统管理员仍然更喜欢使用它。对于有经验的网络管理员,使用这些网络分析工具不但能用来了解网络到底是如何运行的,故障出现在何处,还能进行有效的统计工作,如那种协议产生的通信量占主要地位,那个主机最繁忙,网络瓶颈位于何处等等问题。因此网络分析工具是用于网络管理的宝贵系统工具。为了防止数据被滥用的网络分析工具截获,关键还是要在网络的物理结构上解决。常用的方法是使用交换机或网桥将信任网络和不信任网络分隔开,可以防止外部网段窃听内部数据传输,但仍然不能解决内部网络与外部网络相互通信时的数据安全问题。如果没有足够的经费将网络上的共享集线器升级为以太网交换机,可以使用FreeBSD系统执行网桥任务。这需要使用option BRIDGE编译选项重新定制内核,此后使用bridge命令启动网桥功能。
tcpdump采用命令行方式,它的命令格式为:
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ] {5 J5 ?* i% P5 e5 J* ]0 v5 j; F/ E
[ -T 类型 ] [ -w 文件名 ] [表达式 ]
, w- J8 L) C) t. E- s
(1). tcpdump的选项介绍
2 s* _( B7 h$ K' E0 E
-a 将网络地址和广播地址转变成名字;, G4 E$ _( Y7 c6 e7 F
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;3 X9 S& Q& d4 }. ?8 ~, H
-dd 将匹配信息包的代码以c语言程序段的格式给出;
-ddd 将匹配信息包的代码以十进制的形式给出;% D, E2 ?% T4 U) I2 r4 H5 m
-e 在输出行打印出数据链路层的头部信息;$ s' x9 ]& M* m6 v7 W7 U' D& ~
-f 将外部的Internet地址以数字的形式打印出来;6 X, h# i1 D# i) R5 _
-l 使标准输出变为缓冲行形式;0 F# c$ E) d; b9 L+ j/ ~: J; X
-n 不把网络地址转换成名字;2 @ V3 | r8 R0 M/ l
-t 在输出的每一行不打印时间戳;
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;( }/ A# p# U& {1 _! c% ?
-vv 输出详细的报文信息;/ j$ m0 q$ d$ F& n1 ^
-c 在收到指定的包的数目后,tcpdump就会停止;
-F 从指定的文件中读取表达式,忽略其它的表达式;3 H& \! c, G( M8 z" `8 w
-i 指定监听的网络接口;
-r 从指定的文件中读取包(这些包一般通过-w选项产生);
-w 直接将包写入文件中,并不分析和打印出来;4 t! n) C" G: F5 R! Q( U
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程 调用)和snmp(简单 网络管理协议;)
(2). tcpdump的表达式介绍2 a( h' a' K. |) V7 X9 i6 ~( q! z
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。在表达式中一般如下几种类型的关键字。4 V, [2 x4 B6 e9 }* k
! m" o6 y+ S J0 ]8 P
第一种是关于类型的关键字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是host.+ y- }4 t0 l" z
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。0 r* L* h! b; V$ g5 U0 j
. n3 }; D: F6 C, M
第三种是协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型。Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'or' ,'││';这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来说明。
A想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:' t+ C1 @' M1 ]& O' P/ S a
#tcpdump host 210.27.48.1
B想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令:(在命令行中适用 括号时,一定要
#tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) & Q/ p+ t9 H9 N2 }; c5 Z
C如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:% H& n; Z9 Y8 {, W! a
#tcpdump tcp port 23 host 210.27.48.1 & _0 p( O0 \+ s+ J, A" a& c
$ R0 }% R/ e- ]+ ^2 E
(3). tcpdump的输出结果介绍- T% P. Z+ `0 T1 z% I8 I! r' Q& e
( U) Z% B* E* Q3 k- j
下面我们介绍几种典型的tcpdump命令的输出信息
& U, t4 P6 g: {2 w1 T$ r
A,数据链路层头信息
7 H1 n: T0 t$ Q% \* I
使用命令
#tcpdump --e host ice7 M9 ?9 |% t! M# C- w' Y8 }
ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条命令的输出结果如下所示:
21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.telne. b* K; A( o: n# H, M
t 0:0(0) ack 22535 win 8760 (DF)' ~% x% ]" O! [: ?
4 z/ I& C; v: @' j3 v
分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535 表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.
B,ARP包的TCPDUMP输出信息% W8 ]3 W4 r0 y @. i- Z" k" q
, H+ M6 h2 o4 C6 q5 S/ ~" [6 U
使用命令) r1 Z! K' e/ v0 x
#tcpdump arp / O3 t5 T; D g# d4 P z. q+ V
得到的输出结果是:
22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是ARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:58:af:1a是主机ICE的MAC地址。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |