捕捉网络分组数据
tcpdump [-ADeKlLnNqStvxX] [-B bufsize] [-c count] [-F file] [-i interface] [-r file] [-w file] [-y datalink] [expression]
tcpdump命令用于捕捉网络接口中匹配指定表达式的分组数据。其中,expression是一种特殊的表达式,用于选择分组数据,详见“表达式”一节的说明。
若未指定“-c”选项,tcpdump将会连续地捕捉分组数据,直至按下Ctrl-C组合键。如果指定了“-c”选项,在捕捉到指定数量的分组数据或按下Ctrl-C组合键之后,tcpdump将会停止数据的捕捉。
在捕捉分组数据结束时,tcpdump将会给出下列统计数据:
packets captured tcpdump读取与处理的分组数据数量。
packets received by filter tcpdump收到的分组数据数量。根据操作系统,这个数字表示收到的分组数据总量、匹配指定表达式的分组数据数量,以及匹配与处理的分组数据数量。
packets dropped by kernel 由于缺乏缓冲区空间导致tcpdump丢失的分组数据数量。
-A 以ASCII字符的形式输出每个分组数据(忽略链路层头信息)。尤其适合于捕捉网页。
-B bufsize 用于设置系统捕捉缓冲区的大小。
-c count 捕捉到指定数量的分组数据后立即终止运行。
-D 显示tcpdump能够捕捉分组数据的网络接口。对于系统的每个可用网络接口,tcpdump将会输出接口编号、接口名或接口的文字描述。接口名或接口编号可用作“-i”选项的参数,以指定想要捕捉的网络接口。
-e 输出链路层分组数据头信息。
-F file 从指定的文件file中获取过滤表达式,忽略命令行提供的附加表达式。
-i interface 监听指定的网络接口。若未指定,tcpdump将会依次检索系统配置的网络接口,找出第一个可用的网络接口(环回接口除外)。指定的接口参数可以是接口名,如eth0,也可以是“-D”选项给出的接口编号。
-K 禁止验证IP、TCP或UDP的校验和。当网络接口本身计算校验和时,可以选用这个选项,避免产生误判。
-l 启用标准输出的行缓冲功能,以便在捕捉分组数据的同时也能观察捕捉的数据,如运行“tcpdump -l | tee save”命令,或在运行“tcpdump -l > save &”命令后再运行“tail -f save”命令。
-L 显示网络接口支持的数据链路类型。
-n 禁止把IP地址转换成主机名,从而避免访问DNS服务器。
-nn 禁止把协议与端口号等转换成相应的名字。
-N 禁止显示主机的规范域名。
-q 简化数据输出。显示较少的协议信息,故输出的数据行较短。
-r file 从指定的文件(先前利用“-w”选项保存的)而非网络接口中读取分组数据进行分析。如果指定的文件为“-”,表示从标准输入读取数据。
-S 显示绝对(而非相对)的TCP顺序号。
-t 禁止在每一行的输出数据前面显示时间。
-v 在解析和输出分组数据时,采用详细显示模式,显示IP分组数据中的TTL字段、标识字段、数据总长和选项等信息。同时也会执行分组数据的完整性检测,如验证IP与ICMP头信息的校验和等。当与“-w”选项一起使用,把捕捉的数据写入文件保存时,每10秒种后还要统计一次捕捉的分组数据数量。
-vv 比“-v”选项输出更多的信息,如NFS分组数据的附加字段,SMB分组数据的完整译码等。
-vvv 比“-vv”选项输出更多的信息,如输出网络应用的完整命令行等。
-w file 把捕捉的原始分组数据写入指定的文件中,既不解析也不显示,留待将来利用“-r”选项分析。如果指定的文件为“-”,表示写到标准输出。
-x 在解析和输出分组数据时,除了显示每个分组数据的头信息,还以十六进制数据形式显示分组数据中的实际数据(忽略链路层头信息)。
-xx 在“-x”选项的基础上增加链路层头信息。
-X 在解析和输出分组数据时,除了显示每个分组数据的头信息,还采用十六进制数据与ASCII字符两种形式,显示分组数据中的实际数据(忽略链路层头信息)。
-XX 在“-X”选项的基础上增加链路层头信息。
-y datalink 设置网络接口采用的数据链路类型,如iee802.3、iee820.11或EN10MB(Ethernet)等,以便正确地捕捉分组数据。参见“-L”选项的输出。
表达式expression用于选择匹配的分组数据。如果未指定表达式,意味着捕捉所有的分组数据,否则仅输出匹配表达式的分组数据。
表达式可由一个或多个基本元素(如主机名、网络名、IP地址或端口号等)组成,基本元素之前通常可以增加一个或多个限定符。tcpdump支持3种不同的限定符:类型、传输方向和协议。
在指定表达式时,可以按照捕捉类型、传输方向和协议,限定捕捉的分组数据。tcpdump支持的捕捉类型包括host、net、port和portrange(端口范围)等,如“host iscas”、“net 192.168.90”、“port 80”或“portrange 2600-2608”等。如果未指定捕捉类型,默认值为host。
传输方向用于限定捕捉收自或发往哪里的分组数据,其中包括src、dst、“src or dst”和“src and dst”等,如“src iscas”、“dst net 172.16.3”或“src or dst port ftp-data”等。如果未指定方向限定符,默认值为“src or dst”,即捕捉收发双向的分组数据。
协议用于限定匹配指定协议的分组数据,其中包括ether、tr、ip、arp、rarp、tcp和udp等,如“ip src iscas”、“arp net 192.168.90”、“tcp port 21”或“udp portrange 8000-8080”。如果未指定协议,表示与相应类型一致的所有协议。例如,“src iscas”意味着“(ip or arp or rarp) src iscas”,“net officenet”意味着“(ip or arp or rarp) net officenet”,“port 53”意味着“(tcp or udp) port 53”等。
下面列出了部分常用的基本表达式及其简单说明:
dst host host 表示捕捉目的地址字段匹配指定主机的分组数据,其中的host可以是主机名或IP地址。“dst host”之前可以加ip、arp或 rarp等予以限定。
src host host 表示捕捉源地址字段匹配指定主机的分组数据。同样,“src host”之前也可以加ip、arp或 rarp等予以限定。
host host 表示捕捉目的或源地址字段匹配指定主机的分组数据。关键字host之前也可以加ip、arp或 rarp等予以限定。
dst net net 表示捕捉目的地址字段匹配指定网络的分组数据,其中的net可以是网络名(取自/etc/networks文件)或IP地址。
src net net 表示捕捉源地址字段匹配指定网络的分组数据。
net net 表示捕捉目的或源地址字段匹配指定网络的分组数据。
net net mask netmask 表示捕捉地址字段匹配指定网络与子网掩码的分组数据。关键字net之前可以加src或dst予以限定。
net net/len 表示捕捉地址字段匹配指定网络与子网掩码的分组数据。关键字net之前可以加src或dst予以限定。
dst port port 表示捕捉目的端口字段匹配指定端口的分组数据,其中的port可以是端口名(取自/etc/services文件)或端口号。“dst port”之前可以加tcp或udp予以限定。
src port port 表示捕捉源端口字段匹配指定端口的分组数据。“src port”之前可以加tcp或udp予以限定。
port port 表示捕捉目的或源端口字段匹配指定端口的分组数据。关键字port之前可以加tcp或udp予以限定。
dst portrange port1-port2 表示捕捉目的端口字段匹配指定端口范围的分组数据。“dst portrange”之前可以加tcp或udp予以限定。
src portrange port1-port2 表示捕捉源端口字段匹配指定端口范围的分组数据。同样,“src portrange”之前也可以加tcp或udp予以限定。
portrange port1-port2 表示捕捉目的或源端口字段匹配指定端口范围的分组数据。portrange之前也可以加tcp或udp协议限定符。
ip proto protocol 表示捕捉的分组数是IPv4协议类型的分组数据。指定的协议protocol可以是一个数字,或tcp、udp、icmp、igmp与igrp等协议名之一。
tcp, udp, icmp 是“ip proto protocol”的缩写,分别对应于“ip proto tcp”、“ip proto udp”和“ip proto icmp”。
ether proto protocol 表示捕捉的分组数是Ethernet协议类型的分组数据。指定的protocol可以是一个数字,或ip、arp与rarp等协议名之一。注意,ip、arp和rarp也是关键字,之前必须加转义符号“\”。
ip, arp, rarp 是“ether proto protocol”的缩写,分别对应于“ether proto ip”、“ether proto arp”和“ether proto rarp”。
通过关系运算符或逻辑运算符,基本表达式可以构成更为复杂的组合表达式。其中,关系运算符可以是>、<、>=、<=、=或!=之一,逻辑运算符可以是!(not)、&&(and)或||(or)之一。当表达式是一个算术表达式时,还可以使用二进制算术运算符+、-、*、/、&、|、<<或>>等。
tcpdump命令的输出数据及格式依赖于网络协议。这里仅以TCP协议的分组数据为例,说明tcpdump命令输出数据的格式与意义。
TCP协议分组数据的常规输出格式如下:
time protocol src > dst: flags data-seqno ack window urgent options
其中,time是捕捉到分组数据的系统时间,通常以“hh:mm:ss.frac”形式表示。protocol是IP、arp或rarp等协议之一。src和dst分别是源和目的主机的IP地址及端口。flags是S(SYN)、F(FIN)、P(PUSH)、R(RST)、W(ECN CWR)或E(ECN-Echo)等标志的组合,句点“.”表示没有任何标志。data-seqno是分组数据的顺序号,以“first:last(nbytes)”形式表示分组数据中的数据部分与字节数。ack是预期收到的下一个分组数据的顺序号。window是接收缓冲区的字节数。urgent(urg)表示分组数据中存在需要“紧急”处理的数据。options是位于尖括号中的tcp选项,如“<mss 1024>”。
在输出数据中,src、dst和flags字段总是存在,至于其他字段是否存在,则取决于分组数据TCP协议头字段的内容。
下面是在Windows系统winxp使用ftp连接到Linux系统iscas(192.168.90.100)的注册会话过程中捕捉到的部分数据:
# tcpdump -t –X host 192.168.90.100 and tcp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes (1) IP winxp.evm > iscas.ftp: Flags [S], seq 382023813, win 65535, options [mss 1460,nop,wscale 0,nop,nop,TS val 0 ecr 0,nop,nop,sackOK], length 0 (2) IP iscas.ftp > winxp.evm: Flags [S.], seq 679777183, ack 382023814, win 5792, options [mss 1460,sackOK,TS val 4696938 ecr 0,nop,wscale 6], length 0 (3) IP winxp.evm > iscas.ftp: Flags [.], ack 1, win 65535, options [nop,nop,TS val 83204 ecr 4696938], length 0 (4) IP iscas.ftp > winxp.evm: Flags [P.], seq 1:21, ack 1, win 91, options [nop,nop,TS val 4696942 ecr 83204], length 20 0x0000: 4500 0048 38ca 4000 4006 cbcb c0a8 5a64 E..H8.@.@.....Zd 0x0010: c0a8 5a65 0015 0473 2884 93a0 16c5 3886 ..Ze...s(.....8. 0x0020: 8018 005b 3655 0000 0101 080a 0047 ab6e ...[6U.......G.n 0x0030: 0001 4504 3232 3020 2876 7346 5450 6420 ..E.220.(vsFTPd. 0x0040: 322e 322e 3229 0d0a 2.2.2).. (5) IP winxp.evm > iscas.ftp: Flags [.], ack 21, win 65515, options [nop,nop,TS val 83206 ecr 4696942], length 0 (6) IP winxp.evm > iscas.ftp: Flags [P.], seq 1:14, ack 21, win 65515, options [nop,nop,TS val 83340 ecr 4696942], length 13 0x0000: 4500 0041 0427 4000 4006 0076 c0a8 5a65 E..A.'@.@..v..Ze 0x0010: c0a8 5a64 0473 0015 16c5 3886 2884 93b4 ..Zd.s....8.(... 0x0020: 8018 ffeb 3852 0000 0101 080a 0001 458c ....8R........E. 0x0030: 0047 ab6e 5553 4552 2067 7178 696e 670d .G.nUSER.gqxing. 0x0040: 0a . (7) IP iscas.ftp > winxp.evm: Flags [.], ack 14, win 91, options [nop,nop,TS val 4710505 ecr 83340], length 0 (8) IP iscas.ftp > winxp.evm: Flags [P.], seq 21:55, ack 14, win 91, options [nop,nop,TS val 4710505 ecr 83340], length 34 0x0000: 4500 0056 38cc 4000 4006 cbbb c0a8 5a64 E..V8.@.@.....Zd 0x0010: c0a8 5a65 0015 0473 2884 93b4 16c5 3893 ..Ze...s(.....8. 0x0020: 8018 005b 3663 0000 0101 080a 0047 e069 ...[6c.......G.i 0x0030: 0001 458c 3333 3120 506c 6561 7365 2073 ..E.331.Please.s 0x0040: 7065 6369 6679 2074 6865 2070 6173 7377 pecify.the.passw 0x0050: 6f72 642e 0d0a ord... (9) IP winxp.evm > iscas.ftp: Flags [.], ack 55, win 65481, options [nop,nop,TS val 83342 ecr 4710505], length 0 (10) IP winxp.evm > iscas.ftp: Flags [P.], seq 14:29, ack 55, win 65481, options [nop,nop,TS val 83419 ecr 4710505], length 15 0x0000: 4500 0043 042f 4000 4006 006c c0a8 5a65 E..C./@.@..l..Ze 0x0010: c0a8 5a64 0473 0015 16c5 3893 2884 93d6 ..Zd.s....8.(... 0x0020: 8018 ffc9 0304 0000 0101 080a 0001 45db ..............E. 0x0030: 0047 e069 5041 5353 2061 6263 6431 3233 .G.iPASS.abcd123 0x0040: 340d 0a 4.. (11) IP iscas.ftp > winxp.evm: Flags [.], ack 29, win 91, options [nop,nop,TS val 4718456 ecr 83419], length 0 (12)IP iscas.ftp > winxp.evm: Flags [P.], seq 55:78, ack 29, win 91, options [nop,nop,TS val 4718537 ecr 83419], length 23 0x0000: 4500 004b 38ce 4000 4006 cbc4 c0a8 5a64 E..K8.@.@.....Zd 0x0010: c0a8 5a65 0015 0473 2884 93d6 16c5 38a2 ..Ze...s(.....8. 0x0020: 8018 005b 3658 0000 0101 080a 0047 ffc9 ...[6X.......G.. 0x0030: 0001 45db 3233 3020 4c6f 6769 6e20 7375 ..E.230.Login.su 0x0040: 6363 6573 7366 756c 2e0d 0a ccessful... (13) IP winxp.evm > iscas.ftp: Flags [.], ack 78, win 65458, options [nop,nop,TS val 83422 ecr 4718537], length 0 ^C 13 packets captured 13 packets received by filter 0 packets dropped by kernel #
第1行至第13行是tcpdump命令捕捉的数据(以“IP”为起始标志,缩进部分是收发的分组数据)。注意,行号只是为了说明方便而后加的,实际的输出数据不包含行号。
第1行表示winxp向iscas系统的TCP端口ftp发送了一个分组数据。S表示设置了SYN标志,分组数据的顺序号是382 023 813,接收缓冲区为65 535个字节,最大数据段的尺寸(max-segment-size,mss)为1460个字节,“length 0”表示分组数据中不包含实际的数据。
第2行和第3行表示iscas采用一个类似的分组数据确认了winxp发送的SYN连接请求,winxp接着又确认了iscas设置的SYN,“.”表示没有设置任何标志,分组数据中也不包含任何数据,因此没有数据顺序号字段。
注意,ack后的顺序号是一个小的整数(1)。当第一次捕捉到tcp分组数据时,tcpdump将会输出分组数据的绝对顺序号。对于随后捕捉的分组数据,tcpdump将会输出当前分组数据与初始分组数据顺序号的差。这意味着从第一个分组数据之后,顺序号可以解释为数据流的相对字节位置(每个传输方向的第一个数据字节从1开始编号)。利用tcpdump命令的“-S”选项,可以强制tcpdump输出分组数据的绝对顺序号。
第4行的“length 20”表示iscas向winxp发送了20个字节(包括回车换行字符)的数据 “220 (vsFTPd 2.2.2)”,同时设置分组数据的PUSH 标志。
第5行表示winxp收到了iscas发送的数据,并给予确认。
第6行的“length 13”表示winxp向iscas发送了13个字节的数据“USER gqxing”,同时设置分组数据的PUSH 标志。
第7行表示iscas收到了winxp发送的数据,并给予确认。
第8行的“length 34”表示iscas向winxp发送了34个字节的数据“331 Please specify the password.”,同时设置分组数据的PUSH 标志。
第9行表示winxp收到了iscas发送的数据,并给予确认。
第10行的“length 15”表示winxp向iscas发送了15个字节的数据“PASS abcd1234.”,同时设置分组数据的PUSH 标志。
第11行表示iscas收到了winxp发送的数据,并给予确认。
第12行的“length 23”表示iscas向winxp发送了23个字节的数据“230 Login successful.”,同时设置分组数据的PUSH 标志。
第13行表示winxp收到了iscas发送的数据,并给予确认。
索引:A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z