Tcpdump - Linux命令 - UNIX命令

名称

tcpdump - 转储网络上的流量

概要

tcpdump [ -adeflnNOpqRStuvxX ] [ -c 计数 ]

[ -C file_size ] [ -F 文件 ]

[ -i 界面 ] [ -m 模块 ] [ -r 文件 ]

[ -s snaplen ] [ -T 类型 ] [ -U 用户 ] [ -w 文件 ]

[ -E algo:秘密 ] [ 表达 ]

描述

Tcpdump在网络接口上打印出与布尔表达式匹配的数据包标题。 它也可以用-w标志运行,这会导致它将分组数据保存到一个文件中供以后分析,和/或使用-r标志,这会导致它从保存的分组文件中读取数据,而不是读取数据包来自网络界面。 在所有情况下,只有匹配表达式的数据包才会被tcpdump处理。

如果不用-c标志运行, Tcpdump将继续捕获数据包,直到它被一个SIGINT信号中断(例如,通过键入中断字符,通常为control-C)或SIGTERM信号(通常由kill (1)命令); 如果使用-c标志运行,它将捕获数据包,直到它被SIGINT或SIGTERM信号中断或指定数量的数据包已被处理。

tcpdump完成捕获数据包时,它会报告计数:

数据包由过滤器接收'(其含义取决于运行tcpdump的操作系统,并且可能在操作系统配置的方式上 - 如果在命令行中指定了过滤器,则在某些操作系统上它会进行计数而不管它们是否与过滤器表达式匹配,并且在其他操作系统上,它只计算由过滤器表达式匹配并由tcpdump处理的数据包;

数据包“由内核丢弃”(这是由于缺少缓冲区空间而被丢弃的数据包数量,如果操作系统将该信息报告给应用程序,那么运行tcpdump的操作系统中的数据包捕获机制;如果不是,则报告为0)。

在支持SIGINFO信号的平台上,比如大多数BSD,它会在接收到一个SIGINFO信号(例如,通过输入你的“状态”字符,通常是control-T生成)来报告这些计数,并且将继续捕获数据包。

从网络接口读取数据包可能需要您具有特殊权限:

在带有NIT或BPF的SunOS 3.x或4.x下:

您必须具有对/ dev / nit/ dev / bpf *的读取权限。

在带有DLPI的Solaris下:

您必须具有对网络伪设备的读/写访问权限,例如/ dev / le 。 但是,至少在某些版本的Solaris上,这不足以允许tcpdump以混杂模式捕获; 在这些版本的Solaris上,您必须是root用户,或者tcpdump必须安装setuid到root用户才能以混杂模式进行捕获。 请注意,在许多(也许是全部)接口上,如果不以混杂模式捕获,则不会看到任何传出数据包,因此捕获未在混杂模式下完成可能不是很有用。

在具有DLPI的HP-UX下:

您必须是root或tcpdump,必须将setuid安装到root用户。

在IRIX下用snoop:

您必须是root或tcpdump,必须将setuid安装到root用户。

在Linux下:

您必须是root或tcpdump,必须将setuid安装到root用户。

在Ultrix和Digital UNIX / Tru64 UNIX下:

任何用户都可以使用tcpdump捕获网络流量。 但是,除非超级用户使用pfconfig (8)在该接口上启用了混杂模式操作,否则用户(甚至超级用户)都不能在混合模式下捕获界面,并且没有用户(甚至不是超级用户)可以捕获接口上接收或由接口发送的单播流量,除非超级用户使用pfconfig在该接口上启用了全部复制模式操作,因此接口上的有用数据包捕获可能需要混合模式或复制 - 所有模式操作或两种操作模式都可在该界面上启用。

根据BSD:

您必须具有对/ dev / bpf *的读取权限。

读取保存的数据包文件不需要特殊权限。

OPTIONS

-一个

尝试将网络和广播地址转换为名称。

-C

收到计数包后退出。

-C

在将原始数据包写入保存文件之前,请检查该文件当前是否大于file_size ,如果是,请关闭当前保存文件并打开一个新文件。 第一个保存文件后的保存文件将具有用-w标志指定的名称,后面跟着一个数字,从2开始并继续向上。 file_size的单位是数百万字节(1,000,000字节,而不是1,048,576字节)。

-d

将已编译的数据包匹配代码以人类可读形式转储到标准输出并停止。

-dd

将数据包匹配代码转储为C程序片段。

滴滴滴

将数据包匹配代码转储为十进制数(以count开头)。

-e

在每个转储线上打印链接级别标题。

-E

使用algo:secret来解密IPsec ESP数据包。 算法可能是des-cbc3des-cbcblowfish-cbcrc3-cbccast128-cbcnone 。 缺省值是des-cbc 。 只有在启用加密的情况下编译tcpdump时才能解密数据包。 秘密 ESP密钥的ascii文本。 我们现在不能采取任意的二进制值。 该选项假定RFC2406 ESP,而不是RFC1827 ESP。 该选项仅用于调试目的,并且不鼓励使用具有真正“秘密”密钥的此选项。 通过在命令行上显示IPsec密钥,您可以通过ps (1)和其他场合让其他人看到它。

-F

以数字方式打印“外国”互联网地址而不是象征性地(这个选项是为了解决Sun的yp服务器中严重的脑损伤---通常它会永久性地翻译非本地互联网号码)。

-F

使用文件作为过滤器表达式的输入。 在命令行上给出的附加表达式将被忽略。

-一世

界面上倾听。 如果未指定,则tcpdump会在系统接口列表中搜索编号最小的已配置up接口(不包括环回)。 选择最早的比赛会打破关系。

在具有2.2或更高版本内核的Linux系统上,可以使用接口参数“any”来捕获所有接口的数据包。 请注意,“任何”设备上的捕捉不会在混杂模式下完成。

-l

使stdout行缓冲。 如果你想在捕捉数据的时候看到数据,这很有用。 例如,
``tcpdump -l | tee dat“或”tcpdump -l> dat&tail -f dat“。

-m

从文件模块加载SMI MIB模块定义。 该选项可以多次用于将多个MIB模块加载到tcpdump中

-n

不要将主机地址转换为名称。 这可以用来避免DNS查找。

-NN

不要将协议和端口号等转换为名称。

-N

不要打印主机名的域名限定。 例如,如果你给这个标志,那么tcpdump将打印“nic”而不是“nic.ddn.mil”。

-O

不要运行分组匹配代码优化器。 这只有在怀疑优化器中存在错误时才有用。

-p

不要将界面置于混杂模式。 请注意,出于某种其他原因,接口可能处于混杂模式; 因此,`-p'不能用作`ether host {local-hw-addr}或ether broadcast'的缩写。

-q

快速(安静?)输出。 打印较少的协议信息,因此输出行较短。

-R

假设ESP / AH数据包基于旧规范(RFC1825至RFC1829)。 如果指定, tcpdump将不打印重播预防字段。 由于ESP / AH规范中没有协议版本字段,因此tcpdump无法推导出ESP / AH协议的版本。

-r

文件读取数据包(使用-w选项创建)。 如果文件是“ - ”,则使用标准输入。

-S

打印绝对的,而不是相对的TCP序列号。

-s

Snarf从每个数据包中取出数据字节,而不是默认的68(使用SunOS的NIT,最小值实际上是96)。 对于IP,ICMP,TCP和UDP,68字节是足够的,但可能会截断来自名称服务器和NFS数据包的协议信息(请参见下文)。 由于快照有限而截断的数据包在输出中用``[| proto ]'',其中proto是发生截断的协议级别的名称。 请注意,拍摄较大的快照既增加了处理数据包所需的时间,也有效地减少了数据包缓冲量。 这可能会导致数据包丢失。 您应该将snaplen限制为捕获您感兴趣的协议信息的最小数量。将snaplen设置为0表示使用所需长度捕获整个数据包。

-T

由“ 表达式 ”选择的强制数据包被解释为指定的类型 。 目前已知的类型是cnfp (Cisco NetFlow协议), rpc (远程过程调用), rtp (实时应用协议), rtcp (实时应用控制协议), snmp (简单网络管理协议), vat (可视音频工具)和wb (分布式白板)。

-t

不要在每个转储线上打印时间戳。

-tt

在每个转储线上打印未格式化的时间戳。

-U

删除root用户权限并将用户标识更改为用户和组标识到主要用户组。

注意! 如果没有其他指定,Red Hat Linux会自动将权限下降到用户``pcap''。

-ttt

在每个转储线上打印当前行和前一行之间的增量(以微秒为单位)。

-tttt

在每个转储线上按日期打印默认格式的时间戳。

-u

打印未解码的NFS句柄。

-v

(略多)详细输出。 例如,打印IP包中的生存时间,标识,总长度和选项。 还启用其他数据包完整性检查,例如验证IP和ICMP头校验和。

-vv

更详细的输出。 例如,从NFS回复数据包打印附加字段,SMB数据包完全解码。

-vvv

更详细的输出。 例如,telnet SB ... SE选项全部打印。 使用-X telnet选项也以十六进制打印。

-w

将原始数据包写入文件而不是解析并打印出来。 他们以后可以用-r选项打印。 如果文件是“ - ”,则使用标准输出。

-X

以十六进制打印每个数据包(减去其链接级别标题)。 整个数据包或snaplen字节中的较小者将被打印。 请注意,这是整个链路层数据包,因此对于填充的链接层(例如以太网),当高层数据包比所需填充数据短时,填充字节也将被打印。

-X

打印十六进制时,也要打印ascii。 因此,如果还设置了-x ,则数据包将以十六进制/ ASCII格式打印。 这对分析新协议非常方便。 即使未设置-x ,某些数据包的某些部分也可能以十六进制/ ASCII格式打印。

表达

选择将转储哪些数据包。 如果没有给出表达式 ,网络上的所有数据包都将被转储。 否则,只有表达式为“真”的数据包才会被丢弃。

表达式由一个或多个基元组成。 图元通常由一个id (名字或数字)组成,前面有一个或多个限定符。 有三种不同的限定符:

类型

限定符说明id名称或数字指的是什么类型的东西。 可能的类型是主机网络端口 。 例如,“主机富”,“网络128.3”,“端口20”。 如果没有类型限定符,则假定为主机

DIR

限定符指定了和/或来自id的特定传送方向。 可能的方向是srcdstsrc或dst以及src和 dst 。 例如`src foo',`dst net 128.3',`src或dst port ftp-data'。 如果没有dir限定符,则假定为src或dst 。 对于'空'链接层(即点对点协议,如滑), 入站出站限定符可用于指定所需的方向。

限定符将匹配限制为特定的协议。 可能的原型是: etherfdditripip6arprarpdecnettcpudp 。 例如`ether src foo',`arp ​​net 128.3',`tcp port 21'。 如果没有proto限定符,则假定与该类型一致的所有协议。 例如`src foo'表示`(ip或者arp或者rarp)src foo'(除了后者不是合法语法),`net bar'表示`(ip或者arp或者rarp)net bar'和`端口53'意味着`(tcp或udp)端口53'。

[`fddi'实际上是`ether'的别名; 解析器将它们理解为“在指定网络接口上使用的数据链路级别”。FDDI标头包含类似以太网的源地址和目标地址,并且通常包含类似以太网的数据包类型,因此您可以过滤这些FDDI字段就像类似的以太网领域一样。 FDDI头还包含其他字段,但不能在过滤器表达式中明确指定它们。

同样,`tr'是'ether'的别名; 上一段关于FDDI头部的陈述也适用于令牌环头部。]

除上述之外,还有一些特殊的`原始'关键字不符合模式: 网关广播更少更大和算术表达式。 所有这些都在下面描述。

更复杂的过滤器表达式是通过使用单词 或者不是将基元组合来构建的。 例如,`主机foo而不是端口ftp而不是端口ftp-data'。 为了保存输入,可以省略相同的限定符列表。 例如,`tcp dst port ftp或ftp-data或domain'与'tcp dst port ftp或tcp dst port ftp-data或tcp dst port domain'完全相同。

允许的原语是:

dst主机 主机

如果数据包的IPv4 / v6目标字段是主机 (可能是地址或名称),则为true。

src主机 主机

如果数据包的IPv4 / v6源字段是主机,则为true。

主机 主机

如果数据包的IPv4 / v6源或目标是主机,则为true。 任何上述主机表达式都可以使用关键字iparprarpip6作为前缀:

IP主机 主机

相当于:

ether proto \ ip 和主机 主机

如果主机是具有多个IP地址的名称,则会检查每个地址是否匹配。

以太网dst ehost

如果以太网目标地址是ehost,则为真。 Ehost可以是/ etc / ethers中的名称或数字(参见ethers (3N)中的数字格式)。

醚src ehost

如果以太网源地址是ehost,则为真。

以太主机 ehost

如果以太网源或目标地址是ehost,则为真。

网关 主机

如果数据包使用主机作为网关,则为真。 即,以太网源或目标地址是主机,但IP源和IP目标都不是主机主机必须是名称,并且必须通过机器的主机名称到IP地址解析机制(主机名称文件,DNS,NIS等)以及机器的主机名称到以太网地址解析机制(/ etc / ethers等)。 (等价的表达式是

以太主机 ehost 而不是主机 主机

它可以与host / ehost的名称或数字一起使用。)此语法在此时不支持启用IPv6的配置。

dst净

如果数据包的IPv4 / v6目标地址具有网络的网络号,则为true。 Net可以是/ etc / networks中的名称或网络号(详情请参阅网络(4) )。

src 网络

如果数据包的IPv4 / v6源地址具有网络的网络号,则为true。

如果数据包的IPv4 / v6源地址或目标地址具有网络的网络号,则为true。

net net mask netmask

如果IP地址与特定网络掩码相匹配,则为真。 可能会被srcdst限定。 请注意,此语法对于IPv6 网络无效。

/ len

如果IPv4 / v6地址与netmask len位宽相匹配,则为真。 可能会被srcdst限定。

dst端口 端口

如果数据包为ip / tcp,ip / udp,ip6 / tcp或ip6 / udp,并且具有端口的目标端口值,则为真。 端口可以是/ etc / services中使用的数字或名称(请参阅tcp (4P)和udp (4P))。 如果使用名称,则检查端口号和协议。 如果使用数字或模糊名称,则仅检查端口号(例如, dst端口513将打印tcp / login流量和udp / who流量,并且端口域将打印tcp / domain和udp / domain流量)。

src端口 端口

如果数据包具有端口的源端口值,则为真。

端口 端口

如果数据包的源端口或目标端口是端口,则为true。 任何上述端口表达式都可以用关键字tcpudp作为前缀,如下所示:

tcp src端口 端口

它仅匹配其源端口是端口的 tcp数据包。

更少的 长度

如果数据包的长度小于或等于长度,则为真。 这相当于:

len <= 长度

更大的 长度

如果数据包的长度大于或等于长度,则为真。 这相当于:

len> = 长度

ip 协议

如果数据包是协议类型协议的IP数据包(请参阅ip (4P)),则为真。 协议可以是数字或名称icmpicmp6igmpigrppimahespvrrpudptcp中的一个 。 请注意,标识符tcpudpicmp也是关键字,必须通过反斜杠(\)进行转义,该反斜杠在\ C \ shell中是\\。 请注意,此原语不会追逐协议标题链。

ip6 协议

如果数据包是协议类型协议的IPv6数据包,则为真。 请注意,此原语不会追逐协议标题链。

ip6 protochain 协议

如果数据包是IPv6数据包,并且在其协议标题链中包含协议标头和类型协议 ,则为真。 例如,

ip6前传6

匹配任何IPv6数据包与协议标题链中的TCP协议标头。 该数据包可以包含例如IPv6报头和TCP报头之间的认证报头,路由报头或逐跳选项报头。 该原语发出的BPF代码很复杂,并且不能通过tcpdump中的BPF优化程序代码进行优化,所以这可能有点慢。

ip protochain 协议

相当于ip6 protochain 协议 ,但是这是针对IPv4的。

以太播出

如果数据包是以太网广播数据包,则为真。 ether关键字是可选的。

ip广播

如果数据包是IP广播数据包,则为真。 它检查全零和全1广播约定,并查找本地子网掩码。

以太网组播

如果数据包是以太网多播数据包,则为真。 ether关键字是可选的。 这是` ether [0]&1!= 0 '的简写。

ip组播

如果数据包是IP多播数据包,则为真。

ip6组播

如果数据包是IPv6多播数据包,则为真。

乙醚原始 协议

如果数据包是以太类型协议,则为真。 协议可以是ipip6arprarpatalkaarpdecnetscalatmopdlmoprcisostpipxnetbeui中的一个或多个名称。 请注意,这些标识符也是关键字,必须通过反斜杠(\)进行转义。

[在FDDI(例如` fddi协议arp ')和令牌环(例如` tr protocol arp '))的情况下,对于大多数这些协议,协议标识来自802.2逻辑链路控制(LLC)报头,通常分层在FDDI或令牌环标头之上。

当在FDDI或令牌环上过滤大多数协议标识符时, tcpdump仅以封装的以太网的组织单元标识符(OUI)为0x000000,以所谓的SNAP格式检查LLC头的协议ID字段; 它不检查数据包是否为OUI为0x000000的SNAP格式。

例外是iso ,为此它检查LLC头, stpnetbeui的DSAP(目的服务访问点)和SSAP(源服务访问点)字段,它在那里检查LLC头的DSAP,以及atalk ,它在哪里检查OUI为0x080007和Appletalk etype的SNAP格式数据包。

在以太网的情况下, tcpdump检查大多数这些协议的以太网类型字段; 例外的是isosapnetbeui ,它检查802.3帧,然后检查LLC标题,就像它为FDDI和令牌环atalk一样检查LLC标题,在这里它检查以太网帧中的Appletalk etype和SNAP格式的数据包,就像它为FDDI和令牌环aarp所做的那样,它在一个以太网帧或一个OUI为0x000000的802.2 SNAP帧中检查Appletalk ARP etype,在ipx中检查IPX etype一个以太网帧,LLC头中的IPX DSAP,802.3,没有IPX的LLC头封装,以及SNAP帧中的IPX etype。]

decnet src 主机

如果DECNET源地址是主机 (可能是“10.123”形式的地址)或DECNET主机名,则为真。 [DECNET主机名支持仅在配置为运行DECNET的Ultrix系统上可用。]

decnet dst 主机

如果DECNET目标地址是主机,则为真。

decnet主机 主机

如果DECNET源地址或目标地址是主机,则为真。

ipip6arprarpatalkaarpdecnetisostpipxnetbeui

缩写:

乙醚原蛋白

其中p是上述协议之一。

latmoprcmopdl

缩写:

乙醚原蛋白

其中p是上述协议之一。 请注意, tcpdump目前不知道如何解析这些协议。

vlan [vlan_id]

如果数据包是IEEE 802.1Q VLAN数据包,则为真。 如果指定了[vlan_id] ,则只有该数据包具有指定的vlan_id 。 请注意, 表达式中遇到的第一个vlan关键字在假设数据包是VLAN数据包的情况下会更改表达式的其余部分的解码偏移量。

tcpudpicmp

缩写:

ip proto p 或ip6 proto p

其中p是上述协议之一。

iso 协议

如果数据包是协议类型协议的OSI数据包,则为真。 协议可以是数字或名称clnpesisisis中的一个

clnpesisisis

缩写:

iso proto p

其中p是上述协议之一。 请注意, tcpdump没有完成解析这些协议的工作。

expr relop expr

如果关系成立,则rel为真,其中relop是>,<,> =,<=,=,!=中的一个,而expr是由整数常量组成的算术表达式(用标准C语法表示) , - ,*,/,&,|],长度运算符和特殊数据包数据访问器。 要访问数据包内的数据,请使用以下语法:

原型 [ expr size ]

Protoether,fddi,tr,ppp,slip,link,ip,arp,rarp,tcp,udp,icmpip6之一 ,并指示索引操作的协议层。 ( ether,fddi,tr,ppp,sliplink都是指链路层)注意, tcp,udp和其他上层协议类型仅适用于IPv4,而不适用于IPv6(这将在未来进行修复)。 相对于所指示的协议层的字节偏移由expr给出。 大小是可选的并且表示感兴趣的字段中的字节数; 它可以是一个,两个或四个,默认为一个。 长度运算符(用关键字len表示)给出了数据包的长度。

例如,` ether [0]&1!= 0 '捕获所有多点传送流量。 表达式' ip [0]&0xf!= 5 '捕获所有带有选项的IP数据包。 表达式' ip [6:2]&0x1fff = 0 '仅捕获片段化数据报的未分片数据报和碎片零。 此检查隐式应用于tcpudp索引操作。 例如, tcp [0]总是表示TCP 标头的第一个字节,并不意味着介入片段的第一个字节。

一些偏移量和字段值可以表示为名称而不是数值。 以下协议头字段偏移量可用: icmptype (ICMP类型字段), icmpcode (ICMP代码字段)和tcpflags (TCP标志字段)。

以下ICMP类型字段值可用: icmp-echoreplyicmp-unreachicmp- sourcequenchicmp-redirecticmp-echoicmp-routeradverticmp-routersoliciticmp-timxceedicmp-paramprobicmp -tstampicmp -tstampreplyicmp-ireqicmp-ireqreplyicmp-maskreqicmp-maskreply

以下TCP标志字段值可用: tcp-fintcp-syntcp-rsttcp-pushtcp-pushtcp-acktcp-urg

基元可以使用以下方式进行组合:

带圆括号的原语和操作符组(圆括号对Shell来说是特殊的,必须转义)。

否定(' '或' not ')。

连接(` && '或` ')。

交替(' || '或' or ')。

否定的优先级最高。 交替和级联具有相同的优先级并从左到右相关联。 请注意,串联现在需要显式标记,而不是并置。

如果给定标识符没有关键字,则假定最近的关键字。 例如,

不是主机vs和ace

是简短的

不是主机vs和主机王牌

这不应与此混淆

不(主持人vs或王牌)

表达式参数可以作为单个参数或多个参数传递给tcpdump ,无论哪种方式更为方便。 通常,如果表达式包含Shell元字符,则将其作为单引号引用传递会更容易。 在解析之前,多个参数与空格连接在一起。

例子

打印所有到达或离开日落的数据包:

tcpdump主机日落

打印helioshotace之间的流量:

tcpdump主机helios和\(hot或ace \)

打印ace和除helios之外的任何主机之间的所有IP数据包:

tcpdump ip主机王牌而不是helios

在伯克利打印本地主机和主机之间的所有流量:

tcpdump net ucb-ether

要通过Internet网关snup打印所有ftp流量:(注意表达式被引用以防止shell从(错误)解释括号):

tcpdump'网关snup和(端口ftp或ftp-data)'

要打印既不是来自本地主机也不是本地主机的流量(如果您通过其他网络访问,则这些内容不应该进入本地网络)。

tcpdump ip而不是net netnet

打印涉及非本地主机的每个TCP会话的开始和结束数据包(SYN和FIN数据包)。

tcpdump'tcp [tcpflags]&(tcp-syn | tcp-fin)!= 0而不是src和dst net localnet '

打印通过网关snup发送的长度超过576字节的IP数据包:

tcpdump'网关snup和ip [2:2]> 576'

要打印通过以太网广播或多播发送的IP广播或多播数据包:

tcpdump'ether [0]&1 = 0和ip [16]> = 224'

要打印所有不是回应请求/回复的ICMP数据包(即不是ping数据包):

tcpdump'icmp [icmptype]!= icmp-echo和icmp [icmptype]!= icmp-echoreply'

输出格式

tcpdump的输出是依赖于协议的。 以下给出了大多数格式的简要说明和示例。

链接级别标题

如果给出'-e'选项,则会打印链接级别标题。 在以太网上,打印源和目标地址,协议和数据包长度。

在FDDI网络上,'-e'选项使tcpdump打印'帧控制'字段,源地址和目标地址以及数据包长度。 ('frame control'字段控制对数据包其余部分的解释,普通数据包(例如包含IP数据报的数据包)是'异步'数据包,优先级值在0到7之间;例如` async4 '。假设数据包包含802.2逻辑链路控制(LLC)数据包;如果LLC数据包不是 ISO数据报或所谓的SNAP数据包,则会打印LLC标头。

在令牌环网络上,'-e'选项会使tcpdump打印'访问控制'和'帧控制'字段,源地址和目标地址以及数据包长度。 与在FDDI网络上一样,数据包被假定为包含LLC数据包。 无论是否指定'-e'选项,都会为源路由数据包打印源路由信息。

(注意:以下描述假定熟悉RFC-1144中描述的SLIP压缩算法。)

在SLIP链接上,打印出方向指示符(“入站”I,出站“O”),数据包类型和压缩信息。 数据包类型首先被打印。 这三种类型是iputcpctcp 。 没有进一步的链接信息打印ip数据包。 对于TCP数据包,连接标识符将按照类型打印。 如果数据包是压缩的,它的编码头将被打印出来。 特殊情况打印为* S + n* SA + n ,其中n是序列号(或序列号和ack)发生变化的量。 如果不是特殊情况,则打印零个或多个更改。 U(紧急指针),W(窗口),A(ack),S(序列号)和I(数据包ID)指示更改,后跟delta(+ n或-n)或新值(= N)。 最后,打印数据包中的数据量和压缩的标题长度。

例如,下面的行显示了一个带有隐式连接标识符的出站压缩TCP数据包; ack改变了6,序列号改变了49,并且数据包ID减少了6; 有3个字节的数据和6个字节的压缩报头:

O ctcp * A + 6 S + 49 I + 6 3(6)

ARP / RARP包

Arp / rarp输出显示请求的类型及其参数。 格式旨在自我解释。 以下是从主机rtsg到主机csam的“rlogin”开头的一个简短示例:

arp who-csam告诉rtsg arp回复csam是 - 在CSAM

第一行表示rtsg发送了一个ARP请求互联网主机csam的以太网地址。 Csam以其以太网地址回复(在本例中,以太网地址以大写字母和互联网地址为小写字母)。

如果我们完成了tcpdump -n,这看起来会少一些冗余:

arp who-has 128.3.254.6 tell 128.3.254.68 arp reply 128.3.254.6 is-at 02:07:01:00:01:c4

如果我们完成了tcpdump -e ,第一个数据包被广播,第二个数据包点对点的事实将是可见的:

RTSG Broadcast 0806 64:arp who-has csam tell rtsg CSAM RTSG 0806 64:arp reply csam is-at CSAM

对于第一个数据包来说,以太网源地址是RTSG,目的地是以太网广播地址,类型字段包含十六进制0806(类型ETHER_ARP),总长度为64字节。

TCP数据包

(注意:下面的描述假定你熟悉RFC-793中描述的TCP协议,如果你不熟悉协议,那么这个描述和tcpdump都不会对你有太大用处。)

一个tcp协议的一般格式是:

src> dst:flags data-seqno ack窗口紧急选项

Srcdst是源和目标IP地址和端口。 标志是S(SYN),F(FIN),P(PUSH)或R(RST)或单个'。'的组合。 (没有标志)。 Data-seqno描述了数据包中数据覆盖的部分序列空间(参见下面的示例)。 Ack是此连接上预期的另一个方向的下一个数据的序列号。 窗口是在此连接上可用的接收缓冲区空间的另一个方向的字节数。 Urg表示数据包中有'紧急'数据。 选项是用尖括号括起来的tcp选项(例如,)。

Src,dst标志总是存在。 其他字段取决于数据包的TCP协议头的内容,只有在适当的情况下才会输出。

这是从主机rtsg到主机csam的rlogin的开头部分。

rtsg.1023> csam.login:S 768512:768512(0)win 4096 csam.login> rtsg.1023:S 947648:947648(0)ack 768513 win 4096 rtsg.1023> csam。登录: 。 ack 1 win 4096 rtsg.1023> csam.login:P 1:2(1)ack 1 win 4096 csam.login> rtsg.1023:。 ack 2 win 4096 rtsg.1023> csam.login:P 2:21(19)ack 1 win 4096 csam.login> rtsg.1023:P 1:2(1)ack 21 win 4077 csam.login> rtsg.1023: P 2:3(1)ack 21 win 4077 urg 1 csam.login> rtsg.1023:P 3:4(1)ack 21 win 4077 urg 1

第一行表示rtsg上的tcp端口1023向csam上的端口登录发送了一个数据包。 S表示已设置SYN标志。 数据包序列号是768512,它不包含数据。 (符号是'first:last(nbytes)',意思是“序列号到达,但不包括最后一个是用户数据的nbytes字节”)。没有捎带的ack,可用的接收窗口是4096字节,有一个最大段大小的选项请求1024字节的mss。

Csam会回复一个类似的数据包,但它包含rtsg的SYN的背驮式确认。 Rtsg然后赞成csam的SYN。 '。' 意味着没有设置标志。 数据包不包含数据,因此没有数据序列号。 请注意,确认序列号是一个小整数(1)。 tcpdump第一次看到一个tcp“对话”时,它会打印来自数据包的序列号。 在会话的后续数据包中,将打印当前数据包的序列号与此初始序列号之间的差异。 这意味着第一个之后的序列号可以被解释为对话数据流中的相对字节位置(每个方向的第一个数据字节为'1')。 `-S'将覆盖此功能,导致输出原始序列号。

在第6行,rtsg发送csam 19个字节的数据(在对话的rtsg - > csam侧的字节2到20)。 PUSH标志在数据包中设置。 在第7行,csam表示它收到了由rtsg发送的数据,但不包括字节21.大部分数据显然都位于套接字缓冲区中,因为csam的接收窗口已经减少了19个字节。 Csam还在这个数据包中发送一个字节的数据给rtsg。 在第8行和第9行,csam发送两个字节的紧急数据到rtsg。

如果快照足够小以至于tcpdump没有捕获完整的TCP报头,它会尽可能多地解释报头,然后报告“[| tcp ]''来表示余数不能被解释。 如果头部包含一个虚假选项(一个长度太小或超出头部末尾), tcpdump会将其报告为“[ bad opt ]”,并不会解释任何其他选项(因为无法分辨他们在哪里开始)。 如果标题长度指示存在选项,但IP数据报长度不足以使选项实际存在,则tcpdump将其报告为“[ bad hdr length ]”。

捕获具有特定标志组合的TCP数据包(SYN-ACK,URG-ACK等)

TCP报头的控制位部分有8位:

CWR | ECE | URG | ACK | PSH | RST | SYN |

假设我们想要观察用于建立TCP连接的数据包。 回想一下,TCP在初始化一个新的连接时使用3次握手协议; 关于TCP控制位的连接顺序是

1)呼叫者发送SYN

2)收件人用SYN,ACK进行响应

3)主叫方发送ACK

现在我们对捕获仅包含SYN位的数据包感兴趣(步骤1)。 请注意,我们不希望步骤2(SYN-ACK)的数据包,只是一个普通的初始SYN。 我们需要的是tcpdump的正确过滤表达式。

回想一下没有选项的TCP头的结构:

0 15 31 ----------------------------------------------- ------------------ | 源端口| 目标端口| -------------------------------------------------- --------------- | 序号| -------------------------------------------------- --------------- | 确认号码 -------------------------------------------------- --------------- | HL | rsvd | C | E | U | A | P | R | S | F | 窗口大小| -------------------------------------------------- --------------- | TCP校验和| 紧急指针| -------------------------------------------------- ---------------

除非有选项,否则TCP头通常会保存20个八位字节的数据。 图的第一行包含八位字节0 - 3,第二行显示八位字节4 - 7等。

从0开始计数,相关的TCP控制位包含在八位组13中:

0 7 | 15 | 23 | 31 ---------------- | --------------- | --------------- | ---------------- | HL | rsvd | C | E | U | A | P | R | S | F | 窗口大小| ---------------- | --------------- | --------------- | - --------------- | | 第13个八位字节| | |

让我们仔细看看八位字节号。 13:

| | | --------------- | | C | E | U |甲| P | R | S | F | | --------------- | | 7 5 3 0 |

这些是我们感兴趣的TCP控制位。我们对这个八位位组中的位从0到7,从右到左编号,所以PSH位是位编号3,而URG位是编号5。

回想一下,我们想要捕获只有SYN集的数据包。 让我们来看看如果一个TCP数据报到达并且在其头部设置了SYN位,会发生什么情况?

| C | E | U |甲| P | R | S | F | | --------------- | | 0 0 0 0 0 0 1 0 | | --------------- | | 7 6 5 4 3 2 1 0 |

看看控制位部分,我们看到只有位1(SYN)被设置。

假定八位字节编号13是网络字节顺序中的8位无符号整数,则该八位字节的二进制值是

00000010

并且其十进制表示是

7 6 5 4 3 2 1 0 0 * 2 + 0 * 2 + 0 * 2 + 0 * 2 + 0 * 2 + 0 * 2 + 1 * 2 + 0 * 2 = 2

我们已经差不多完成了,因为现在我们知道如果只设置了SYN,TCP头中的第13个八位字节的值在网络字节顺序中解释为8位无符号整数时,必须恰好为2。

这种关系可以表示为

tcp [13] == 2

我们可以使用这个表达式作为tcpdump的过滤器,以便观察只有SYN集合的数据包:

tcpdump -i xl0 tcp [13] == 2

表达式表示“让TCP数据报的第13个八位字节具有十进制值2”,这正是我们想要的。

现在,我们假设我们需要捕获SYN数据包,但我们并不在乎ACK或任何其他TCP控制位是否同时被设置。 让我们来看看带有SYN-ACK集合的TCP数据报到达时发生的八位组13:

| C | E | U |甲| P | R | S | F | | --------------- | | 0 0 0 1 0 0 1 0 | | --------------- | | 7 6 5 4 3 2 1 0 |

现在比特1和4被设置在第13个八位字节中。 八位字节13的二进制值是


00010010

这转换为十进制

7 6 5 4 3 2 1 0 0 * 2 + 0 * 2 + 0 * 2 + 1 * 2 + 0 * 2 + 0 * 2 + 1 * 2 + 0 * 2 = 18

现在我们不能仅仅在tcpdump过滤器表达式中使用'tcp [13] == 18',因为那样只会选择那些设置了SYN-ACK的数据包,而不是那些只有SYN设置的数据包。 请记住,只要设置了SYN,我们就不在乎是否设置了ACK或任何其他控制位。

为了实现我们的目标,我们需要将八位组13的二进制值与其他值进行逻辑与,以保留SYN位。 我们知道我们希望在任何情况下都设置SYN,所以我们将第13个字节中的值与SYN的二进制值进行逻辑与:

00010010 SYN-ACK 00000010 SYN和00000010(我们需要SYN)和00000010(我们需要SYN)-------- -------- = 00000010 = 00000010

我们看到,无论是否设置了ACK或另一个TCP控制位,此AND操作都会提供相同的结果。 AND值的十进制表示以及此操作的结果是2(二进制00000010),所以我们知道对于设置了SYN的数据包,以下关系必须为真:

((八位字节13的值)AND(2))==(2)

这将我们引向tcpdump过滤器表达式

tcpdump -i xl0'tcp [13]&2 == 2'

请注意,您应该在表达式中使用单引号或反斜杠来从shell中隐藏AND('&')特殊字符。

UDP数据包

UDP格式由这个rwho数据包说明:

actinide.who> broadcast.who:udp 84

这就是说,主机上的港口发送了一个udp数据报给主机广播端口上的互联网广播地址。 数据包包含84个字节的用户数据。

一些UDP服务被识别(来自源或目标端口号)和打印更高级别的协议信息。 特别是,NFS的域名服务请求(RFC-1034/1035)和Sun RPC调用(RFC-1050)。

UDP名称服务器请求

(注意:以下描述假定您熟悉RFC-1035中描述的域服务协议,如果您不熟悉该协议,下面的描述将显示为希腊语。)

名称服务器请求格式为

src> dst:id op? flags qtype qclass name(len) h2opolo.1538> helios.domain:3+ A? ucbvax.berkeley.edu。 (37)

主机h2opolohelios的域名服务器询问与名称ucbvax.berkeley.edu相关的地址记录(qtype = A) 查询ID是'3'。 '+'表示已设置递归期望标志。 查询长度为37个字节,不包括UDP和IP协议头。 查询操作是正常的查询操作,因此操作字段被省略。 如果该操作是其他任何操作,则会在“3”和“+”之间打印。 类似地,qclass是正常的, C_IN ,并且被省略。 任何其他qclass将在“A”后立即打印。

检查了一些异常,并可能导致在方括号中包含额外的字段:如果查询包含答案,授权记录或附加记录部分, 则将ancountnscountarcount打印为`[ n a]',`[ n n ]'或`[ n au]',其中n是适当的数量。 如果设置了任何响应位(AA,RA或rcode)或任何'必须为零'位以字节2和3设置,则打印`[b2&3 = x ]',其中x是十六进制值标题字节二和三。

UDP名称服务器响应

名称服务器响应格式为

src> dst:id op rcode flags a / n / au type class data(len) helios.domain> h2opolo.1538:3 3/3/7 A 128.32.137.3(273)helios.domain> h2opolo.1537:2 NXDomain * 0/1/0(97)

在第一个例子中, helios响应来自h2opolo的查询id 3, 其中有3个答案记录,3个名称服务器记录和7个附加记录。 第一个答案记录是A型(地址),其数据是互联网地址128.32.137.3。 响应的总大小为273字节,不包括UDP和IP标头。 op(查询)和响应代码(NoError)被忽略,A记录的类(C_IN)也被忽略。

在第二个例子中, helios以不存在答案的不存在域(NXDomain)的响应代码,一个名称服务器和无权限记录对查询2作出响应。 “*”表示权威答案位已设置。 由于没有答案,没有打印任何类型,类别或数据。

可能出现的其他标志字符是“ - ”(递归可用,RA, 设置)和“|” (截断消息,TC,集合)。 如果“问题”部分不包含一个条目,则会打印“[ n q]”。

请注意,名称服务器请求和响应通常很大,并且68字节的缺省snaplen可能无法捕获足够的数据包进行打印。 如果您需要认真调查名称服务器流量,请使用-s标志来增加snaplen。 ` -s 128 '对我来说效果很好。

SMB / CIFS解码

tcpdump现在包含针对UDP / 137,UDP / 138和TCP / 139上的数据的相当广泛的SMB / CIFS / NBT解码。 IPX和NetBEUI SMB数据的一些原始解码也已完成。

默认情况下,完成一个相当小的解码,如果使用-v,则执行更详细的解码。 要注意的是,使用-va单个SMB数据包可能占用一页或更多页面,所以只有使用-v时,如果你真的想要所有的细节。

如果您正在解码包含unicode字符串的SMB会话,那么您可能希望将环境变量USE_UNICODE设置为1.自动检测unicode srings的补丁将受到欢迎。

有关SMB数据包格式的信息以及所有te字段的含义,请参阅www.cifs.org或您最喜爱的samba.org镜像站点上的pub / samba / specs /目录。 SMB补丁由Andrew Tridgell(tridge@samba.org)撰写。

NFS请求和回复

Sun NFS(网络文件系统)请求和答复打印为:

src.xid> dst.nfs:len op args src.nfs> dst.xid:回复stat len操作结果 sushi.6709> wrl.nfs:112 readlink fh 21,24 / 10.73165 wrl.nfs> sushi.6709:回复正常40 readlink“../var”sushi.201b> wrl.nfs:144查找fh 9,74 / 4096.6878“xcolors”wrl.nfs> sushi.201b:回复ok 128查找fh 9,74 / 4134.3150

在第一行中,主持人sushi发送一个id为6709的事务给wrl (请注意,src主机后面的数字是一个事务id, 而不是源端口)。 该请求是112个字节,不包括UDP和IP标头。 该操作是文件句柄( fh )21,24 / 10.731657119上的readlink (读取符号链接)。 (如果幸运的话,就像在这种情况下一样,文件句柄可以被解释为主要次要设备号码对,后面跟着inode号码和世代号。) Wrl用链接的内容回答'ok'。

在第三行中, 寿司要求在目录文件9,74 / 4096.6878中查找名称“ xcolors ”。 请注意,打印的数据取决于操作类型。 如果与NFS协议规范一起阅读,该格式旨在自我解释。

如果给出-v(详细)标志,则会打印附加信息。 例如:

sushi.1372a> wrl.nfs:148读取fh 21,11 / 12.195 8192字节@ 24576 wrl.nfs> sushi.1372a:回复ok 1472读取REG 100664 id 417/0 sz 29388

(-v还打印IP头TTL,ID,长度和分段字段,在本例中省略了这些字段)。在第一行中, 寿司要求wrl从字节偏移量21,11 / 12.195中读取8192个字节24515.Wrl回复'ok'; 第二行显示的数据包是答复的第一个片段,因此只有1472字节长(其他字节将在随后的片段中出现,但这些片段没有NFS甚至UDP头,因此可能不会打印,取决于所使用的过滤器表达式)。 因为-v标志被给出,所以会打印一些文件属性(除了文件数据外还有其他文件属性):文件类型(“REG”,常规文件),文件模式(八进制), uid和gid以及文件大小。

如果给出-v标志不止一次,则会打印更多详细信息。

请注意,NFS请求非常大,除非增加snaplen,否则不会打印大部分细节。 尝试使用` -s 192 '来观察NFS流量。

NFS回复数据包不明确识别RPC操作。 相反, tcpdump会跟踪“最近”的请求,并将它们与使用事务ID的回复相匹配。 如果回复没有严格遵循相应的请求,则可能无法解析。

AFS请求和答复

Transarc AFS(Andrew文件系统)请求和答复打印为:

src.sport> dst.dport:rx数据包类型 src.sport> dst.dport:rx数据包类型服务调用call-name args src.sport> dst.dport:rx数据包类型服务回复call-name args elvis。 7001> pike.afsfs:rx data fs call rename old fid 536876964/1/1“.newsrc.new”new fid 536876964/1/1“.newsrc”pike.afsfs> elvis.7001:rx data fs reply rename

在第一行中,主机elvis发送一个RX数据包给派克。 这是一个到fs(fileserver)服务的RX数据包,并且是RPC调用的开始。 RPC调用是重命名,旧的目录文件ID为536876964/1/1,旧的文件名为.newsrc.new,新的目录文件ID为536876964/1/1,文件名为。 newsrc”。 主机pike响应重命名调用的RPC回复(这是成功的,因为它是一个数据包而不是中止包)。

一般来说,所有的AFS RPC至少被RPC调用名称解码。 大多数AFS RPC至少有一些解码的参数(通常只有“有趣的”参数,对于一些有趣的定义)。

该格式旨在自我描述,但对于不熟悉AFS和RX的工作的人可能没有用处。

如果-v(详细)标志被赋予两次,则会打印确认包和附加标头信息,例如RX呼叫ID,呼叫号码,序列号,序列号和RX包标志。

如果给出-v标志两次,则会打印附加信息,例如RX呼叫ID,序列号和RX包标志。 MTU协商信息也从RX ack数据包打印。

如果-v标志被给出三次,则打印安全索引和服务标识。

错误代码被打印用于中止数据包,但Ubik信标数据包除外(因为中止数据包用于表示对Ubik协议是肯定的投票)。

请注意,AFS请求非常大,除非增加snaplen,否则许多参数不会被打印。 尝试使用` -s 256 '来观看AFS流量。

AFS应答数据包不明确识别RPC操作。 相反, tcpdump会跟踪“最近”的请求,并将它们与使用电话号码和服务ID的回复进行匹配。 如果回复没有严格遵循相应的请求,则可能无法解析。

KIP Appletalk(UDP中的DDP)

封装在UDP数据报中的Appletalk DDP数据包被解封装并作为DDP数据包转储(即所有的UDP头信息都被丢弃)。 文件/etc/atalk.names用于将appletalk网络和节点号码转换为名称。 此文件中的行具有表单

编号名称 1.254乙醚16.1 icsd-net 1.254.110 ace

前两行给出了appletalk网络的名称。 第三行给出了一个特定主机的名称(一个主机通过数字中的第三个八位字节与网络区分 - 净数必须有两个八位字节,而主机号必须有三个八位字节)。数字和名称应该分开由空白(空格或制表符)。 /etc/atalk.names文件可能包含空白行或注释行(以'#'开头的行)。

Appletalk地址以下列格式打印:

net.host.port 144.1.209.2> icsd-net.112.220 office.2> icsd-net.112.220 jssmag.149.235> icsd-net.2

(如果/etc/atalk.names不存在或不包含某个appletalk主机/网络号的条目,则地址以数字形式打印。)在第一个示例中,网络上的NBP(DDP端口2)144.1节点209正在向正在监听网络icsd节点112的端口220上的任何节点发送。除了已知源节点的全名(“办公室”)之外,第二行是相同的。 第三行是从网络jssmag节点149上的端口235发送到icsd-net NBP端口上广播(请注意,广播地址(255)由没有主机号码的网络名称指示 - 因此,这是一个好主意保持/etc/atalk.names中的节点名称和网络名称不同)。

NBP(名称绑定协议)和ATP(Appletalk事务协议)数据包解释了其内容。 其他协议只是转储协议名称(或编号,如果没有名称注册的协议)和数据包大小。

NBP数据包的格式如下例所示:

icsd-net.112.220> jssmag.2:nbp-lkup 190:“=:LaserWriter @ *”jssmag.209.2> icsd-net.112.220:nbp-reply 190:“RM1140:LaserWriter @ *”250 techpit.2> icsd -net.112.220:nbp-reply 190:“techpit:LaserWriter @ *”186

第一行是由net icsd主机112发送并在net jssmag上广播的激光写入器的名称查找请求。 第二行显示来自主机jssmag.209的对该请求的回复(注意它具有相同的ID),表示它具有在端口250上注册的名为“RM1140”的激光打字机资源。第三行line是对同一请求的另一个回复,称主机techpit有在186端口上注册的laserwriter“techpit”。

以下示例演示了ATP数据包格式化:

jssmag.209.165> helios.132:atp-req 12266 <0-7> 0xae030001 helios.132> jssmag.209.165:atp-resp 12266:0(512)0xae040000 helios.132> jssmag.209.165:atp-resp 12266:1 (512)0xae040000 helios.132> jssmag.209.165:atp-resp 12266:2(512)0xae040000 helios.132> jssmag.209.165:atp-resp 12266:3(512)0xae040000 helios.132> jssmag.209.165:atp- (512)0xae040000 helios.132> jssmag.209.165:atp-resp 12266:5(512)0xae040000 helios.132> jssmag.209.165:atp-resp 12266:6(512)0xae040000 helios.132> jssmag。 209.165:atp-resp * 12266:7(512)0xae040000 jssmag.209.165> helios.132:atp-req 12266 <3,5> 0xae030001 helios.132> jssmag.209.165:atp-resp 12266:3(512)0xae040000 helios .132> jssmag.209.165:atp-resp 12266:5(512)0xae040000 jssmag.209.165> helios.132:atp-rel 12266 <0-7> 0xae030001 jssmag.209.133> helios.132:atp-req * 12267 <0 -7> 0xae030002

Jssmag.209通过请求多达8个数据包(`<0-7>')来启动与主机helios的事务ID 12266。 行尾的十六进制数字是请求中`userdata'字段的值。

Helios响应8个512字节的数据包。 事务id后面的`:digit'给出了事务中的包序号,parens中的数字是包中的数据量,不包括atp头。 数据包7上的'*'表示EOM位已设置。

然后Jssmag.209请求重传包3和5。 Helios重新发送它们,然后jssmag.209释放事务。 最后,jssmag.209发起下一个请求。 请求中的'*'表示XO('只有一次') 没有设置。

IP碎片

碎片化的Internet数据报打印为

(frag id size @ offset +) (frag id size @ offset

(第一种形式表示有更多的片段,第二种表示这是最后一个片段。)

Id是片段ID。 大小是除IP标头外的片段大小(以字节为单位)。 偏移量是原始数据报中该片段的偏移量(以字节为单位)。

片段信息为每个片段输出。 第一个片段包含更高级别的协议头,并且在协议信息之后打印片段信息。 第一个片段之后的片段不包含更高级别的协议头,并且在源地址和目标地址之后打印片段信息。 例如,下面是一个从arizona.edu到lbl-rtsg.arpa的ftp的一部分,它通过CSNET连接看起来并不处理576字节的数据报:

arizona.ftp-data> rtsg.1170:。 1024:1332(308)ack 1 win 4096(frag 595a:328 @ 0 +)亚利桑那州> rtsg:(frag 595a:204 @ 328)rtsg.1170> arizona.ftp-data:。 1536胜2560

在这里需要注意几点:首先,第二行的地址不包含端口号。 这是因为TCP协议信息都在第一个片段中,我们不知道打印后面的片段时端口或序列号是什么。 其次,打印第一行的tcp序列信息时,如果有308字节的用户数据,实际上有512个字节(第一个碎片中的308个,第二个中的204个)打印出来。 如果您正在寻找序列空间中的空洞或尝试将数据包与数据包进行匹配,这可能会欺骗您。

具有IP 不分段标志的数据包标有尾随(DF)

时间戳

默认情况下,所有输出行前面都有一个时间戳。 时间戳是表单中的当前时钟时间

HH:MM:ss.frac

并且与内核的时钟一样精确。 时间戳反映内核第一次看到数据包的时间。 没有尝试去考虑以太网接口从数据包中删除数据包与内核服务于“新数据包”中断之间的时间差。

也可以看看

流量(1C),nit(4P),bpf(4),pcap(3)

重要提示:使用man命令( %man )查看特定计算机上的命令使用方式。