语法
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 ]
描述
tcpdump打印出网络接口上面匹配布尔表达式expression的包的内容的描述信息。提供 -w参数,
tcpdump会保存包数据到一个文件中,以做以后的分析之用;如果使用了-r参数,tcpdump不会从
网络接口读取数据包,而是从一个文件中读取,该文件是使用-w参数生成的数据包文件;使用-V
参数,tcpdump会读取一系列数据包文件。在所有的情况下,只有使表达式expression为true的
数据包才会被tcpdump处理。
如果没有使用了-c参数,tcpdump会持续捕获数据包直到被杀死或者被使用ctrl-c中断;如果使
用了-c参数,那么tcpdump会在捕获了count个数据包后或者被中断或者被杀死后退出。
当tcpdump完成了数据包的捕获之后,他会报告以下信息:
捕获的数据包的:这是tcpdump已经接收并且处理的数据包的数量
被过滤器接收的数据包的数量:该数据的意义依赖于你运行tcpdump的操作系统以及操作系统
被配置的方式。如果过滤器是在命令行上指定的话,它代表总的数据包的数量而不论数据包
是否匹配过滤表达式,即使数据包匹配了过滤表达式,也不管tcpdump是否已经读取并且
处理了这些数据包;在另外一些操作系统上,它只代表匹配了过滤表达式的数据包的数量,
而不管tcpdump是否处理了它们;在其它的一些操作系统上,它只代表匹配过滤表达式的并
且并tcpdump处理了的数据包的数量
被内核丢弃的数据包的数量:这是被丢弃的数据包的数量,主要是由于缓冲区空间太小,
从网络接口监听数据包可能需要你具有root权限;从一个保存的数据包文件中读取数据包不需要
root权限
选项
-A 以ASCII码打印出每一个数据包(去除链路层首部)。对于捕获web页面来说很方便。
-b 以ASDOT符号打印BGP包中的自制系统号码
-B 设置操作系统捕获缓冲区大小为 buffer_size KB
-c 捕获count个数据包后退出
-C
-d
-dd
-ddd
-D 打印出tcpdump可以监听的网络接口的列表。对于每一个接口,打印一个号码和接口名,接口名
和号码可以当做-i选项的参数用于指定捕获哪一个网络接口的数据包。
-e 在输出的每一行上打印出数据链路层的首部。
-E
-f
-F 使用file文件中的内容作为过滤表达式。命令行上的过滤表达式被忽略
-G
-h 打印出tcpdump和libpcap的版本号以及一条有用的信息,然后退出
-H 尝试探测802.11协议数据包头
-i 监听端口interface。如果未指定,则监听系统接口列表中接口号码最小的接口
-I 将网络接口置于监控模式
-j 设置捕获时候的时间戳类型为tstamp type
-J 列出接口支持的时间戳类型
-K 不要尝试去验证IP,TCP,UDP的校验和
-l 将输出缓冲
-L 列出接口支持的数据链路类型
-m
-M
-n 不要把地址转换成名字
-N 不要打印全限定域名主机名
-O 不要运行包匹配代码优化器。当你怀疑优化器有bug时很有用
-p 不要将接口置于混杂模式
-P 选择要捕获的数据包的接受/发送方向。有效值为 in,out,inout
-R
-r 从file文件读取数据包(该数据包是以-w参数生成的)
-S 打印绝对(不是相对)tcp报文段序号
-s
-T 将捕获的数据包强制解释为指定的类型
-t 不要在输出行上打印时间戳
-tt 在每一行上打印未格式化的时间戳
-ttt 打印当前行和上一行之间的时间增量
-tttt 在输出行上以默认格式打印时间戳
-ttttt 打印当前行和第一行之间的时间增量
-u
-U
-v 产生稍为详细的输出
-vv 产生更加详细的输出
-vvv 产生更更加详细的输出
-V 从file文件读出一个文件名的列表
-w 将数据包写入文件file
-W 和-C配合使用
-x 当解析和输出的时候,除了打印每一个包的包头,也以十六进制打印每一个包的数据(去掉
数据链路层的首部)。
-xx 当解析和输出的时候,除了打印每一个包的首部,也打印每一个包的数据,包括数据链路
层的首部,以十六进制打印。
-X 以十六进制和ASCII打印每个包的首部和数据,去除数据链路层的首部
-XX 同上,不过也打印数据链路层的首部
-y
-z
-Z 切换用户
expression
选择转储哪一个包。如果没有使用expression,网络上所有的包都被转储。否则,只有使
expression为true的包才会被转储。过滤表达式的语法在下面介绍。
过滤表达式
过滤表达式包含一个或者多个primotives(原语)。primitive通常包含一个id(名字或者数字),
id的前面是一个或者多个限定词。有三种类型的限定词:
type type限定词说明了id指的是哪一种数据。可能的types有 host,net,port,和
portrange。例如,host foo,net 128.3,port 20,portrange 6000-8000.如果没有
type限定词,那么假定限定词是host。
dir dir限定词指定了数据包相对于id的传输方向。可能的方向有src,dst,src or dst,
src and dst,ra,ta,addr1,addr2,addr3,addr4.例如:src foo,dst net 128.3
如果没有dir限定词,假定dir限定词是src or dst。限定词ra,ta,addr1,addr2,
addr3,addr4只对IEEE 802.11无线网有效。
proto proto限定词限定匹配到某一个特别的协议。可能的协议有:ether,fddi,tr,wlan,
ip,ip6,arp,rarp,decnet,tcp,udp。例如:ether src foo,arp net 128.3
如果没有指定proto限定词,假定所有的协议都可以。
除了以上的以外,还有一些特殊的primitive关键字,这些关键字不符合以上模型:gateway,
broadcast,less,greater和算术表达式。
更复杂的过滤表达式可以使用关键字and,or和not去组合primitive。例如:
host foo and not port ftp-data。
允许的primitive有:
dst host (host)
如果数据包的目的ip是(host),(host)可以是一个地址或者名字。该表达式为true
src host (host)
同上,不过是源ip地址
host (host)
如果数据包的源ip或者目的ip是host那么该表达式为true。
以上三个host表达式都可以在前面加上以下关键字:ip,arp,rarp,或者ip6
ether dst (ehost)
如果数据帧的以太网卡目的地址为ehost,则该表达式为真,ehost或者是一个/etc/ethers
里面的名字或者是一个数字网卡地址。
ether src (ehost)
ether host (ehost)
如果捕获的数据帧的目的或源网卡地址是ehost,则该表达式为true。
gateway (host)
dst net (net)
如果数据包的ip地址的网络号是net,则表达式为true。
src net (net)
net (net)
net (net) mask (netmask)
net (net/len)
dst port (port)
如果数据包的目的端口号是port,为true。
src port (port)
port (port)
dst portrange (port1-port2)
src portrange (port1-port2)
portrange (port1-port2)
如果数据包的目的端口或者源端口的范围在port1到port2之间,那么该表达式为true
以上所有与port有关的表达式都可以在前面加上tcp或者udp。那样的话就只匹配tcp报文段
或者udp数据报。
less (length)
len <= (length)
如果数据帧的长度小于等于length,该表达式为真。
greater (length)
len >= (length)
ip proto (protocol)
如果数据帧是一个ip数据包,ip的协议字段的协议是protocol,该表达式为真。可能的
protocol是icmp,igmp,icmp6,igrp,pim,ah,esp,vrrp,udp,或者tcp。注意
协议tcp,udp,和icmp同样是关键字,因此必须在他们的前面加上反斜杠。在cshell中
应该加上两个反斜杠。
…
…
…
primitive可能使用一些运算符组合在一起:
括弧
取反(!或者not)
相与(&&或者and)
相或(||或者or)
取反优先级最高。与运算和或运算具有相同的优先级和自左至右的结合性。