【翻译】Linux下抓包工具学习-tcpdump

在Linux操作系统中,tcpdump用来抓取网络中的数据包,本文内容是对man手册中tcpdump相关知识的翻译以及一些附加的例子等。

NAME

tcpdump – dump traffic on a network

SYNOPSIS

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:类型修饰子指出标识名称或标识数字代表什么类型的东西。可以使用的类型有hostnetport
    例如“host 192.168.10.112”, “net 192.168.0.0”,“port 22”。如果不指定类型,缺省的是host。
  • dir:方向修饰子指出相对于标识的传输方向(数据是传入还是传出标识),可以使用的方向有srcdstsrc 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。

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注