tcpdump高级用法

Posted 海枫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tcpdump高级用法相关的知识,希望对你有一定的参考价值。

Tcpdump高级用法

作者:林海枫

http://blog.csdn.net/linyt

[*]转载请注明作者,请匆用于商业用途。


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]的用法:

expressiontcpdump最为有用的高级用法,可以利用它来匹配一些特殊的包。下面介绍一下expression的用法,主要是如何写出符合要求最为严格expression。如果tcpdump中没有expression,那么tcpdump会把网卡上的所有数据包输出,否则会将被expression匹配的包输出。

expression 由一个或多个[primitives]组成,而[primitives]由一个或多个[qualitifer]加一个id(name)或数字组成,它们的结构如用正则表达式则可表示为:

expression = ([qualitifer+(id|number))+

依次看来,expression是一个复杂的条件表达式,其中[qualitifer+(id|number)就是一个比较基本条件,qualitifer就表达一些的名称(项,变量),idnumber则表示一个值(或常量)。

qualitifer共有三种,分别是:

type 表示id namenumber涉及到的类型,这些词有host, nest, port ,portrange等等。

例子:

host foo 此为一个简单的primitivehostqualitifer, fooid name

net 128.3 netqualitifer, 128.3number

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-dataid,表示ftp协议中数据传输端口,故整体表示源或目标端口ftp-data的数据包即匹配。

如果在一个primitive中没有dir词,此默认为src or dst. host foo则表示源或目标主机为foo的数据包都匹配。

proto 此种词是用来匹配某种特定协议的,这些词包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet,tcpudp。其实这些词经常用来匹配某种协议,是使用率最高的一组词了。

上面三种qualitiferid namenumber组成一个primitive通常是下面这种方式的:

proto dir type id(number) ,即primitive=proto dir type (id | number)

如:

tcp src port 80

ip dst host 192.168.1.1

如果出现type的话,一定会出现idnum

如果出现dir,那么也会出现type,如果不出现,默认为host

proto可单独出现,如 tcpdump 'tcp'

通过上面介绍的三种qualitifer,我们很快就可以写出一个primitive,下面我就只用一个primitive作为expression匹配数据包。

(1)匹配ether

匹配特定mac地址的数据包。

tcpdump 'ether src 00:19:21:1D:75:E6'

匹配源mac00:19:21:1D:75:E6的数据包其中src可改为dst, src or dst来匹改变条件

匹配ether广播包。ether广播包的特征是mac1.故如下即可匹配:

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包用于IPMac址转换的一种协议,包括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请求和答应,53DNS的端口号。

此外还有很多qualitifer是还没有提及的,下面是其它合法的primitive,tcpdump中是可以直接使用的。

gateway host

匹配使用host

以上是关于tcpdump高级用法的主要内容,如果未能解决你的问题,请参考以下文章

Git高级一点的用法

Python的5种高级用法

swift 高级用法

Redis高级用法与删除方式

Kotlin介绍系列(三)高级用法之DataClass

python+requests——高级用法——超时