在类似Unix的操作系统上,tcpdump收集网络流量的原始转储。 本文档介绍了tcpdump的Linux版本。
查看英文版
1 tcpdump 运行系统环境
2 tcpdump 说明
3 tcpdump 语法
4 tcpdump 例子
Linux
Tcpdump 在网络接口上打印出与命令行上指定的布尔表达式匹配的数据包内容的描述。它也可以与-w标志一起运行,这会导致将数据包数据保存到文件中以供以后分析;也可以与-r标志一起运行,这会使它从已保存的数据包文件中读取,而不是从其中读取数据包。网络接口。
Tcpdump (如果未与-c标志一起运行)将继续捕获数据包,直到它被SIGINT 信号(例如,当用户键入中断 字符,通常为control-C)或SIGTERM信号(通常由kill生成)中断为止命令); 如果使用-c标志运行,它将捕获数据包,直到被SIGINT或SIGTERM信号中断或指定数量的数据包已被处理为止。
当tcpdump完成捕获数据包时,它将报告以下计数:
在支持SIGINFO信号的平台(例如大多数BSD操作系统(包括macOS X)和Digital / Tru64 UNIX)上,它将在收到SIGINFO信号(例如,通过键入“状态”字符生成(例如))时报告这些计数,通常为control-T;尽管在某些平台上,例如macOS X,默认情况下未设置“状态”字符,因此必须使用stty进行设置才能使用它),并将继续捕获数据包。
从网络接口读取数据包可能需要您具有特殊的特权 ; 有关详细信息,请参见pcap(3PCAP)手册。读取保存的数据包文件不需要特殊的特权。
查看英文版
tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ] [ -C file_size ] [ -G rotate_seconds ] [ -F file ] [ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ] [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ] [ -E spi@ipaddr algo:secret,... ] [ -y datalinktype ] [ -z postrotate-command ] [ -Z user ] [ expression ]
选件
-A | 以ASCII格式打印每个数据包(减去其链接级标题)。方便捕获网页。 |
-b | 以ASDOT表示法而不是ASPLAIN表示法打印BGP数据包中的AS编号。 |
-B buffer_size | 将操作系统捕获缓冲区大小设置为buffer_size,以KiB(1024 字节)为单位。 |
-c count | 收到计数包后退出。 |
-C file_size | 在将原始数据包写入保存文件之前,请检查文件当前是否大于file_size,如果是,则关闭当前保存文件并打开一个新文件。第一个保存文件之后的保存文件具有用-w标志指定的名称,后跟一个数字,从1开始并一直向上。file_size的单位是数百万个字节(1,000,000字节,而不是1,048,576字节)。 |
-d | 以人类可读的形式将编译后的数据包匹配代码转储到标准输出并停止。 |
-dd | 将数据包匹配代码转储为C程序片段。 |
-ddd | 将数据包匹配代码转储为十进制数字(带计数)。 |
-D |
打印系统上可用的网络接口列表,tcpdump可以在该网络接口上捕获数据包。对于每个网络接口,将打印一个数字和一个接口名称,并可能在其后显示该接口的文本描述。可以将接口名称或编号提供给-i标志,以指定要捕获的接口。 在没有命令列出它们的系统上(例如Windows系统或缺少ifconfig -a的 UNIX系统),此选项很有用。该数字在Windows 2000及更高版本的系统上非常有用,在Windows 2000及更高版本的系统上,接口名称是一个有点复杂的字符串。 该-D标志将不被支持,如果tcpdump是使用缺少pcap_findalldevs()函数的libpcap的较早版本构建的。 |
-e | 在每个转储行上打印链接级标题。 |
-E |
使用SPI @ IPADDR 算法中:秘密的解密 的IPsec ESP寻址到分组地址,并包含安全参数索引值SPI。可以用逗号或换行符分隔重复此组合。 请注意,目前支持为IPv4 ESP数据包设置密钥。 算法可以是des-cbc, 3des-cbc,blowfish-cbc,rc3-cbc,cast128-cbc或无。 默认值为des-cbc。只有在启用了加密功能的情况下编译tcpdump时,才具有解密数据包的能力。 secret是ESP密钥的ASCII文本。如果以0x开头,则将读取一个十六进制值。 该选项假定使用RFC 2406 ESP,而不是RFC 1827 ESP。该选项仅用于调试目的,不建议将此选项与真正的“秘密”密钥一起使用。通过在命令行上显示IPsec秘密密钥,您可以通过ps(1)和其他场合将其公开给他人。 除上述语法外,语法文件名还可用于使tcpdump使用文件中的数据。该文件在收到第一个ESP数据包后便打开,因此tcpdump可能已赋予的任何特殊权限都应该已经放弃。 |
-f |
用数字而不是符号打印“外部” IPv4地址(此选项旨在解决Sun NIS服务器的问题-通常,它永久挂起翻译本地的Internet号码)。 使用在其上进行捕获的接口的IPv4地址和网络掩码来完成对“外部” IPv4地址的测试。如果该地址或网络掩码不可用,或者是因为正在执行捕获的接口没有地址或网络掩码,或者是因为正在Linux的“ any ”接口上进行了捕获,而该接口可以在多个接口上进行捕获,所以此选项将无法正常工作。 |
-F file | 将文件用作过滤器表达式的输入。命令行上给出的其他表达式将被忽略。 |
-G rotate_seconds |
如果指定,则每隔rotate_seconds秒旋转一次使用-w选项指定的转储文件。保存文件的名称由-w指定,该名称应包含strftime定义的时间格式。如果未指定时间格式,则每个新文件都将覆盖前一个文件。 如果与-C选项一起使用,则文件名的格式为' file'。 |
-h | 打印tcpdump和libpcap版本字符串,打印用法消息,然后退出。 |
-H | 尝试检测802.11s草案网格标头。 |
-i interface |
在界面上收听。如果未指定,则tcpdump在系统接口列表中搜索编号最小,配置最多的接口(不包括环回)。通过选择最早的比赛来打破关系。 在具有2.2或更高版本内核的Linux系统上,可以使用接口参数“ any ”捕获来自所有接口的数据包。注意,在“ any ”设备上的捕获不会以混杂模式进行。如果支持-D标志,则可以将该标志打印的接口号用作接口参数。 |
-I |
将接口置于“监视模式”;仅在IEEE 802.11 Wi-Fi接口上支持此功能,并且在某些操作系统上仅支持此功能。 请注意,在监视方式下,适配器可能会与与其关联的网络解除关联,因此您将无法使用该适配器使用任何无线网络。如果您以监视方式捕获并且未使用其他适配器连接到另一个网络,则这可能会阻止访问网络服务器上的文件或解析主机名或网络地址。 该标志将影响-L标志的输出。如果未指定-I,则仅显示那些不在监视方式下可用的链路层类型;如果-I 如果指定,则仅显示在监视模式下可用的那些链路层类型。 |
-j tstamp_type | 将捕获的时间戳类型设置为tstamp_type。在pcap-tstamp-type(7)中给出了用于时间戳类型的名称。并非所有列出的类型对于任何给定接口都必须有效。 |
-J | 列出接口支持的时间戳类型并退出。如果无法为接口设置时间戳类型,则不会列出任何时间戳类型。 |
-K | 列出接口支持的时间戳类型并退出。如果无法为接口设置时间戳类型,则不会列出任何时间戳类型。 |
-l |
使标准输出行缓冲。如果要在捕获数据时查看数据,则很有用。例如,tcpdump -l | tee dator tcpdump -l > dat & tail -f dat请注意,在Windows上,“行缓冲”表示“未缓冲”,因此,如果指定了-l,则WinDump将分别写入每个字符。 -U的行为与-l相似,但是它会导致输出被“分组缓冲”,因此输出将在每个数据包的末尾而不是在每一行的末尾写入stdout;这在包括Windows在内的所有平台上都有缓冲。 |
-L | 列出指定模式下接口的已知数据链路类型,然后退出。已知数据链路类型的列表可能取决于指定的模式。例如,在某些平台上,Wi-Fi接口在不处于监视模式时可能支持一组数据链路类型(例如,它可能仅支持伪造的以太网标头,或者可能支持802.11标头,但不支持带有无线电信息的802.11标头。 )以及在监控器模式下的另一组数据链路类型(例如,仅在监控器模式下,它可能支持802.11标头或带有无线电信息的802.11标头)。 |
-m module | 从文件模块加载SMI MIB模块定义。可以多次使用此选项,以将多个MIB模块加载到tcpdump中。 |
-M secret | 如果使用TCP- MD5选项(RFC 2385),可以使用secret作为共享密钥来验证在TCP段中找到的摘要。 |
-n | 不要将地址(即主机地址,端口号等)转换为名称。 |
-N | 不要打印主机名的域名限定。例如,如果提供此标志,则tcpdump将打印“ nic”而不是“ nic.ddn.mil”。 |
-O | 不要运行数据包匹配代码优化器。仅当您怀疑优化器中存在错误时,此选项才有用。 |
-p | 不要将接口置于混杂模式。请注意,由于某些其他原因,接口可能处于混杂模式。因此,“ -p ”不能用作“以太主机{local-hw-addr}或以太广播的缩写”。 |
-q | 快速/安静的输出。打印较少的协议信息,因此输出行更短。 |
-R | 假设ESP / AH数据包基于旧规范(RFC1825至RFC1829)。如果指定,tcpdump将不会显示防止重放的字段。由于ESP / AH规范中没有协议版本字段,因此tcpdump无法推断ESP / AH协议的版本。 |
-r file | 从文件(使用-w选项创建)中读取数据包。如果文件为“ - ”,则使用标准输入。 |
-S | 打印绝对而不是相对的TCP序列号。 |
-s snaplen | Snarf snaplen有字节的数据从每个分组而不是65535个字节的缺省值。由于快照受限而被截断的数据包在输出中以“ [| proto] ”表示,其中proto是发生截断的协议级别的名称。请注意,拍摄较大的快照既增加了处理数据包的时间,又有效地减少了数据包缓冲的时间。这可能会导致数据包丢失。您应该将snaplen限制为将捕获您感兴趣的协议信息的最小数量。将snaplen设置为0会将其设置为默认值65535,例如向后兼容最新版本的tcpdump。 |
-T type | 强制将由“表达式”选择的数据包解释为指定的类型。当前已知的类型是aodv(临时按需距离矢量协议),cnfp(Cisco NetFlow协议),rpc(远程过程调用),rtp(实时应用协议),rtcp(实时应用控制协议),snmp(简单网络管理协议),tftp(临时文件传输协议),vat(可视音频工具)和wb(分布式白板)。 |
-t | 不要在每个转储行上打印时间戳。 |
-tt | 请在每个转储行上打印未格式化的时间戳。 |
-ttt | 在每个转储行的当前行和上一行之间打印增量(微秒分辨率)。 |
-tttt | 在每个转储行上以默认格式打印时间戳,并在日期之前加上日期。 |
-ttttt | 在每个转储行的当前行和第一行之间打印增量(微秒分辨率)。 |
-u | 打印未解码的NFS句柄。 |
-U |
如果未指定-w选项,则使打印的数据包输出为“ packet-buffered”;即,当打印每个数据包内容的描述时,它将被写入标准输出,而不是在不写入终端时,仅在输出缓冲区已满时才写入。 如果指定了-w选项,则将保存的原始数据包输出设置为“ packet-buffered”;也就是说,保存每个数据包时,会将其写入输出文件,而不是仅在输出缓冲区填满时才写入。该-U如果标志将不被支持的tcpdump与旧版本的libpcap的缺乏内置pcap_dump_flush()函数。 |
-v |
解析和打印时,产生(略多)详细输出。例如,打印IP数据包中的生存时间,标识,总长度和选项。此外,启用其他数据包完整性检查,例如验证IP和ICMP标头校验和。 当使用-w选项写入文件时,每10秒钟报告一次捕获的数据包数量。 |
-vv | 更详细的输出。例如,从NFS答复数据包中打印其他字段,并对SMB数据包进行完全解码。 |
-vvv | 更详细的输出。例如,telnet SB ... SE选项将完整打印。使用-X Telnet选项时,也以十六进制打印。 |
-w |
将原始数据包写入文件,而不是解析并打印出来。以后可以使用-r选项打印它们。如果文件为“ - ”,则使用标准输出。 如果将该输出写入文件或管道,则将对其进行缓冲,因此从文件或管道读取的程序在接收到数据包后的任意时间内可能看不到它们。使用-U标志使数据包在收到后立即被写入。 有关文件格式的说明,请参见pcap-savefile(5)。 |
-W |
与-C选项一起使用,这会将创建的文件数限制为指定的数目,并从头开始覆盖文件,从而创建“旋转”缓冲区。同样,它将以足够的前导0命名文件,以支持最大数量的文件,从而使它们能够正确排序。 与-G选项一起使用,这将限制所创建的旋转转储文件的数量,达到限制时以状态0退出。如果也与-C一起使用,则该行为将导致每个时间片产生周期性文件。 |
-x | 解析和打印时,除了打印每个数据包的标题外,还以十六进制打印每个数据包的数据(减去其链接级别的标题)。整个数据包或快照字节中较小的一个将被打印。请注意,这是整个链路层数据包,因此对于填充(例如以太网)的链路层,当较高层数据包短于所需填充时,填充字节也将被打印出来。 |
-xx | 解析和打印时,除了打印每个数据包的标头外,还以十六进制打印每个数据包的数据,包括其链接级别标头。 |
-X | 解析和打印时,除了打印每个数据包的标题外,还以十六进制和ASCII打印每个数据包的数据(减去其链接级别的标题)。此选项对于分析新协议非常方便。 |
-XX | 解析和打印时,除了打印每个数据包的标头外,还以十六进制和ASCII码打印每个数据包的数据,包括其链接级别标头。 |
-y datalinktype | 设置将数据包捕获到datalinktype时要使用的数据链路类型。 |
-z postrotate-command |
与-C或-G选项一起使用,这将使tcpdump运行“ command file ”,其中file是每次旋转后关闭的保存文件。例如,指定-z gzip或-z bzip2将使用gzip或bzip2压缩每个保存文件。 请注意,tcpdump将使用最低优先级与捕获并行运行命令,以免打扰捕获过程。 并且,如果您想使用本身带有标志或其他参数的命令,则始终可以编写一个以保存文件名作为唯一参数的shell脚本,并在其中添加&参数安排并执行所需的命令。 |
-Z user |
如果tcpdump以root身份运行,则在打开捕获设备或输入保存文件之后,但在打开任何保存文件以进行输出之前,请将用户ID更改为user,将组ID更改为主要的user组。 默认情况下,也可以在编译时启用此行为。 |
expression |
选择要转储的数据包。如果未给出任何表达式,则网络上的所有数据包都将被转储。否则,将仅转储表达式为“ true ”的数据包。 有关表达式语法,请参见pcap-filter(7)。 表达式参数可以作为单个参数或多个参数传递到tcpdump,以较方便的方式为准。 通常,如果表达式包含Shell元字符,则更容易将其作为单个引用的参数传递。多个参数在解析之前用空格连接。 |
输出格式
tcpdump的输出取决于协议。以下给出了大多数格式的简要说明和示例。
链接级别标题
如果给出' -e '选项,则打印出链接级别标题。在以太网上,将打印源和目标地址,协议和数据包长度。
在FDDI网络上,“- e ”选项使tcpdump打印“ 帧控制 ”字段,源和目标地址以及数据包长度。(“帧控制”字段控制其余数据包的解释。普通数据包(例如包含IP数据报的数据包)是优先级介于0到7之间的“ 异步 ”数据包;例如,“ 异步4 ”。数据包假定包含802.2逻辑链路控制(LLC)数据包;如果它不是ISO数据报或所谓的SNAP数据包,则打印LLC头。
在令牌环网络上,“- e ”选项使tcpdump打印“ 访问控制 ”和“ 帧控制 ”字段,源和目标地址以及数据包长度。与在FDDI网络上一样,假定数据包包含LLC数据包。无论是否指定了-e选项,都会为源路由包打印源路由信息。
在802.11网络上,“ -e ”选项使tcpdump打印“ 帧控制 ”字段,802.11标头中的所有地址以及数据包长度。与在FDDI网络上一样,假定数据包包含LLC数据包。
注意:以下描述假定您熟悉RFC-1144中描述的SLIP 压缩算法。
在SLIP链接上,将打印出方向指示符(“ I ”代表入站,“ O ”代表出站),数据包类型和压缩信息。首先打印数据包类型。三种类型是ip,utcp和ctcp。没有为IP数据包打印更多的链接信息。对于TCP数据包,连接标识符将按照类型打印。如果压缩了数据包,则将打印出其编码的标头。特殊情况打印为* S + n和* SA + n,其中n是序列号(或序列号和ack的数量)) 已经改变。如果不是特殊情况,则会打印零个或多个更改。更改由U(紧急指针),W(窗口),A(确认),S(序列号)和I(数据包ID)表示,后跟增量(+ 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-has csam tell rtsg arp reply csam is-at CSAM
第一行说rtsg发送了一个arp数据包,询问Internet主机csam的以太网地址。Csam会回复其以太网地址(在此示例中,以太网地址为大写形式,Internet地址为小写形式)。
如果我们完成了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 window urgent options
Src和dst是源IP地址和目标IP地址和端口。标志是S(SYN),F(FIN),P(PUSH),R(RST),U(URG),W(ECN CWR),E(ECN-Echo)或'的某种组合。'(ACK),如果未设置标志,则为' none '。data-seqno描述此数据包中的数据所覆盖的序列空间的一部分(请参见下面的示例)。ack是该连接上另一个方向所期望的下一个数据的序列号。窗口是此连接上另一个方向可用的接收缓冲区空间的字节数。urg表示数据包中有“紧急”数据。选项是尖括号中包含的tcp选项(例如,)。
Src,dst和flags始终存在。其他字段取决于数据包的tcp协议标头的内容,仅在适当时才输出。
这是从主机rtsg到主机csam的rlogin的开头部分。
rtsg.1023 > csam.login: S 768512:768512(0) win 4096csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096rtsg.1023 > csam.login: . 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
第一行说,TCP端口1023上RTSG发送一个数据包到端口登录上CSAM。在小号表明设置SYN标志。数据包序列号为768512,不包含任何数据。表示法是“ first:last(nbytes) ”,这表示“序列号从上至下但不包括用户数据的nbytes字节”。没有后备的ack,可用的接收窗口为4096字节,并且有一个max-segment-size选项,要求mss为1024字节。
Csam回复了一个类似的数据包,除了它包含用于rtsg的SYN的背负式ack。Rtsg然后确认csam的SYN。的' 。'表示已设置ACK标志。该数据包不包含任何数据,因此没有数据序列号。请注意,ack序列号是一个小整数。第一次tcpdump看到一个tcp“对话”,它将打印数据包中的序列号。在会话的后续数据包上,将打印当前数据包的序列号和此初始序列号之间的差异。这意味着可以将第一个之后的序列号解释为会话数据流中的相对字节位置(第一个数据字节的每个方向均为“ 1 ”)。' -S '将覆盖此功能,导致输出原始序列号。
在第6行,rtsg向csam发送19个字节的数据(对话的rtsg→csam端的字节2到20)。在分组中设置PUSH标志。在第七行,csam表示它已收到rtsg发送的数据,但不包括字节21。由于csam的接收窗口已缩小了19个字节,因此大多数数据显然位于套接字缓冲区中。Csam还在此数据包中向rtsg发送一个字节的数据。在第8和9行,csam将两个字节的紧急推送数据发送到rtsg。
如果快照足够小,以至于tcpdump无法捕获完整的TCP标头,则它将尽可能地解释标头,然后报告“ [| tcp] ”以指示无法解释其余标头。如果标头包含伪造的选项(长度太小或超出标头末尾),则tcpdump将其报告为“ [Bad opt] ”,并且不解释任何其他选项(因为无法分辨出它们的位置)开始)。如果报头长度指示存在选项,但IP数据报长度不足以使该选项实际存在,则tcpdump将其报告为“ [错误的hdr长度] ”。
使用特定标志组合(SYN-ACK,URG-ACK等)捕获TCP数据包
TCP标头的控制位部分有8位:
CWR | ECE | URG | ACK | PSH | RST | SYN | FIN
假设我们要监视建立TCP连接中使用的数据包。回想一下,TCP 在初始化新连接时使用3向握手协议。关于TCP控制位的连接顺序为
现在,我们有兴趣捕获仅设置了SYN位的数据包(第1步)。请注意,我们不希望来自第2步(SYN-ACK)的数据包是普通的初始SYN。我们需要的是tcpdump的正确过滤器表达式。
调用不带选项的TCP标头的结构:
0 15 31 ----------------------------------------------------------------- | source port | destination port | ----------------------------------------------------------------- | sequence number | ----------------------------------------------------------------- | acknowledgment number | ----------------------------------------------------------------- | HL | rsvd |C|E|U|A|P|R|S|F| window size | ----------------------------------------------------------------- | TCP checksum | urgent pointer | -----------------------------------------------------------------
除非存在选项,否则TCP标头通常包含20 个八位位组的数据。图表的第一行包含八位字节0-3,第二行显示八位字节4-7等。
从0开始计数,相关的TCP控制位包含在八位位组中:
0 7| 15| 23| 31 ----------------|---------------|---------------|---------------- | HL | rsvd |C|E|U|A|P|R|S|F| window size | ----------------|---------------|---------------|---------------- | | 13th octet | | |
让我们仔细看看八位位组。13:
| | |---------------| |C|E|U|A|P|R|S|F| |---------------| |7 5 3 0|
这些是您感兴趣的TCP控制位。我们已将此字节中的位从右至左从0到7进行了编号,因此PSH位是第3位,而URG位是第5位。
回想一下我们只想捕获设置了SYN的数据包。让我们看看如果TCP数据报到达时在标头中设置了SYN位,则八位位组会发生什么:
|C|E|U|A|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数据报到达八位位组会发生什么:
|C|E|U|A|P|R|S|F| |---------------| |0 0 0 1 0 0 1 0| |---------------| |7 6 5 4 3 2 1 0|
现在,在第13个八位字节中设置了位1和4。八位位组13的二进制值为
00010010
转换为十进制18:
^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-ACK的数据包。请记住,只要设置了SYN,我们就不会在乎是否设置了ACK或任何其他控制位。
为了实现我们的目标,我们需要将八位位组13的二进制值与其他值进行逻辑与运算,以保留SYN位。我们知道在任何情况下都希望设置SYN,因此我们将第13个八位位组中的值与SYN的二进制值进行逻辑与:
00010010 SYN-ACK 00000010 SYN AND 00000010 (we want SYN) AND 00000010 (we want SYN) -------- -------- = 00000010 = 00000010
我们看到,无论是否设置了ACK或另一个TCP控制位,此AND操作都将提供相同的结果。AND值的十进制表示形式以及此操作的结果为2(二进制00000010),因此我们知道,对于具有SYN设置的数据包,以下关系必须成立:
((八位位组13的值)AND(2))==(2)
这使我们指向了tcpdump过滤器表达式
tcpdump -i xl0 'tcp & 2 == 2'
某些偏移量和字段值可以表示为名称而不是数字值。例如,tcp]可以替换为tcp [tcpflags]。以下TCP标志字段值也可用:tcp-fin,tcp-syn,tcp-rst,tcp-push,tcp-act,tcp-urg。
这可以证明为:
tcpdump -i xl0 'tcp[tcpflags] & tcp-push != 0'
请注意,您应在表达式中使用单引号或反斜杠以保护AND(' & ')特殊字符不受外壳影响。
UDP数据包
此rwho数据包说明了UDP格式:
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)
主机h2opolo向helios上的域服务器询问与名称ucbvax.berkeley.edu相关的地址记录(qtype = A)。查询ID为“ 3 ”。“ + ”表示已设置递归期望标志。查询长度为37个字节,不包括UDP和IP协议标头。查询操作是正常的查询操作,因此省略了op字段。如果op还有其他内容,它将在' 3 '和' + ' 之间打印。类似地,qclass是普通的Cclass,C_IN,被省略。任何其他qclass会在' A ' 之后立即打印出来。
检查了一些异常,并可能导致在方括号中包含额外的字段:如果查询包含答案,权限记录或其他记录section,则ancount,nscount或arcount分别打印为' [na] ',' [nn] '或' [nau] ',其中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使用3条应答记录,3条名称服务器记录和7条其他记录来响应来自h2opolo的查询ID 3 。第一个答案记录是类型A(地址),其数据是Internet地址128.32.137.3。响应的总大小为273个字节,不包括UDP和IP标头。省略了op(查询)和响应代码(NoError),以及A记录的类(C_IN)。
在第二示例中,太阳神响应查询2与不存在的结构域(的响应代码的NXDomain),没有回答,一个名称服务器和无规范记录。“ * ”表示已设置权威应答位。由于没有答案,因此不会打印任何类型,类别或数据。
可能出现的其他标志字符是' - '(可用递归,RA,未设置)和' |。'(已截断的消息TC)。如果“问题”部分不完全包含一个条目,则打印“ [nq] ”。
SMB / CIFS解码
tcpdump现在包括相当广泛的SMB / CIFS / NBT解码,用于UDP / 137,UDP / 138和TCP / 139上的数据。还完成了IPX和NetBEUI SMB数据的一些原始解码。
缺省情况下,会完成相当少的解码,而如果使用-v,则会完成更详细的解码。请注意,使用-v时,单个SMB数据包可能会占用一页或更多页,因此,如果您确实想要所有细节,请仅使用-v。
NFS请求和答复
Sun NFS(网络文件系统)的请求和答复显示为:
src.xid > dst.nfs: len op args src.nfs > dst.xid: reply stat len op results sushi.6709 > wrl.nfs: 112 readlink fh 21,24/10.73165 wrl.nfs > sushi.6709: reply ok 40 readlink "../var" sushi.201b > wrl.nfs: 144 lookup fh 9,74/4096.6878 "xcolors" wrl.nfs > sushi.201b: reply ok 128 lookup fh 9,74/4134.3150
在第一行中,主机Sushi将ID为6709的事务发送到wrl(请注意,src主机后面的数字是事务id,而不是源端口)。该请求为112个字节,不包括UDP和IP标头。该操作是文件句柄(fh)21,24 / 10.73165上的readlink(读取符号链接)。如果幸运的话,在这种情况下,文件句柄可以解释为主要,次要设备编号对,然后是索引节点号和生成号。Wrl用链接的内容回复“ ok ”。
在第三行中,sushi要求wrl在目录文件9,74 / 4096.6878中查找名称“ xcolors ” 。请注意,打印的数据取决于操作类型。如果与NFS协议规范一起阅读,则该格式旨在进行自我解释。
如果给出了-v(详细)标志,则将打印其他信息。例如:
sushi.1372a > wrl.nfs: 148 read fh 21,11/12.195 8192 bytes @ 24576 wrl.nfs > sushi.1372a: reply ok 1472 read REG 100664 ids 417/0 sz 29388
-v还显示IP头TTL,ID,length和fragmentation字段,在此示例中已将其省略。在第一行中,Sushi要求wrl从文件21,11 / 12.195读取8192字节,字节偏移量为24576。Wrl回复“ 确定 ”;第二行显示的数据包是回复的第一个片段,因此只有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 packet-type src.sport > dst.dport: rx packet-type service call call-name args src.sport > dst.dport: rx packet-type service reply 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
在第一行中,主机猫王将RX数据包发送给pike。这是发给fs(文件服务器)服务的RX数据包,是RPC调用的开始。RPC调用是重命名的,旧目录文件ID为536876964/1/1,旧文件名为'.newsrc.new',新目录文件ID为536876964/1/1,新文件名为'.newsrc'。主机派克通过对重命名调用的RPC响应进行响应(此操作成功,因为它是一个数据包,而不是中止包)。
通常,所有AFS RPC至少通过RPC调用名称进行解码。大多数AFS RPC至少解码了一些参数(对于一些有趣的定义,通常只有“有趣的”参数)。
该格式旨在进行自我描述,但是对于不熟悉AFS和RX运作方式的人来说,它可能无用。
如果两次给出-v(详细)标志,则会打印确认包和其他报头信息,例如RX呼叫ID,呼叫号,序列号,序列号和RX数据包标志。
如果两次给-v标志,则会打印其他信息,例如RX呼叫ID,序列号和RX数据包标志。MTU协商信息也会从RX ack数据包中打印出来。
如果给-v标志3次,则输出安全索引和服务ID。
为中止数据包打印错误代码,但Ubik信标数据包除外(因为中止数据包用于表示对Ubik协议的赞成票)。
请注意,AFS请求非常大,除非增加snaplen,否则不会输出许多参数。尝试使用“ -s 256 ”观看AFS流量。
AFS答复数据包未明确标识RPC操作。相反,tcpdump会跟踪“最近”的请求,并使用电话号码和服务ID将其与答复匹配。如果答复没有紧随相应的请求,则可能无法解析。
KIP AppleTalk (DDP in UDP)
封装在UDP数据报中的AppleTalk DDP数据包被解封装并作为DDP数据包转储(即,所有UDP头信息都被丢弃)。/etc/atalk.names文件用于将AppleTalk网络和节点号转换为名称。此文件中的行格式为
number name 1.254 ether 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主机/网络号的条目,则地址以数字形式打印。在第一个示例中,网络144.1节点209上的NBP(DDP端口2)正在发送到正在网络icsd节点112的端口220上侦听的内容。第二行是相同的,除了源节点的全名是已知的(“ office ”)。第三行是从网络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
第一行是由网络icd主机112发送并在网络jssmag上广播的激光刻录机的名称查找请求。查找的nbp id为190。第二行显示来自主机jssmag.209的对该请求的答复(注意,它具有相同的id),表示它在端口250上注册了名为“ RM1140 ” 的Laserwriter资源。第三行是对同一请求的另一个答复,称主机techpit 在端口186上注册了laserwriter“ techpit ” 。
以下示例演示了ATP数据包格式:
jssmag.209.165 > helios.132: atp-req 122660xae030001 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-resp 12266:4 (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 122660xae030001 jssmag.209.133 > helios.132: atp-req* 122670xae030002
Jssmag.209发起事务ID 12266与主机的Helios通过请求多达8个数据包(即'')。行尾的十六进制数字是请求中“ userdata”字段的值。Helios响应8 512字节数据包。事务ID后面的' : [digit]'给出了事务中的数据包序列号,parens中的数字是数据包中的数据量,不包括atp标头。数据包7上的“ * ” 表示EOM位置1。
然后jssmag.209请求重新发送数据包3和5。Helios重新发送它们,然后jssmag.209释放事务。最后,jssmag.209启动下一个请求。请求中的“ * ”表示未设置XO(“恰好一次”)。
IP碎片
分段的Internet数据报打印为:
(frag id:size@offset+) (frag id:size@offset)
第一种形式表示有更多片段。第二个指示这是最后一个片段。
ID是片段ID。大小是不包括IP标头的片段大小(以字节为单位)。偏移量是此片段在原始数据报中的偏移量(以字节为单位)。
为每个片段输出片段信息。第一个片段包含更高级别的协议标头,并且在协议信息之后打印碎片信息。第一个之后的片段不包含更高级别的协议标头,并且在源地址和目标地址之后打印碎片信息。例如,这是通过CSNET连接从arizona.edu到lbl-rtsg.arpa的ftp的一部分,该连接似乎无法处理576字节数据报:
arizona.ftp-data > rtsg.1170: . 1024:1332(308) ack 1 win 4096 (frag 595a:328@0+) arizona > rtsg: (frag 595a:204@328) rtsg.1170 > arizona.ftp-data: . ack 1536 win 2560
这里有两点需要注意:首先,第二行中的地址不包含端口号。因为TCP协议信息全部在第一个片段中,所以我们不知道在打印后面的片段时端口或序列号是什么。其次,当实际上有512个字节(第一个碎片中的308个字节和第二个碎片中的204个字节)时,第一行中的tcp序列信息被打印为好像有308个字节的用户数据。如果您在序列空间中寻找孔洞或试图将小包与小包进行匹配,这可能会让您感到愚蠢。
带有IP不分段标志的数据包带有尾随(DF)标记。
时间戳记
默认情况下,所有输出行前面都有一个timestamp。时间戳是当前时钟时间,格式为hh:mm:ss.frac,其准确性与内核的时钟相同。时间戳反映了内核第一次看到数据包的时间。从以太网接口从数据包中删除数据包到内核为“新数据包”中断提供服务之间的时间间隔,我们没有做任何尝试。
查看英文版
tcpdump host sundown
打印到达或离开主机日落的所有数据包。
tcpdump host helios and \( hot or ace \)
打印主机Helios与hot或ace之间的流量。
tcpdump ip host ace and not helios
打印ace和除helios外的任何主机之间的所有IP数据包。
tcpdump 'gateway snup and (port ftp or ftp-data)'
通过Internet 网关snup打印所有ftp通信。注意,用引号引起来是为了防止外壳解释括号。
tcpdump ip and not net localnet
打印既不是源于主机也不是本地主机的流量。如果您网关到另一个网络,则这些东西绝对不能进入您的本地网络。
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
打印每个涉及非本地主机的TCP对话的开始和结束数据包(SYN和FIN数据包)。
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
打印所有与端口80之间的IPv4 HTTP数据包。tcpdump将仅打印包含数据的数据包。不,例如,SYN和FIN数据包以及仅ACK数据包。
tcpdump 'gateway snup and ip[2:2] > 576'
打印通过网关snup发送的超过576字节的IP数据包。
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
打印未通过以太网广播或多播发送的IP广播或多播数据包。
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'
打印不是回显请求/答复的所有ICMP数据包(即,不ping数据包)。
查看英文版
tabs | tac | talk | tail | tcopy | tty | tar | tbl | tcsh | time | tee | timex | telinit | telnet | test | top | touch | tput | tr | troff | traceroute |
未知的网友