linuxtcpdump使用详解.docx
《linuxtcpdump使用详解.docx》由会员分享,可在线阅读,更多相关《linuxtcpdump使用详解.docx(17页珍藏版)》请在冰豆网上搜索。
linuxtcpdump使用详解
Linux下抓包工具tcpdump应用详解
TCPDUMP简介
在传统的网络分析和测试技术中,嗅探器(sniffer)是最常见,也是最重要的技术之一。
sniffer工具首先是为网络管理员和网络程序员进行网络分析而设计的。
对于网络管理人员来说,使用嗅探器可以随时掌握网络的实际情况,在网络性能急剧下降的时候,可以通过sniffer工具来分析原因,找出造成网络阻塞的来源。
对于网络程序员来说,通过sniffer工具来调试程序。
用过windows平台上的sniffer工具(例如,netxray和snifferpro软件)的朋友可能都知道,在共享式的局域网中,采用sniffer工具简直可以对网络中的所有流量一览无余!
Sniffer工具实际上就是一个网络上的抓包工具,同时还可以对抓到的包进行分析。
由于在共享式的网络中,信息包是会广播到网络中所有主机的网络接口,只不过在没有使用sniffer工具之前,主机的网络设备会判断该信息包是否应该接收,这样它就会抛弃不应该接收的信息包,sniffer工具却使主机的网络设备接收所有到达的信息包,这样就达到了网络监听的效果。
Linux作为网络服务器,特别是作为路由器和网关时,数据的采集和分析是必不可少的。
所以,今天我们就来看看Linux中强大的网络数据采集分析工具——TcpDump。
用简单的话来定义tcpdump,就是:
dumpthetrafficeonanetwork,根据使用者的定义对网络上的数据包进行截获的包分析工具。
作为互联网上经典的的系统管理员必备工具,tcpdump以其强大的功能,灵活的截取策略,成为每个高级的系统管理员分析网络,排查问题等所必备的东东之一。
顾名思义,TcpDump可以将网络中传送的数据包的“头”完全截获下来提供分析。
它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。
tcpdump提供了源代码,公开了接口,因此具备很强的可扩展性,对于网络维护和入侵者都是非常有用的工具。
tcpdump存在于基本的FreeBSD系统中,由于它需要将网络界面设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。
因此系统中存在网络分析工具主要不是对本机安全的威胁,而是对网络上的其他计算机的安全存在威胁。
普通情况下,直接启动tcpdump将监视第一个网络界面上所有流过的数据包。
-----------------------
bash-2.02#tcpdump
tcpdump:
listeningoneth0
11:
58:
47.873028bios-ns>bios-ns:
udp50
11:
58:
47.9743310:
10:
7b:
8:
3a:
56>1:
80:
c2:
0:
0:
0802.1dui/Clen=43
00000000008000001007cf0809000000
0e800000902b46950980870100140002
000f0000902b4695000800
11:
58:
48.3731340:
0:
e8:
5b:
6d:
85>Broadcastsape0ui/Clen=97
ffff00600004ffffffffffffffffffff
0452ffffffff0000e85b6d8540080002
06404d41535445525f57454200000000
000000
^C
------------------------
首先我们注意一下,从上面的输出结果上可以看出来,基本上tcpdump总的的输出格式为:
系统时间来源主机.端口>目标主机.端口数据包参数
TcpDump的参数化支持
tcpdump支持相当多的不同参数,如使用-i参数指定tcpdump监听的网络界面,这在计算机具有多个网络界面时非常有用,使用-c参数指定要监听的数据包数量,使用-w参数指定将监听到的数据包写入文件中保存,等等。
然而更复杂的tcpdump参数是用于过滤目的,这是因为网络中流量很大,如果不加分辨将所有的数据包都截留下来,数据量太大,反而不容易发现需要的数据包。
使用这些参数定义的过滤规则可以截留特定的数据包,以缩小目标,才能更好的分析网络中存在的问题。
tcpdump使用参数指定要监视数据包的类型、地址、端口等,根据具体的网络问题,充分利用这些过滤规则就能达到迅速定位故障的目的。
请使用mantcpdump查看这些过滤规则的具体用法。
显然为了安全起见,不用作网络管理用途的计算机上不应该运行这一类的网络分析软件,为了屏蔽它们,可以屏蔽内核中的bpfilter伪设备。
一般情况下网络硬件和TCP/IP堆栈不支持接收或发送与本计算机无关的数据包,为了接收这些数据包,就必须使用网卡的混杂模式,并绕过标准的TCP/IP堆栈才行。
在FreeBSD下,这就需要内核支持伪设备bpfilter。
因此,在内核中取消bpfilter支持,就能屏蔽tcpdump之类的网络分析工具。
并且当网卡被设置为混杂模式时,系统会在控制台和日志文件中留下记录,提醒管理员留意这台系统是否被用作攻击同网络的其他计算机的跳板。
May1516:
27:
20host1/kernel:
fxp0:
promiscuousmodeenabled
虽然网络分析工具能将网络中传送的数据记录下来,但是网络中的数据流量相当大,如何对这些数据进行分析、分类统计、发现并报告错误却是更关键的问题。
网络中的数据包属于不同的协议,而不同协议数据包的格式也不同。
因此对捕获的数据进行解码,将包中的信息尽可能的展示出来,对于协议分析工具来讲更为重要。
昂贵的商业分析工具的优势就在于它们能支持很多种类的应用层协议,而不仅仅只支持tcp、udp等低层协议。
从上面tcpdump的输出可以看出,tcpdump对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。
显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump截获数据并保存到文件中,然后再使用其他程序进行解码分析。
当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
TCP功能
数据过滤
不带任何参数的TcpDump将搜索系统中所有的网络接口,并显示它截获的所有数据,这些数据对我们不一定全都需要,而且数据太多不利于分析。
所以,我们应当先想好需要哪些数据,TcpDump提供以下参数供我们选择数据:
-b在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
例如:
tcpdump-barp将只显示网络中的arp即地址转换协议信息。
-i选择过滤的网络接口,如果是作为路由器至少有两个网络接口,通过这个选项,就可以只过滤指定的接口上通过的数据。
例如:
tcpdump-ieth0只显示通过eth0接口上的所有报头。
src、dst、port、host、net、ether、gateway这几个选项又分别包含src、dst、port、host、net、ehost等附加选项。
他们用来分辨数据包的来源和去向,srchost192.168.0.1指定源主机IP地址是192.168.0.1,dstnet192.168.0.0/24指定目标是网络192.168.0.0。
以此类推,host是与其指定主机相关无论它是源还是目的,net是与其指定网络相关的,ether后面跟的不是IP地址而是物理地址,而gateway则用于网关主机。
可能有点复杂,看下面例子就知道了:
tcpdumpsrchost192.168.0.1anddstnet192.168.0.0/24
过滤的是源主机为192.168.0.1与目的网络为192.168.0.0的报头。
tcpdumpethersrc00:
50:
04:
BA:
9Banddst……
过滤源主机物理地址为XXX的报头(为什么ethersrc后面没有host或者net?
物理地址当然不可能有网络喽)。
Tcpdumpsrchost192.168.0.1anddstportnottelnet
过滤源主机192.168.0.1和目的端口不是telnet的报头。
ipicmparprarp和tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型。
例如:
tcpdumpipsrc……
只过滤数据-链路层上的IP报头。
tcpdumpudpandsrchost192.168.0.1
只过滤源主机192.168.0.1的所有udp报头。
数据显示/输入输出
TcpDump提供了足够的参数来让我们选择如何处理得到的数据,如下所示:
-l可以将数据重定向。
如tcpdump-l>tcpcap.txt将得到的数据存入tcpcap.txt文件中。
-n不进行IP地址到主机名的转换。
如果不使用这一项,当系统中存在某一主机的主机名时,TcpDump会把IP地址转换为主机名显示,就像这样:
eth0.telnet,使用-n后变成了:
eth0<192.168.0.9.1165>192.168.0.1.telnet。
-nn不进行端口名称的转换。
上面这条信息使用-nn后就变成了:
eth0.23。
-N不打印出默认的域名。
还是这条信息-N后就是:
eth0router.telnet。
-O不进行匹配代码的优化。
-t不打印UNIX时间戳,也就是不显示时间。
-tt打印原始的、未格式化过的时间。
-v详细的输出,也就比普通的多了个TTL和服务类型。
[expression]的用法:
expression是tcpdump最为有用的高级用法,可以利用它来匹配一些特殊的包。
下面介绍一下expression的用法,主要是如何写出符合要求最为严格expression。
如果tcpdump中没有expression,那么tcpdump会把网卡上的所有数据包输出,否则会将被expression匹配的包输出。
expression由一个或多个[primitives]组成,而[primitives]由一个或多个[qualitifer]加一个id(name)或数字组成,它们的结构如用正则表达式则可表示为:
expression=([qualitifer]+(id|number))+
依次看来,expression是一个复杂的条件表达式,其中[qualitifer]+(id|number)就是一个比较基本条件,qualitifer就表达一些的名称(项,变量),id或number则表示一个值(或常量)。
qualitifer共有三种,分别是:
type表示idname或number涉及到的类型,这些词有host,nest,port,portrange等等。
例子:
hostfoo此为一个简单的primitive,host为qualitifer,foo为idname
net128.3net为qualitifer,128.3为number
port20
等等
每个privimtive必须有一个type词,如果表达式中没有,则默认是host.
dir指定数据传输的方向,这些词有src,dst,srcordst,srcanddst
例子:
dstnet128.3;此为一个相对复杂的primitive,结构为dirtypenumber,表示目标网络为128.3的条件。
srcordstportftp-data此为比上一个相对简的结构,srcordst表示源或目标,ftp-data为id,表示ftp协议中数据传输端口,故整体表示源或目标端口ftp-data的数据包即匹配。
如果在一个primitive中没有dir词,此默认为srcordst.如hostfoo则表示源或目标主机为foo的数据包都匹配。
proto此种词是用来匹配某种特定协议的,这些词包括:
ether,fddi,tr,wlan,ip,ip6,arp,rarp,decnet,tcp和udp。
其实这些词经常用来匹配某种协议,是使用率最高的一组词了。
上面三种qualitifer和idname或number组成一个primitive通常是下面这种方式的:
protodirtypeid(number),即primitive=protodirtype(id|number)
如:
tcpsrcport80
ipdsthost192.168.1.1
如果出现type的话,一定会出现id或num
如果出现dir,那么也会出现type,如果不出现,默认为host
而proto可单独出现,如tcpdump'tcp'
通过上面介绍的三种qualitifer,我们很快就可以写出一个primitive,下面我就只用一个primitive作为expression匹配数据包。
(1)匹配ether包
匹配特定mac地址的数据包。
tcpdump'ethersrc00:
19:
21:
1D:
75:
E6'
匹配源mac为00:
19:
21:
1D:
75:
E6的数据包其中src可改为dst,srcordst来匹改变条件
匹配ether广播包。
ether广播包的特征是mac全1.故如下即可匹配:
tcpdump'etherdstff:
ff:
ff:
ff:
ff:
ff'
ylin@ylin:
~$sudotcpdump-c1'etherdstff:
ff:
ff:
ff:
ff:
ff'
tcpdump:
verboseoutputsuppressed,use-vor-vvforfullprotocoldecode
listeningoneth0,link-typeEN10MB(Ethernet),capturesize96bytes
10:
47:
57.784099arpwho-has192.168.240.77tell192.168.240.189
在此,只匹配1个包就退出了。
第一个是arp请求包,arp请求包的是采用广播的方式发送的,被匹配那是当之无愧的。
匹配ether组播包,ether的组播包的特征是mac的最高位为1,其它位用来表示组播组编号,如果你想匹配其的多播组,知道它的组MAC地址即可。
如
tcpdump'etherdst'Mac_Address表示地址,填上适当的即可。
如果想匹配所有的ether多播数据包,那么暂时请放下,下面会继续为你讲解更高级的应用。
(2)匹配arp包
arp包用于IP到Mac址转换的一种协议,包括arp请求和arp答应两种报文,arp请求报文是ether广播方式发送出去的,也即arp请求报文的mac地址是全1,因此用etherdstFF;FF;FF;FF;FF;FF可以匹配arp请求报文,但不能匹配答应报文。
因此要匹配arp的通信过程,则只有使用arp来指定协议。
tcpdump'arp'即可匹配网络上arp报文。
ylin@ylin:
~$arping-c4192.168.240.1>/dev/null&sudotcpdump-p'arp'
[1]9293
WARNING:
interfaceisignored:
Operationnotpermitted
tcpdump:
verboseoutputsuppressed,use-vor-vvforfullprotocoldecode
listeningoneth0,link-typeEN10MB(Ethernet),capturesize96bytes
11:
09:
25.042479arpwho-has192.168.240.1(00:
03:
d2:
20:
04:
28(ouiUnknown))tellylin.local
11:
09:
25.042702arpreply192.168.240.1is-at00:
03:
d2:
20:
04:
28(ouiUnknown)
11:
09:
26.050452arpwho-has192.168.240.1(00:
03:
d2:
20:
04:
28(ouiUnknown))tellylin.local
11:
09:
26.050765arpreply192.168.240.1is-at00:
03:
d2:
20:
04:
28(ouiUnknown)
11:
09:
27.058459arpwho-has192.168.240.1(00:
03:
d2:
20:
04:
28(ouiUnknown))tellylin.local
11:
09:
27.058701arpreply192.168.240.1is-at00:
03:
d2:
20:
04:
28(ouiUnknown)
11:
09:
33.646514arpwho-hasylin.localtell192.168.240.1
11:
09:
33.646532arpreplyylin.localis-at00:
19:
21:
1d:
75:
e6(ouiUnknown)
本例中使用arping-c4192.168.240.1产生arp请求和接收答应报文,而tcpdump-p'arp'匹配出来了。
此处-p选项是使网络工作于正常模式(非混杂模式),这样是方便查看匹配结果。
(3)匹配IP包
众所周知,IP协议是TCP/IP协议中最重要的协议之一,正是因为它才能把Internet互联起来,它可谓功不可没,下面分析匹配IP包的表达式。
对IP进行匹配
tcpdump'ipsrc192.168.240.69'
ylin@ylin:
~$sudotcpdump-c3'ipsrc192.168.240.69'
tcpdump:
verboseoutputsuppressed,use-vor-vvforfullprotocoldecode
listeningoneth0,link-typeEN10MB(Ethernet),capturesize96bytes
11:
20:
00.973605IPylin.local.51486>.ssh:
S2706301341:
2706301341(0)win5840
11:
20:
00.974328IPylin.local.32849>192.168.200.150.domain:
5858+PTR?
20.200.168.192.in-addr.arpa.(45)
11:
20:
01.243490IPylin.local.51486>.ssh:
.ack2762262674win183
IP广播组播数据包匹配:
只需指明广播或组播地址即可
tcpdump'ipdst240.168.240.255'
ylin@ylin:
~$sudotcpdump'ipdst192.168.240.255'
tcpdump:
verboseoutputsuppressed,use-vor-vvforfullprotocoldecode
listeningoneth0,link-typeEN10MB(Ethernet),capturesize96bytes
11:
25:
29.690658IPdd.local>192.168.240.255:
ICMPechorequest,id10022,seq1,length64
11:
25:
30.694989IPdd.local>192.168.240.255:
ICMPechorequest,id10022,seq2,length64
11:
25:
31.697954IPdd.local>192.168.240.255:
ICMPechorequest,id10022,seq3,length64
11:
25:
32.697970IPdd.local>192.168.240.255:
ICMPechorequest,id10022,seq4,length64
11:
25:
33.697970IPdd.local>192.168.240.255:
ICMPechorequest,id10022,seq5,length64
11:
25:
34.697982IPdd.local>192.168.240.255:
ICMPechorequest,id10022,seq6,length64
此处匹配的是ICMP的广播包,要产生此包,只需要同一个局域网的另一台主机运行ping-b192.168.240.255即可,当然还可产生组播包,由于没有适合的软件进行模拟产生,在此不举例子。
(4)匹配TCP数据包
TCP同样是TCP/IP协议栈里面最为重要的协议之一,它提供了端到端的可靠数据流,同时很多应用层协议都是把TCP作为底层的通信协议,因为TCP的匹配是非常重要的。
如果想匹配HTTP的通信数据,那只需指定匹配端口为80的条件即可
tcpdump'tcpdstport80'
ylin@ylin:
~$wget2>11>/dev/null&sudotcpdump-c5'tcpport80'
[1]10762
tcpdump:
verboseoutputsuppressed,use-vor-vvforfullprotocoldecode
listeningoneth0,link-typeEN10MB(Ethernet),capturesize96bytes
12:
02:
47.549056IPxd-22-43-.www>ylin.local.47945: