tcpdump高级用法
Posted 海枫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tcpdump高级用法相关的知识,希望对你有一定的参考价值。
Tcpdump高级用法
作者:林海枫
[*]转载请注明作者,请匆用于商业用途。
在linux下输入man tcpdump,在manual的开始会看到如下内容:
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ]
[ -C file_size ] [ -F file ]
[ -i interface ] [ -m module ] [ -M secret ]
[ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
[ -W filecount ]
[ -E spi@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -Z user ]
[ expression ]
这是tcpdump的格式介绍,本文只分析[expression]的写法,如何写出 严格的匹配条件。因为在大型的网络中,数据包的目数是非常多的,如果不进行严格的匹配,可能对协议的分析造成很大影响。 在此不讨论expression前面的选项,因此它在手册有比较全面的介绍,下面就expression进行介绍。
[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 表示id name或number涉及到的类型,这些词有host, nest, port ,portrange等等。
例子:
host foo 此为一个简单的primitive,host为qualitifer, foo为id name
net 128.3 net为qualitifer, 128.3为number
port 20
等等
每个privimtive必须有一个type词,如果表达式中没有,则默认是host.
dir 指定数据传输的方向,这些词有src, dst, src or dst, src and dst
例子:
dst net 128.3 ;此为一个相对复杂的primitive,结构为dir type number,表示目标网络为128.3的条件。
src or dst port ftp-data 此为比上一个相对简的结构,src or dst表示源或目标,ftp-data为id,表示ftp协议中数据传输端口,故整体表示源或目标端口ftp-data的数据包即匹配。
如果在一个primitive中没有dir词,此默认为src or dst. 如 host foo则表示源或目标主机为foo的数据包都匹配。
proto 此种词是用来匹配某种特定协议的,这些词包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet,tcp和udp。其实这些词经常用来匹配某种协议,是使用率最高的一组词了。
上面三种qualitifer和id name或number组成一个primitive通常是下面这种方式的:
proto dir type id(number) ,即primitive=proto dir type (id | number)
如:
tcp src port 80
ip dst host 192.168.1.1
如果出现type的话,一定会出现id或num
如果出现dir,那么也会出现type,如果不出现,默认为host
而proto可单独出现,如 tcpdump 'tcp'
通过上面介绍的三种qualitifer,我们很快就可以写出一个primitive,下面我就只用一个primitive作为expression匹配数据包。
(1)匹配ether包
匹配特定mac地址的数据包。
tcpdump 'ether src 00:19:21:1D:75:E6'
匹配源mac为00:19:21:1D:75:E6的数据包其中src可改为dst, src or dst来匹改变条件
匹配ether广播包。ether广播包的特征是mac全1.故如下即可匹配:
tcpdump 'ether dst ff:ff:ff:ff:ff:ff'
ylin@ylin:~$ sudo tcpdump -c 1 'ether dst ff:ff:ff:ff:ff:ff'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:47:57.784099 arp who-has 192.168.240.77 tell 192.168.240.189
在此,只匹配1个包就退出了。第一个是arp请求包,arp请求包的是采用广播的方式发送的,被匹配那是当之无愧的。
匹配ether组播包,ether的组播包的特征是mac的最高位为1,其它位用来表示组播组编号,如果你想匹配其的多播组,知道它的组MAC地址即可。如
tcpdump 'ether dst <Mac_Adrress>' Mac_Address表示地址,填上适当的即可。如果想匹配所有的ether多播数据包,那么暂时请放下,下面会继续为你讲解更高级的应用。
(2)匹配arp包
arp包用于IP到Mac址转换的一种协议,包括arp请求和arp答应两种报文,arp请求报文是ether广播方式发送出去的,也即 arp请求报文的mac地址是全1,因此用ether dst FF;FF;FF;FF;FF;FF可以匹配arp请求报文,但不能匹配答应报文。因此要匹配arp的通信过程,则只有使用arp来指定协议。
tcpdump 'arp' 即可匹配网络上arp报文。
ylin@ylin:~$ arping -c 4 192.168.240.1>/dev/null& sudo tcpdump -p 'arp'
[1] 9293
WARNING: interface is ignored: Operation not permitted
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:09:25.042479 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local
11:09:25.042702 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)
11:09:26.050452 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local
11:09:26.050765 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)
11:09:27.058459 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local
11:09:27.058701 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)
11:09:33.646514 arp who-has ylin.local tell 192.168.240.1
11:09:33.646532 arp reply ylin.local is-at 00:19:21:1d:75:e6 (oui Unknown)
本例中使用arping -c 4 192.168.240.1产生arp请求和接收答应报文,而tcpdump -p 'arp'匹配出来了。此处-p选项是使网络工作于正常模式(非混杂模式),这样是方便查看匹配结果。
(3)匹配IP包
众所周知,IP协议是TCP/IP协议中最重要的协议之一,正是因为它才能把Internet互联起来,它可谓功不可没,下面分析匹配IP包的表达式。
对IP进行匹配
tcpdump 'ip src 192.168.240.69'
ylin@ylin:~$ sudo tcpdump -c 3 'ip src 192.168.240.69'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:20:00.973605 IP ylin.local.51486 > walnut.crossbeamsys.com.ssh: S 2706301341:2706301341(0) win 5840 <mss 1460,sackOK,timestamp 1687608 0,nop,wscale 5>
11:20:00.974328 IP ylin.local.32849 > 192.168.200.150.domain: 5858+ PTR? 20.200.168.192.in-addr.arpa. (45)
11:20:01.243490 IP ylin.local.51486 > walnut.crossbeamsys.com.ssh: . ack 2762262674 win 183 <nop,nop,timestamp 1687676 4155416897>
IP广播组播数据包匹配:只需指明广播或组播地址即可
tcpdump 'ip dst 240.168.240.255'
ylin@ylin:~$ sudo tcpdump 'ip dst 192.168.240.255'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:25:29.690658 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 1, length 64
11:25:30.694989 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 2, length 64
11:25:31.697954 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 3, length 64
11:25:32.697970 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 4, length 64
11:25:33.697970 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 5, length 64
11:25:34.697982 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 6, length 64
此处匹配的是ICMP的广播包,要产生此包,只需要同一个局域网的另一台主机运行ping -b 192.168.240.255即可,当然还可产生组播包,由于没有适合的软件进行模拟产生,在此不举例子。
(4)匹配TCP数据包
TCP同样是TCP/IP协议栈里面最为重要的协议之一,它提供了端到端的可靠数据流,同时很多应用层协议都是把TCP作为底层的通信协议,因为TCP的匹配是非常重要的。
如果想匹配HTTP的通信数据,那只需指定匹配端口为80的条件即可
tcpdump 'tcp dst port 80'
ylin@ylin:~$ wget http://www.baidu.com 2>1 1 >/dev/null & sudo tcpdump -c 5 'tcp port 80'
[1] 10762
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
12:02:47.549056 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: S 1202130469:1202130469(0) ack 1132882351 win 2896 <mss 1460,sackOK,timestamp 3497190920 2329221,nop,wscale 2>
12:02:47.549085 IP ylin.local.47945 > xd-22-43-a8.bta.net.cn.www: . ack 1 win 183 <nop,nop,timestamp 2329258 3497190920>
12:02:47.549226 IP ylin.local.47945 > xd-22-43-a8.bta.net.cn.www: P 1:102(101) ack 1 win 183 <nop,nop,timestamp 2329258 3497190920>
12:02:47.688978 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: . ack 102 win 698 <nop,nop,timestamp 3497190956 2329258>
12:02:47.693897 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: . 1:1409(1408) ack 102 win 724 <nop,nop,timestamp 3497190957 2329258>
(5)匹配udp数据包
udp是一种无连接的非可靠的用户数据报,因此udp的主要特征同样是端口,用如下方法可以匹配某一端口
tcpdump 'upd port 53' 查看DNS的数据包
ylin@ylin:~$ ping -c 1 www.baidu.com > /dev/null& sudo tcpdump -p udp port 53
[1] 11424
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
12:28:09.221950 IP ylin.local.32853 > 192.168.200.150.domain: 63228+ PTR? 43.22.108.202.in-addr.arpa. (44)
12:28:09.222607 IP ylin.local.32854 > 192.168.200.150.domain: 5114+ PTR? 150.200.168.192.in-addr.arpa. (46)
12:28:09.487017 IP 192.168.200.150.domain > ylin.local.32853: 63228 1/0/0 (80)
12:28:09.487232 IP 192.168.200.150.domain > ylin.local.32854: 5114 NXDomain* 0/1/0 (140)
12:28:14.488054 IP ylin.local.32854 > 192.168.200.150.domain: 60693+ PTR? 69.240.168.192.in-addr.arpa. (45)
12:28:14.755072 IP 192.168.200.150.domain > ylin.local.32854: 60693 NXDomain 0/1/0 (122)
使用ping www.baidu.com目标是产生DNS请求和答应,53是DNS的端口号。
此外还有很多qualitifer是还没有提及的,下面是其它合法的primitive,在tcpdump中是可以直接使用的。
gateway host
匹配使用host 以上是关于tcpdump高级用法的主要内容,如果未能解决你的问题,请参考以下文章