细说 tcpdump 的妙用(上)
介绍
tcpdump命令最初设计用于观察TCP/IP性能问题,它是一个用于截取网络分组,并输出分组内容的工具。tcpdump可以将网络中传送的数据包的报文头完全截获下来提供分析,它支持针对网络层、协议、主机、网络或端口的过滤,并提供and, or, not等逻辑语句来帮助用户去掉无用的信息。
更多信息
使用tcpdump:
Unix命令tee通常用来允许用户查看并记录Unix会话的输出。使用tcpdump结合tee加上-l选项来实现,命令格式如下:
bsd1# tcpdump -l | tee outfile
另一种方式是通过-w选项直接将抓取数据写入文件中。之后通过tcpdump -r选项来读取。抓取数据可以输入:
bsd1# tcpdump -w rawfile
然后将raw文件转化成text文件:
bsd1# tcpdump -r rawfile > textfile
tcpdump选项:
tcpdump选项可划分为四大类型:控制tcpdump程序行为,控制数据怎样显示,控制显示什么数据,以及过滤命令。
控制程序行为
这一类命令行选项影响程序行为,包括数据收集的方式。之前已介绍了两个例子:-r和-w。-w选项允许用户将输出重定向到一个文件,之后可通过-r选项将捕获数据显示出来。
如果用户知道需要捕获的报文数量或对于数量有一个上限,可使用-c选项。则当达到该数量时程序自动终止,而无需使用kill命令或Ctrl-C。下例中,收集到100个报文之后tcpdump终止:
bsd1# tcpdump -c100
如果用户在多余一个网络接口上运行tcpdump,用户可以通过-i选项指定接口。在不确定的情况下,可使用ifconfig –a来检查哪一个接口可用及对应哪一个网络。例如,一台机器有两个C级接口,xl0接口IP地址 205.153.63.238,xl1接口IP地址205.153.61.178。要捕捉205.153.61.0网络的数据流,使用以下命令:
bsd1# tcpdump -i xl1
没有指定接口时,tcpdump默认为最低编号接口。
-p选项将网卡接口设置为非混杂模式。这一选项理论上将限制为捕获接口上的正常数据流——来自或发往主机,多播数据,以及广播数据。
-s选项控制数据的截取长度。通常,tcpdump默认为一最大字节数量并只会从单一报文中截取到该数量长度。实际字节数取决于操作系统的设备驱动。通过默认值来截取合适的报文头,而舍弃不必要的报文数据。
如果用户需截取更多数据,通过-s选项来指定字节数。也可以用-s来减少截取字节数。对于少于或等于200字节的报文,以下命令会截取完整报文:bsd1# tcpdump -s200
更长的报文会被缩短为200字节。
控制信息如何显示
-a,-n,-N和-f选项决定了地址信息是如何显示的。-a选项强制将网络地址显示为名称,-n阻止将地址显示为名字,-N阻止将域名转换。-f选项阻止远端名称解析。下例中,从sloan.lander.edu (205.153.63.30) ing远程站点,分别不加选项,-a,-n,-N,-f。(选项-c1限制抓取1个报文)
bsd1# tcpdump -c1 host 192.31.7.130 tcpdump: listening on xl0 14:16:35.897342 sloan.lander.edu > cio-sys.cisco.com: icmp: echo request bsd1# tcpdump -c1 -a host 192.31.7.130 tcpdump: listening on xl0 14:16:14.567917 sloan.lander.edu > cio-sys.cisco.com: icmp: echo request bsd1# tcpdump -c1 -n host 192.31.7.130 tcpdump: listening on xl0 14:17:09.737597205.153.63.30>192.31.7.130: icmp: echo request bsd1# tcpdump -c1 -N host 192.31.7.130 tcpdump: listening on xl0 14:17:28.891045 sloan > cio-sys: icmp: echo request bsd1# tcpdump -c1 -f host 192.31.7.130 tcpdump: listening on xl0 14:17:49.274907 sloan.lander.edu >192.31.7.130: icmp: echo request
默认为-a选项。
-t和-tt选项控制时间戳的打印。-t选项不显示时间戳而-tt选项显示无格式的时间戳。以下命令显示了tcpdump命令无选项,-t选项,-tt选项的同一报文:
12:36:54.772066 sloan.lander.edu.1174>205.153.63.238.telnet:. ack 3259091394 win 8647(DF) sloan.lander.edu.1174>205.153.63.238.telnet:. ack 3259091394 win 8647(DF) 934303014.772066 sloan.lander.edu.1174>205.153.63.238.telnet:. ack 3259091394 win 8647(DF)
控制显示什么数据
可以通过-v和-vv选项来打印更多详细信息。例如,-v选项将会打印TTL字段。要显示较少信息,使用-q,或quiet选项。一下为同一报文分别使用-q选项,无选项,-v选项,和-vv选项的输出。
12:36:54.772066 sloan.lander.edu.1174>205.153.63.238.telnet: tcp 0(DF) 12:36:54.772066 sloan.lander.edu.1174>205.153.63.238.telnet:. ack 3259091394 win 8647(DF) 12:36:54.772066 sloan.lander.edu.1174>205.153.63.238.telnet:. ack 3259091394 win 8647(DF)(ttl 128, id 45836) 12:36:54.772066 sloan.lander.edu.1174>205.153.63.238.telnet:. ack 3259091394 win 8647(DF)(ttl 128, id 45836)
-e选项用于显示链路层头信息。上例中-e选项的输出为:
12:36:54.7720660:10:5a:a1:e9:80:10:5a:e3:37:c ip 60: sloan.lander.edu.1174>205.153.63.238.telnet:. ack 3259091394 win 8647(DF)
05ae9:8是sloan.lander.edu中3Com卡的以太网地址,05a37:c是205.153.63.238中3Com卡的以太网地址。
-x选项将报文以十六进制形式dump出来,排除了链路层报文头。-x和-vv选项报文显示如下:
13:57:12.719718 bsd1.lander.edu.1657>205.153.60.5.domain:11587+ A? www.microsoft.com.(35)(ttl 64, id 41353) 4500003f a189 00004011 c43a cd99 3db2 cd99 3c0506790035002b06d92d430100 000100000000000003777777096d6963 726f736f667403636f6d0000010001