在Linux操作系统中,tcpdump用来抓取网络中的数据包,本文内容是对man手册中tcpdump相关知识的翻译以及一些附加的例子等。
NAME
tcpdump – dump traffic on a network
SYNOPSIS
1 2 3 4 5 6 7 8 9 |
tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ] [ -C file_size ] [ -G rotate_seconds ] [ -F file ] [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ] [ -P in|out|inout ] [ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ] |
DESCRIPTION
Tcpdump是用来打印输出网络接口上符合boolean expression的数据包的内容的描述(即包头)。并且,如果指定了选项-w就可以将抓取到的数据存储于文件中,供后续分析之用;相反地,如果指定了选项-r就可以从一文件中读取该包头数据。In all cases, only packets that match expression will be processed by tcpdump.
如果没有指定-c选项,tcpdump将持续抓捕网络上的数据直到接收到一个SIGINT信号(比如,从键盘中输入Ctrl+c就可以产生一个SIGINT信号)或SIGTERM信号(比如,kill命令产生的信号)而终止;如果指定了-c选项,tcpdump不仅会被以上两个信号终止,还会在抓取到-c指定数量的包后终止。
从网络接口中抓取数据包可能需要有特殊权限——详情请查看man手册中pcap相关内容。但是,从一个文件中读取数据包不需要特殊权限。
OPTIONS
- -A:以ASCII的方式打印输出每一个包,并将链路层的头最小化。
- -B:将操作系统抓包的缓冲区大小设置为参数buffer_size。
- -c:接收到指定参数count个数据包之后退出。
- -C:在将抓到的数据写入‘保存文件’之前,检查文件大小是否大于参数file_size,如果大于,则关闭当前保存文件再重新打开一个文件。参数file_size的单位是兆字节。
- -d:将匹配信息包(packet-matching)的代码以一种人们能够理解的汇编格式给出。
- -dd:将匹配信息包的代码以c语言格式给出。
- -ddd:将匹配信息包的代码以十进制格式给出。
- -D:打印输出系统中所有可用于tcpdump抓包的网络接口列表。
- -e:在每条输出信息中打印输出数据链路层的头部信息。
- -f:将外部的IPv4地址以数字的形式打印出来。
- -F:使用参数file指定表达式作为expression表达式。
- -i:监听参数interface指定的网络接口。如果没有指定该选项,tcpdump将默认监听系统中第一个接口。
- -l:使标准输出变为缓冲区模式,可以将数据导出。
- -L:列出网络接口中已知的数据链路。
- -m:从参数module中导入SMI MIB模块定义。
- -M:如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5。
- -n:不要将主机地址转换为其名字的形式,可以用于避免DNS查找。
- -nn:不要将协议、端口等数字形式转换成相应的名字形式。
- -N:不输出主机中的域名部分。例如输出“nic”而不是“nic.ddn.mil”。
- -O:禁止运行匹配信息包(packet-matching)的代码优化器。
- -P:禁止将接口设置为promiscuous模式。
- -q:快速输出。显示较少的协议信息,输出行会短一点。
- -r:从参数file中读取数据包(该文件是由-w写入的)。如果file是“-”,表示的是标准输入。
- -S:打印输出绝对的,而不是相对的TCP序列号。
- -s:对每一个包,读取参数snaplen指定的字节数,而不是默认的65535个字节。
- -T:将抓到的包解释成参数type指定的类型。
- -t:禁止显示时间戳。
- -tt:显示未格式化的时间戳标志。
- -ttt:输出本行和前一行的时间差。
- -tttt:在每一行输出有date处理的默认格式时间戳。
- -u:输出未解码的NFS句柄。
- -v:输出稍微详细点的信息。例如,显示IP数据报中的生成周期TTL和服务类型等信息。
- -vv:输出更详细点的信息。例如,显示NFS应答报文的附加域。
- -vvv:输出更更详细点的信息。例如显示telnet选项SB…SE等信息。
- -w:将原始数据包信息写入到参数file文件中,而不是打印出来。
- -x:以十六进制形式显示每一个报文。
- …
expression:用来选择要被转储的数据报。如果没有指定expression,就转储网络的全部报文,否则,只转储相对expression为“true”的数据报。
expression有一个或多个原语(primitive)组成。原语通常由一个标识(id,名字或数字)和标识前面的一个或多个修饰子(qualifier)组成。修饰子有三种类型:
- type:类型修饰子指出标识名称或标识数字代表什么类型的东西。可以使用的类型有host,net,port。
例如“host 192.168.10.112”, “net 192.168.0.0”,“port 22”。如果不指定类型,缺省的是host。 - dir:方向修饰子指出相对于标识的传输方向(数据是传入还是传出标识),可以使用的方向有src, dst, src or dst, src and dst。
例如“src 192.168.10.112”,“dst net 192.168.0.0”,“src or dst port 22”。如果不指定方向修饰子,缺省的是src or dst。 - proto:协议修饰子指出匹配指定的协议,可以使用的协议有ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp, udp。
例如“ether src 192.168.10.112”,“arp net 192.168.0.0”,“tcp port 22”如果不指定,就使用所有符合指定类型的协议。 - 此外,还有一些特殊的关键字:gateway, broadcast, less, greater和数学表达式。
- 更复杂的过滤器表达式可以通过and, or, not连接原语来组建。
例如”host 192.168.10.112 and not port ftp and not port ftp-data“,“tcp dst port ftp or ftp-data or domain”。
EXAMPLE
(1)打印输出所有进出主机sundown的报文:
tcpdump host sundown
(2)打印输出主机helios和主机hot或主机ace之间传送的报文:
tcpdump host helios and \(hot or ace \)
(3)打印输出ace和除了helios以外的所有主机的IP报文:
tcpdump ip host ace and not helios
(4)打印输出本地主机与Berkeley网络上的网络数据:
tcpdump net ucb-ether
ucb-ether可以理解为Berkeley网络地址。
(5)打印输出所有通过网关snup的ftp报文(注意这个表达式被单引号括起来,防止shell解释圆括弧):
tcpdump ‘gateway snup and (port ftp or ftp-data)’
(6)打印输出既不来自本地主机也不传往本地主机的网络数据:
tcpdump ip and not net localnet
(7)打印输出每个TCP会话的起始和结束报文(SYN和FIN报文),而且会话方中有一个远程主机:
tcpdump ‘tcp[tcpflags] & (tcp-syn | tcp-fin) != 0 and not src and dst net localnet’
(8)打印输出经过网关snup中大于576字节的IP数据报:
tcpdump ‘gateway snup and ip[2:2] > 576
(9)打印输出所有不是回响请求/应答的ICMP报文(也就是说,不是ping报文):
tcpdump ‘icmp[0] != 8 and icmp[0] != 0’
接着,介绍几种典型的tcpdump输出信息:
(1)数据链路层头信息
#tcpdump -e host ICE
ICE 是一台装有linux的主机。它的MAC地址是0:90:27:58:AF:1A H219是一台装有Solaris的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 t 0:0(0) ack 22535 win 8760 (DF)
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。
(2)ARP包的tcpdump输出信息
#tcpdump arp
得到的输出结果是:
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地址。
(3)TCP包的输出信息
用tcpdump捕获的TCP包的一般输出信息是:
src > dst: flags data-seqno ack window urgent options
src > dst:表明从源地址到目的地址, flags是TCP报文中的标志信息,S 是SYN标志, F (FIN), P (PUSH) , R (RST) “.” (没有标记); data-seqno是报文中的数据 的顺序号, ack是下次期望的顺序号, window是接收缓存的窗口大小, urgent表明 报文中是否有紧急指针。 Options是选项。
(4)UDP包的输出信息
用tcpdump捕获的UDP包的一般输出信息是:
route.port1 > ICE.port2: udp lenth
UDP十分简单,上面的输出行表明从主机route的port1端口发出的一个UDP报文 到主机ICE的port2端口,类型是UDP, 包的长度是lenth。