tcpdump命令用于抓取网络数据包。Tcpdump将显示与布尔表达式匹配的网络接口数据包内容;描述前面有一个时间戳,默认情况下,显示为小时、分钟、秒和午夜后的几分之一秒。它也可使用-w选项运行,这将使程序把数据包数据保存到文件中以供以后分析;和/或使用-r标志运行,-r标志会导致它从保存的数据包文件中读取数据包,而不是从网络接口读取数据包。它也可以使用-V标志运行,这会导致它读取已保存的数据包文件列表。在所有情况下,只有与表达式匹配的数据包才会被tcpdump处理。
tcpdump命令的用法如下:
tcpdump [ -AbdDefhHIJKlLnNOpqStuUvxX# ] [ -B buffer_size ]
[ -c count ] [ -C file_size ] [ -G rotate_seconds ] [ -F file ]
[ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]
[ --number ] [ -Q|-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 ]
[ --time-stamp-precision=tstamp_precision ]
[ --immediate-mode ] [ --version ] [ expression ]
1、命令描述
如果不使用-c标志运行,Tcpdump将持续捕获数据包,直到它被SIGINT信号(例如,通过键入中断字符,通常是control-C生成)或SIGTERM信号(通常使用kill命令生成)中断。如果使用-c标志运行,它将捕获数据包,直到被SIGINT或SIGTERM信号中断,或者处理了指定数量的数据包。
当tcpdump完成捕获数据包时,它将报告以下计数:
“捕获”的数据包:这是tcpdump已接收和处理的数据包数量;
“由过滤器接收”的数据包:其含义取决于运行tcpdump的操作系统,也可能取决于操作系统的配置方式——如果在命令行上指定了过滤器,在某些操作系统上,它会对数据包进行计数,而不管它们是否与过滤器表达式匹配,即使它们与过滤器表达式相匹配,也不管tcpdump是否已读取和处理它们,在其他操作系统上它只对与过滤器表达式匹配对的数据包进行计算,而不管tcpdmp是否已读取并处理过它们,在另一些操作系统上只对与过滤表达式匹配并由tcpdump处理过的数据包计数;
“被内核丢弃”的数据包:如果操作系统向应用程序报告该信息,这是由于缺少缓冲区空间,由运行tcpdump的操作系统中的数据包捕获机制丢弃的数据包数量;否则,将报告为0。
在支持SIGINFO信号的平台上,如大多数BSD(包括Mac OS X)和Digital/Tru64 UNIX,它将在收到SIGINFO信号时报告这些计数(例如,通过键入您的“状态”字符生成,通常为control-T,尽管在某些平台上,例如Mac OS X,默认情况下没有设置“状态”符号,因此您必须使用stty设置它才能使用),并将继续捕获数据包。在不支持SIGINFO信号的平台上,使用SIGUSR1信号也可以实现同样的效果。
从网络接口读取数据包可能需要您具有特殊权限;有关详细信息,请参阅pcap(3PCAP)手册页。读取已保存的数据包文件不需要特殊权限。
2、命令选项
-A:以ASCII格式显示每个数据包(减去其链路层报文头)。便于捕获网页。
-b:以ASDOT表示法而不是ASPLAIN表示法显示BGP数据包中的AS号。
-B buffer_size,--buffer-size=buffer_size:将操作系统捕获缓冲区大小设置为buffer_size,单位为KiB(1024字节)。
-c count:收到count个数据包后退出。
-C file_size:在将原始数据包写入保存文件之前,请检查该文件当前是否大于file_size,如果是,请关闭当前的保存文件并打开一个新的保存文件。第一个保存文件之后的保存文件将具有用-w标志指定的名称,后面有一个数字,从1开始并向上增加。file_size的单位是百万字节(1000000字节,而不是1048576字节)。
-d:将编译后的匹配数据包代码以人类可读的形式转储到标准输出并停止。
-dd:将匹配数据包代码转储为C程序片段。
-ddd:将匹配数据包代码转储为十进制数(前面有一个计数)。
-D,--list-interfaces:输出系统上可用的网络接口列表以及tcpdump可以在哪个接口捕获数据包。对于每个网络接口,都会输出一个数字和一个接口名称,后面可能是接口的文本描述。可以提供-i标志指定接口名称或编号,以指定要抓包的接口。
这在没有列出它们的命令的系统上很有用(例如,Windows系统或缺少ifconfig -a的UNIX系统);该数字在Windows 2000和更高版本的系统上很有用,在这些系统中,接口名称是一个有点复杂的字符串。
如果tcpdump是使用缺少pcap_findalldevs()函数的旧版本libpcap构建的,则不支持-D标志。
-e:在每行转储上输出链路层报文头。例如,这可用于输出以太网和IEEE 802.11等协议的MAC层地址。
-E:使用spi@ipaddr algo:secret来解密目的地址为addr且包含安全参数索引值spi的IPsec ESP数据包。这种组合可以用逗号或换行符分隔。
请注意:目前支持为IPv4 ESP数据包设置密钥。
算法可以是des-cbc、3des-cbc、blowfish-cbc、rc3-cbc、cast128-cbc,也可以是无。默认值为des-cbc。只有在编译tcpdump时启用了加密功能,才能解密数据包。
secret是ESP密钥的ASCII文本。如果前面有0x,则将读取十六进制值。
该选项假定为RFC2406 ESP,而不是RFC1827 ESP。该选项仅用于调试目的,不建议将此选项与真正的“secret”密钥一起使用。通过在命令行上显示IPsec密钥,您可以通过ps和其他场合使其对其他人可见。
除了上述语法外,语法文件名还可用于让tcpdump读取提供的文件。该文件在收到第一个ESP数据包时打开,因此tcpdump可能被授予的任何特殊权限都应该已经被放弃。
-f:以数字而非符号形式输出“foreign” 外部IPv4地址(此选项旨在避免Sun NIS服务器中的严重脑损伤——通常在转换非本地互联网号码时,它会永远挂起)。
外部IPv4地址的测试是使用正在进行捕获的接口的IPv4地址和网络掩码完成的。如果该地址或网络掩码不可用,无论是因为正在进行抓包的接口没有地址或网络掩码,还是因为抓包是在Linux的“任何”接口上进行的,而Linux的“任意”接口可以在多个接口上进行抓包,则此选项将无法正常工作。
-F file:使用文件作为筛选器表达式的输入。命令行上给出的附加表达式将被忽略。
-G rotate_seconds:如果指定,则每rotate_seconds秒旋转一次用-w选项指定的转储文件。保存文件的名称将由-w指定,其中应包含strftime定义的时间格式。如果没有指定时间格式,则每个新文件都将覆盖以前的文件。
如果与-C选项结合使用,文件名将采用“file
-h,--help:输出tcpdump和libpcap版本字符串,输出使用消息,然后退出。
--version:输出tcpdump和libpcap版本字符串并退出。
-H :尝试检测802.11s草稿网格报文头。
-i interface,--interface=interface:在指定接口interface上监听。如果未指定interface,tcpdump会在系统接口列表中搜索编号最低、配置启用的接口(不包括环回),例如“eth0”。
在具有2.2或更高版本内核的Linux系统上,可以使用“any”接口参数来捕获来自所有接口的数据包。请注意,“任何”设备上的抓包都不会以混杂模式进行。
如果支持-D标志,则该标志输出的接口号可以用作接口参数,前提是系统上没有接口将该编号作为名称。
-I,--monitor-mode:将接口置于“监控模式”;这仅在IEEE 802.11 Wi-Fi接口上受支持,并且仅在某些操作系统上受支持。
请注意:在监视模式下,适配器可能会与关联的网络断开连接,因此您将无法使用该适配器的任何无线网络。如果您在监视模式下进行抓包,并且没有使用另一个适配器连接到另一个网络,则这可能会阻止访问网络服务器上的文件,或解析主机名或网络地址。
此标志将影响-L标志的输出。如果未指定-I,则仅显示不处于监视模式时可用的链路层类型;如果指定了-I,则只会显示处于监视模式时可用的链路层类型。
--immediate-mode:以“立即模式”捕获数据包。在这种模式下,数据包一到达就会被传递到tcpdump,而不是为了提高效率而进行缓冲。如果数据包被输出到终端而不是文件或管道,则显示数据包而不是将数据包保存到“savefile”,这是默认设置。
-j tstamp_type,--time-stamp-type=tstamp_type:将抓包的时间戳类型设置为tstamp_type。pcap-tstamp中给出了时间戳类型的名称;并非所有列出的类型对于任何给定的接口都一定有效。
-J,--list-time-stamp-types:列出接口和支持的时间戳类型并退出。如果无法为接口设置时间戳类型,则不会列出时间戳类型。
--time-stamp-precision=tstamp_precision:抓包时,将抓包的时间戳精度设置为tstamp_precision。请注意,高精度时间戳(纳秒)的可用性及其实际精度取决于平台和硬件。还要注意,当将纳秒精度的抓包写入保存文件时,时间戳以纳秒精度写入,文件以不同的幻数写入,以指示时间戳以秒和纳秒为单位;并非所有读取pcap保存文件的程序都能读取这些抓包文件。
读取保存文件时,将时间戳转换为timestamp_precision指定的精度,并以该精度显示。如果指定的精度小于文件中时间戳的精度,则转换将失去精度。
支持的时间戳精度值是微秒精度的微米级和纳秒精度的纳米级。默认精度为微秒。
-K,--dont-verify-checksums:不要尝试验证IP、TCP或UDP校验和。这对于在硬件中执行部分或全部校验和计算的接口非常有用;否则,所有传出报文的TCP校验和都将被标记为错误。
-l:对标准输出进行行缓冲。如果你想在捕获数据的同时查看数据,这很有用。例如:
tcpdump -l | tee dat
或者
tcpdump -l > dat & tail -f dat
请注意:在Windows上,“line buffered”表示“unbuffered”,因此如果指定了-l,WinDump将单独写入每个字符。
-U的行为类似于-l,但它会导致输出为“packet-buffered”,因此输出会在每个包的末尾而不是每行的末尾写入stdout;这在包括Windows在内的所有平台上都是缓冲的。
-L,--list-data-link-types:列出指定模式下接口的已知数据链路类型,然后退出。已知数据链路类型的列表可能取决于指定的模式;例如,在某些平台上,当不处于监视模式时,Wi-Fi接口可能支持一组数据链路类型(例如,它可能只支持假以太网报文头,或者可能支持802.11报文头,但不支持带有无线电信息的802.11报文头),而当处于监视模式下时,它可能支持另一组数据链路类型(例如:它可能只在监视模式下支持802.11报文头或带有无线电信息地802.11报文头)。
-m module:从文件模块加载SMI MIB模块定义。可以多次使用此选项将多个MIB模块加载到tcpdump中。
-M secret:如果存在TCP-MD5选项(),则使用secret作为共享密钥来验证TCP分段中的摘要。
-n:不要将主机地址转换为主机名。这可用于避免DNS查找。
-nn:也不要将协议和端口号等转换为名称。
-N:不要输出主机名的域名资格。例如,如果您提供此标志,则tcpdump将输出“nic”而不是“nic.ddn.mil”。
-#,--number:在行首输出一个可选的数据包编号。
-O,--no-optimize:不要运行数据包匹配代码优化器。只有当您怀疑优化器中有错误时,这才有用。
-p,--no-promiscuous-mode:不要将接口置于混杂模式。请注意,由于其他原因,接口可能处于混杂模式;因此,“-p”不能用作“以太主机{local-hw-addr}或以太广播”的缩写。
-Q|-P direction,--direction=direction:选择应捕获数据包的发送/接收方向。可能的值是“in”、“out”和“inout”。并非在所有平台上都可用。
-q:快速(安静)输出。显示较少的协议信息,因此输出行更短。
-r file:从文件中读取数据包(该文件是使用-w选项或其他编写pcap或pcap-ng文件的工具创建的)。如果文件为“-”,则使用标准输入。
-S,--absolute-tcp-sequence-numbers:输出绝对TCP序列号,而不是相对TCP序列号。
-s snaplen,--snapshot-length=snaplen:从每个数据包中捕获snaplen字节的数据,而不是默认的262144字节。由于抓包有限而截断的数据包在输出中用“[|proto]”表示,其中proto是发生截断的协议级别的名称。请注意,捕获较大的抓包既增加了处理数据包所需的时间,又有效地减少了数据包缓冲的量。这可能会导致数据包丢失。您应该将snaplen限制为捕获您感兴趣的协议信息的最小数量。将snaplen设置为0会将其设置为默认值262144,以便与最近的旧版本tcpdump向后兼容。
-T type:强制将“表达式”选择的数据包解释为指定类型。目前已知的类型有aodv(Ad-hoc On-demand Distance Vector,自组织按需距离矢量协议)、carp(Common Address Redundancy Protocol,公共地址冗余协议)、cnfp(Cisco NetFlow protocol,思科NetFlow协议)、lmp(Link Management Protocol,链路管理协议)、pgm(Pragmatic General Multicast,实用通用组播)、pgm_zmtp1(PGM/EPGM内的ZMTP/1.0)、resp(REdis Serialization Protocol,REdis序列化协议)、radius(RADIUS)、rpc(Remote Procedure Call,远程过程调用)、rtp(Real-Time Applications protocol,实时应用协议)、rtcp(Real-Time Applications control protocol,实时应用控制协议)、snmp(Simple Network Management Protocol,简单网络管理协议),tftp(Trivial File Transfer Protocol,琐碎文件传输协议)、vat(Visual Audio Tool,可视音频工具)、wb(distributed White Board,分布式白板)、zmtp1(ZeroMQ Message Transport Protocol 1.0,消息传输协议1.0)和vxlan(Virtual eXtensible Local Area Network,虚拟可扩展局域网)。
请注意:上述pgm类型仅影响UDP解释,不管怎样,本地pgm始终被识别为IP协议113。UDP封装的PGM通常被称为“EPGM”或“PGM/UDP”。
请注意:上述pgm_zmtp1类型会同时影响本机pgm和UDP的解释。在原生PGM解码期间,ODATA/RDATA数据包的应用程序数据将被解码为具有ZMTP/1.0帧的ZeroMQ数据包。在UDP解码期间,除此之外的任何UDP数据包都将被视为封装的PGM数据包。
-t:不要在每行转储上输出时间戳。
-tt:在每行转储上输出时间戳,以自1970年1月1日00:00:00 UTC以来的秒数和自该时间以来的几分之一秒数表示。
-ttt:在每行转储上输出当前行和上一行之间的增量(微秒精度)。
-tttt:在每行转储上输出一个时间戳,以小时、分钟、秒和午夜后的几分之一秒为单位,前面加上日期。
-ttttt:输出每行转储上当前行和第一行之间的增量(微秒精度)。
-u:输出未编码的NFS句柄。
-U,--packet-buffered:如果未指定-w选项,则将显示的数据包输出设置为“数据包缓冲”;即,当输出每个数据包内容的描述时,它将被写入标准输出,而不是在不写入终端时,仅在输出缓冲区填满时才被写入。
如果指定了-w选项,则将保存的原始数据包输出为“数据包缓冲”;即,当每个数据包被保存时,它将被写入输出文件,而不是仅在输出缓冲区填满时才被写入。
如果tcpdump是使用缺少pcap_dump_flush()函数的旧版本libpcap构建的,则不支持-U标志。
-v:解析和显示时,产生(稍微多一点)详细的输出。例如,显示IP数据包中的生存时间、标识、总长度和选项。还可以进行额外的数据包完整性检查,例如验证IP和ICMP报文头校验和。
使用-w选项写入文件时,每10秒报告一次抓包文件的数据包数量。
-vv:更详细的输出。例如,从NFS应答数据包中显示其他字段,并对SMB数据包进行完全解码。
-vvv:更详细的输出。例如,telnet SB ... SE选项已完整显示。使用-X Telnet选项也以十六进制显示。
-V file:从文件file中读取文件名列表。如果文件为“-”,则使用标准输入。
-w file:将原始数据包写入文件file,而不是解析并显示出来。稍后可以使用-r选项显示它们。如果文件为“-”,则使用标准输出。
如果写入文件或管道,此输出将被缓冲,因此从文件或管道读取的程序在接收到数据包后的任意时间内可能看不到数据包。使用-U标志使数据包在收到后立即写入。
MIME类型application/vnd.tcpdump.pcap已向IANA注册用于pcap文件。文件扩展名.pcap似乎是最常与.cap和.dmp一起使用的。Tcpdump本身在读取抓包文件时不检查扩展名,在写入文件时也不添加扩展名(它在文件头中使用幻数)。但是,如果存在扩展名,许多操作系统和应用程序都会使用它,建议添加一个扩展名(例如.pcap)。
有关文件格式的说明,请参阅pcap-savefile()。
-W:与-C选项结合使用,这将把创建的文件数量限制在指定数量,并从一开始覆盖文件,从而创建一个“旋转”缓冲区。此外,它将使用足够的前导0来命名文件,以支持最大数量的文件,从而使它们能够正确排序。
与-G选项结合使用时,这将限制创建的旋转转储文件的数量,达到限制时以状态0退出。如果也与-C一起使用,该行为将导致每个时间片出现循环文件。
-x:解析和显示时,除了显示每个数据包的报文头外,还以十六进制显示每个数据包包含的数据(减去其链路层报文头)。将显示整个数据包或snaplen字节中较小的一个。请注意,这是整个链路层数据包,因此对于填充的链路层(例如以太网),当更高层数据包短于所需的填充时,也会显示填充字节。
-xx:解析和显示时,除了显示每个数据包的报文头外,还以十六进制显示每个数据包(包括其链路层报文头)的数据。
-X: 解析和显示时,除了显示每个数据包的报文头外,还要以十六进制和ASCII显示每个数据包包含的数据(减去其链路层报文头)。这对于分析新协议非常方便。
-XX:在解析和显示时,除了显示每个数据包的报文头外,还要以十六进制和ASCII显示每个数据包(包含其链路层报文头)的数据。
-y datalinktype,--linktype=datalinktype:将捕获数据包时使用的数据链路类型设置为datalinktype。
-z postrotate-command:与-C或-G选项结合使用,这将使tcpdump运行“postrotate-command file”,其中file是每次旋转后关闭的保存文件。例如,指定-z gzip或-z bzip2将使用gzip或bzip2压缩每个保存文件。
请注意:tcpdump将使用最低优先级与抓包并行运行命令,这样就不会干扰抓包进程。
如果你想使用一个本身带有标志或不同参数的命令,你总是可以编写一个shell脚本,将保存文件名作为唯一的参数,对标志和参数进行排列,并执行你想要的命令。
-Z user,--relinquish-privileges=user:如果tcpdump以root身份运行,则在打开抓包设备或输入保存文件后,但在打开任何保存文件进行输出之前,可以将用户ID更改为user,将组ID更改为user的主要组。
默认情况下,也可以在编译时启用此行为。
expression:选择要转储的数据包。如果没有给出表达式expression,则网络上的所有数据包都将被转储。否则,只有表达式为“true”的数据包才会被转储。
关于表达式语法,请参见pcap-filter。
表达式参数可以作为单个Shell参数或多个Shell参数传递给tcpdump,以更方便的方式为准。通常,如果表达式包含Shell元字符,例如用于转义协议名称的反斜杠,则更容易将其作为单个带引号的参数传递,而不是转义Shell元字符。在解析之前,多个参数会用空格连接起来。
3、操作示例
要显示所有到达或离开sundown主机的数据包:
tcpdump host sundown
要显示helios与hot或ace之间的流量:
tcpdump host helios and ( hot or ace )
要显示ace与除helios之外的任何主机之间的所有IP数据包:
tcpdump ip host ace and not helios
要显示本地主机和Berkeley主机之间的所有流量:
tcpdump net ucb-ether
要通过互联网网关snup显示所有ftp流量(请注意,引用该表达式是为了防止shell(错误)解释括号):
tcpdump 'gateway snup and (port ftp or ftp-data)'
显示既不来自本地主机、也不去往本地主机的流量(如果你的网关连接到另一个网络,这些流量永远不应该进入你的本地网络)。
tcpdump ip and not net localnet
显示涉及非本地主机的每个TCP连接的开始和结束数据包(SYN和FIN数据包)。
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
显示进出端口80的所有IPv4 HTTP数据包,即仅显示包含数据的数据包,而不显示SYN和FIN数据包以及仅ACK数据包。(IPv6留给读者练习)
tcpdump -l | tee dat
0
要显示通过网关缓冲发送的长度超过576字节的IP数据包:
tcpdump -l | tee dat
1
要显示未通过以太网广播或组播发送的IP广播或组播数据包,请执行以下操作:
tcpdump -l | tee dat
2
要显示所有非回显请求/回复的ICMP数据包(即非ping数据包):
tcpdump -l | tee dat
3
4、输出格式
tcpdump的输出格式因协议而异。下面给出了大多数格式的简要描述和示例。
4.1、Timestamps/时间戳
默认情况下,所有输出行前面都有时间戳。时间戳是表单中的当前时钟时间
tcpdump -l | tee dat
4
并且与内核时钟一样准确。时间戳反映了内核为数据包打上时间戳的时刻。不试图考虑网络接口完成从网络接收数据包与内核对数据包应用时间戳之间的时间延迟;该时间延迟可能包括网络接口完成从网络接收数据包的时间与向内核传递中断以使其读取数据包的时刻之间的延迟,以及内核为“新数据包”中断提供服务的时间与对数据包应用时间戳的时间之间的延迟。
4.2、Link Level Headers/链路层报文头
如果给出了“-e”选项,则会显示出链路层报文头。在以太网上,会显示源地址和目的地址、协议和数据包长度。
在FDDI网络上,“-e”选项使tcpdump显示“帧控制”字段、源地址和目的地址以及数据包长度。(“帧控制”字段控制数据包其余部分的解释。正常数据包(如包含IP数据包的数据包)是“异步”数据包,优先级值在0到7之间;例如“async4”。假设这样的报文包含802.2逻辑链路控制(Logical Link Control,LLC)报文;如果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(urgent pointer,紧急指针)、W(window,窗口)、A(ack)、S(sequence number,序列号)和I(packet ID,数据包ID)表示,后面是增量(+n或-n)或新值(=n)。最后,显示数据包中的数据量和压缩的报文头长度。
例如,以下行显示了一个具有隐式连接标识符的出站压缩TCP数据包;ack变化了6,序列号变化了49,包ID变化了6;有3个字节的数据和6个字节的压缩报文头:
tcpdump -l | tee dat
5
4.3、ARP/RARP数据包
ARP/RARP输出显示请求的类型及其参数。该格式旨在不言自明。以下是从主机rtsg到主机csam的“rlogin”开头截取的一个简短示例:
tcpdump -l | tee dat
6
第一行说,rtsg发送了一个arp数据包,要求提供互联网主机csam的以太网地址。Csam以其以太网地址进行回复(在本例中,以太网地址为大写,互联网地址为小写)。
如果我们使用tcpdump -n,这看起来就不那么多余了:
tcpdump -l | tee dat
7
如果我们使用了tcpdump -e,那么第一个数据包是广播的,第二个是点对点的,这一事实将是可见的:
tcpdump -l | tee dat
8
对于第一个数据包,它说以太网源地址是RTSG,目的地是以太网广播地址,类型字段包含十六进制0806(类型ETHER_ARP),总长度为64字节。
4.4、IPv4数据包
如果未显示链路层报文头,则对于IPv4数据包,将在时间戳后显示IP。
如果指定了-v标志,则来自IPv4报文头的信息将显示在IP或链路层报文头后的括号中。此信息的一般格式为:
tcpdump -l | tee dat
9
tos是服务字段的类型;如果ECN位为非零,则将其报告为ECT(1)、ECT(0)或CE。ttl是time-to-live生存时间;如果为零,则不报告。id是IP标识字段。offset是片段偏移字段;无论这是否是分段数据包的一部分,都会显示出来。标志是MF和DF标志;如果设置了MF,则报告+,如果设置了F,则报告DFP。如果两者都没有设置,则报告“.”。proto是协议ID字段。length是总长度字段。options是IP选项(如果有的话)。
接下来,对于TCP和UDP数据包,将显示源和目标IP地址以及TCP或UDP端口,每个IP地址与其对应端口之间有一个点,源和目标之间用>分隔。对于其他协议,将显示地址,用>分隔源和目标。之后将显示更高级别的协议信息(如果有的话)。
对于分段的IP数据包,第一个片段包含更高级别的协议报文头;第一个片段之后的片段不包含更高级别的协议报文头。如上所述,分段信息将仅在IP报文头信息中使用-v标志显示。
4.5、TCP数据包
注意:以下描述假设读者熟悉RFC-793中描述的TCP协议。如果您不熟悉该协议,则此描述对您没有多大用处。
TCP协议行的一般格式为:
tcpdump -l > dat & tail -f dat
0
Src和dst是源和目标IP地址和端口。Tcpflags是S(SYN)、F(FIN)、P(PUSH)、R(RST)、U(URG)、W(ECN CWR)、E(ECN Echo)或“.”的某种组合。如果没有设置标志,则为“无”。数据序列号(data-seqno)描述了此数据包中数据所覆盖的序列空间范围(见下面的示例)。Ackno是此连接上另一个方向预期的下一个数据的序列号。Window是此连接上另一个方向可用的接收缓冲区空间的字节数。Urg表示数据包中有“紧急”数据。Opts是TCP选项(例如mss 1024)。Len是有效载荷数据的长度。
IP类型(Iptype)、源地址(Src)、目的地址(dst)和标志(Flags)始终存在。其他字段取决于数据包TCP协议报文头的内容,只有在适当的情况下才会输出。
这是从主机rtsg到主机csam的rlogin的开头部分。
tcpdump -l > dat & tail -f dat
1
第一行表示rtsg上的TCP端口1023向csam上的端口登录发送了一个数据包。S表示SYN标志已设置。数据包序列号为768512,其中不包含任何数据。(符号是“first:last”,意思是“序列号从第一个到最后一个,但不包括最后一个。)没有捎带确认,可用的接收窗口为4096字节,并且有一个max-segment-size最大分段大小选项,请求1024字节的mss。
Csam回复了一个类似的包,除了它包括一个用于rtsg SYN的响应。然后,Rtsg返回csam的SYN。“.”表示ACK标志已设置。数据包中没有数据,因此没有数据序列号或长度。请注意,ack序列号是一个小整数(1)。tcpdump第一次看到TCP“对话”时,会显示数据包中的序列号。在对话的后续数据包上,显示当前数据包的序列号与此初始序列号之间的差异。这意味着第一个后面的序列号可以被解释为对话数据流中的相对字节位置(每个方向的第一个数据字节为“1”)。“-S”将覆盖此功能,导致输出原始序列号。
在第6行,rtsg发送19字节的csam数据(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]”。
4.6、使用特定的标志组合(SYN-ACK、URG-ACK等)捕获TCP数据包
TCP报文头的控制位部分有8个位:
tcpdump -l > dat & tail -f dat
2
假设我们想观察在建立TCP连接时使用的数据包。回想一下,TCP在初始化新连接时使用三次握手协议;关于TCP控制位的连接顺序是:
1) 呼叫者发送SYN
2) 接收者以SYN、ACK进行响应
3) 呼叫者发送ACK
现在我们感兴趣的是抓包只设置了SYN位的数据包(步骤1)。请注意,我们不需要来自步骤2(SYN-ACK)的数据包,只需要一个简单的初始SYN。我们需要的是tcpdump的正确过滤器表达式。
回想一下没有选项的TCP报文头的结构:
除非有选项,否则TCP报文头通常包含20个字节的数据。图的第一行包含第0-3个字节,第二行显示第4-7个字节等。
从0开始计数,相关的TCP控制位包含在第13个字节中:
让我们仔细看看第13个字节:
这些是我们感兴趣的TCP控制位。我们将这个字节中的位从右到左编号0到7,因此PSH位是第3位,而URG位是第5位。
回想一下,我们只想捕获文件设置了SYN的数据包。让我们看看如果TCP数据包在其报文头中设置了SYN位,第13个字节会发生什么:
查看控制位部分,我们看到只有第1号位(SYN)被设置。
假设第13个字节是网络字节顺序中的8位无符号整数,则该字节的二进制值为00000010,其十进制表示为2:
我们几乎完成了,因为现在我们知道,如果只设置SYN,那么TCP报文头中第13个字节的值,当按网络字节顺序解释为8位无符号整数时,必须恰好为2。
这种关系可以表示为
tcpdump -l > dat & tail -f dat
3
我们可以使用此表达式作为tcpdump的过滤器,以监视仅设置了SYN的数据包:
tcpdump -l > dat & tail -f dat
4
该表达式表示“让TCP数据包的第13个字节具有十进制值2”,这正是我们想要的。
现在,让我们假设我们需要捕获SYN数据包,但我们不在乎是否同时设置了ACK或任何其他TCP控制位。让我们看看当具有SYN-ACK集的TCP数据包到达时,第13个字节会发生什么:
现在,第1位和第4位被设置在第13个字节中。第13个字节的二进制值为00010010,转换为十进制为18:
现在我们不能只在tcpdump过滤器表达式中使用'tcp[13]==18',因为这将只选择那些设置了SYN-ACK的数据包,而不是那些只设置了SYN的数据包。记住,只要设置了SYN,我们就不在乎是否设置了ACK或任何其他控制位。
为了实现我们的目标,我们需要将第13个字节的二进制值与其他值进行逻辑AND,以保留SYN位。我们知道在任何情况下都希望设置SYN,因此我们将把第13个字节中的值与SYN的二进制值进行逻辑AND:
我们看到,无论设置了ACK还是其他TCP控制位,此AND操作都会传递相同的结果。AND值的十进制表示以及此操作的结果为2(二进制00000010),因此我们知道,对于具有设置了SYN位的数据包,以下关系必须成立:
tcpdump -l > dat & tail -f dat
5
这为我们指出了tcpdump过滤器表达式
tcpdump -l > dat & tail -f dat
6
一些偏移量和字段值可以表示为名称,而不是数值。例如,tcp[13]可以替换为tcp[tcpflags]。以下TCP标志字段值也可用:tcp-fin、tcp-syn、tcp-rst、tcp-push、tcp-act、tcp-urg。
这可以证明为:
tcpdump -l > dat & tail -f dat
7
请注意:您应该在表达式中使用单引号或反斜杠来隐藏shell中的AND(“&”)特殊字符。
4.7、UDP数据包
UDP格式由以下rwho数据包说明:
tcpdump -l > dat & tail -f dat
8
这表示主机actinide上的端口向主机广播上的端口发送了udp数据包,即互联网广播地址。该数据包包含84个字节的用户数据。
一些UDP服务被识别(从源或目标端口号),并显示出更高级别的协议信息。特别是,对NFS的域名服务请求(RFC-1034/1035)和Sun RPC调用(RFC-1050)。
4.8、UDP名称服务器请求
注意:以下描述假设读者熟悉RFC-1035中描述的域服务协议。如果您不熟悉该协议,以下描述似乎是用希腊语写的。
名称服务器请求的格式为:
tcpdump -l > dat & tail -f dat
9
主机h2opolo向helios上的域服务器请求与名称ucbvax.berkeley.edu关联的地址记录(qtype=A)。查询id为“3”,“+”表示已设置递归所需标志。查询长度为37字节,不包括UDP和IP协议头。查询操作是正常的query操作,因此省略了op字段。如果op是别的什么,它就会显示在“3”和“+”之间。同样,qclass是一个正常的C_IN,也被省略了。任何其他qclass都会在“A”之后立即显示。
检查了一些异常情况,可能会导致方括号中的额外字段:如果查询包含解析、权威记录或其他记录部分,ancount、nscount或arcount将显示为“[na]”、“[nn]”或“[nau]”,其中n是适当的计数。如果设置了任何响应位(AA、RA或rcode),或者在第2个和第3个字节中设置了任何“必须为零”位,则会显示“[b2&3=x]”,其中x是第2个和第3个头字节的十六进制值。
4.9、UDP名称服务器响应
名称服务器响应的格式为:
tcpdump host sundown
0
在第一个例子中,helios用3条解析记录、3条名称服务器记录和7条附加记录来响应来自h2opolo的查询id 3。第一个解析记录是类型A(地址),其数据是互联网地址128.32.137.3。响应的总大小为273字节,不包括UDP和IP报文头。省略了op(Query)和响应代码(NoError),以及A记录的类(C_IN)。
在第二个例子中,helios对查询2的响应代码为不存在域(non-existent domain,NXDomain),没有解析,只有一个名称服务器,没有权限记录。“*”表示已设置权威解析位。由于没有解析,因此没有显示类型、类别或数据。
其他可能出现的标志字符是“-”(递归可用,RA,未设置)和“|”(截断消息,TC,设置)。如果“请求”部分不包含任何一个条目,则显示“[nq]”。
4.10、SMB/CIFS解码
tcpdump现在为UDP/137、UDP/138和TCP/139上的数据提供了相当广泛的SMB/CIFS/NBT解码。还对IPX和NetBEUI SMB数据进行了一些原始解码。
默认情况下,只会进行相当小的解码,如果使用-v,则会进行更详细的解码。请注意:如果使用-v,单个SMB数据包可能会占用一个或多个页面,因此只有当您真的想要所有详细的细节时,才使用-v。
有关SMB数据包格式和所有字段含义的信息,请访问www.cifs.org或您最喜欢的samba.org镜像网站上的pub/samba/specs/目录。SMB补丁由Andrew Tridgell编写([email protected]).
4.11、NFS请求和响应
Sun NFS(Network File System,网络文件系统)请求和回复显示为:
tcpdump host sundown
1
在第一行中,主机sushi向wrl发送了一个id为26377的事务。请求为112字节,不包括UDP和IP报文头。该操作是文件句柄(file handle,fh)21,24/10.731657119上的读取链接(读取符号链接)。(如果幸运的话,就像在这种情况下一样,文件句柄可以被解释为一个主要的、次要的设备号对,后面是索引节点号和生成号。)在第二行中,wrl用相同的事务id和链接内容回复“ok”。
在第三行中,sushi请求(使用新的事务id)wrl在目录文件9,74/4096.6878中查找名称“xcolors”。在第四行中,wrl发送一个带有相应事务id的回复。
请注意:显示的数据取决于操作类型。如果结合NFS协议规范阅读,该格式是不言而喻的。另请注意,旧版本的tcpdump以略有不同的格式显示NFS数据包:将显示事务id(xid),而不是数据包的非NFS端口号。
如果给出了-v(verbose)标志,则会显示其他信息。例如:
tcpdump host sundown
2
(-v还会显示IP报文头TTL、ID、长度和分段字段,本例中省略了这些字段。)在第一行中,sushi要求wrl从文件21,11/12.195中读取8192个字节,字节偏移量为24576。Wrl回答“ok”;第二行显示的数据包是回复的第一个片段,因此只有1472个字节长(其他字节将在后续片段中跟随,但这些片段没有NFS甚至UDP报文头,因此可能不会显示,具体取决于使用的过滤器表达式)。由于给定了-v标志,因此显示了一些文件属性(除了文件数据外还返回):文件类型(“REG”,用于常规文件)、文件模式(八进制)、uid和gid以及文件大小。
如果多次给出-v标志,则会显示更多详细信息。
请注意:NFS请求量非常大,除非增加snaplen,否则大部分细节都不会显示出来。尝试使用“-s 192”来监视NFS流量。
NFS应答数据包没有明确标识RPC操作。相反,tcpdump会跟踪“最近”的请求,并使用事务ID将其与回复进行匹配。如果回复与相应的请求不紧密相关,则可能无法解析。
4.12、AFS请求和回复
Transarc AFS(Andrew File System,Andrew文件系统)请求和回复显示为:
tcpdump host sundown
3
在第一行中,主机elvis向pike发送RX数据包。这是一个发送到fs(fileserver,文件服务器)服务的RX数据包,是RPC调用的开始。RPC调用是一个重命名,旧目录文件id为536876964/1/1,旧文件名为“.newsrc.new”,新目录文件id是536876964/1/1,新文件名是“.newsrc”。主机pike以RPC响应重命名调用(成功,因为它是一个数据包,而不是一个中止包)。
一般来说,所有AFS RPC都至少通过RPC调用名进行解码。大多数AFS RPC至少有一些参数被解码(通常只有“interesting”的参数,对于一些感兴趣的定义)。
该格式旨在自我描述,但对于不熟悉AFS和RX工作原理的人来说可能没有用。
如果给定两次-v(详细)标志,则会显示确认数据包和其他报文头信息,如RX调用ID、调用号、序列号、序号和RX数据包标志。
如果-v标志被给出两次,则会显示其他信息,如RX调用ID、序列号和RX数据包标志。MTU协商信息也从RX ack数据包中显示出来。
如果-v标志被给出三次,则会显示安全索引和服务id。
为中止数据包显示错误代码,但Ubik信标数据包除外(因为中止数据包用于表示对Ubik协议的赞成票)。
请注意:AFS请求量非常大,除非增加snaplen,否则许多参数将不会显示。尝试使用“-s 256”来查看AFS流量。
AFS应答数据包没有明确标识RPC操作。相反,tcpdump会跟踪“最近”的请求,并使用调用号码和服务ID将其与回复进行匹配。如果回复与相应的请求不紧密相关,则可能无法解析。
4.13、KIP AppleTalk (DDP in UDP)
封装在UDP数据包中的AppleTalk DDP数据包被解封装并作为DDP数据包转储(即,所有UDP报文头信息都被丢弃)。/etc/atalk.names文件用于将AppleTalk网络和节点编号转换为名称。此文件中的行具有以下形式:
tcpdump host sundown
4
前两行给出了AppleTalk网络的名称。第三行给出了特定主机的名称(主机与网络的区别在于数字中的第三个字节-网络号必须有两个字节,主机号必须有三个字节。)数字和名称之间应该用空格(空格或制表符)隔开。/etc/atalk.names文件可能包含空行或注释行(以“)。
AppleTalk地址以net.host.port表单形式显示:
tcpdump host sundown
5
(如果/etc/atalk.names不存在或不包含某个AppleTalk主机/网络号的条目,则以数字形式显示地址。)在第一个示例中,网络144.1节点209上的NBP(DDP端口2)正在向网络icsd节点112的端口220上监听的任何设备发送。第二行是相同的,除了源节点的全名是已知的(“office”)。第三行是从jssmag网络节点149上的端口235发送到icsd网络NBP端口上的广播(请注意,广播地址(255)由没有主机号的网络名称表示——因此,在/etc/atalk.names中保持节点名称和网络名称不同是一个好主意)。
NBP(name binding protocol,名称绑定协议)和ATP(AppleTalk transaction protocol,AppleTalk事务协议)数据包的内容被解释。其他协议只转储协议名称(如果没有为协议注册名称,则转储编号)和数据包大小。
NBP数据包的格式如下:
tcpdump host sundown
6
第一行是由网络icsd的主机112发送并在网络jssmag上广播的激光打印机的名称查找请求。查找的nbp id为190。第二行显示了主机jssmag.209对此请求的回复(请注意,它具有相同的id),表示它在端口250上注册了名为“RM1140”的激光打印机资源。第三行是对同一请求的另一个回复,称主机techpit在端口186上注册了激光打印机“techpit”。
ATP数据包格式由以下示例演示:
tcpdump host sundown
7
Jssmag.209通过请求最多8个数据包(“<0-7>”)与主机helios启动事务id 12266。行末尾的十六进制数是请求中“userdata”字段的值。
Helios以8个512字节的数据包进行响应。事务id后面的“:digit”给出了事务中的数据包序列号,括号中的数字是数据包中的数据量,不包括atp报文头。数据包7上的“*”表示EOM位已设置。
Jssmag.209然后请求重新传输数据包3和5。Helios重新发送它们,然后jssmag.209释放事务。最后,jssmag.209发起下一个请求。请求上的“*”表示XO(“exactly once,恰好一次”)未设置。
5、相关命令
stty、pcap(3PCAP)、bpf、nit、pcap-savefile、pcap-filter、pcap-tstamp。
**推荐阅读***
推荐站内搜索:最好用的开发软件、免费开源系统、渗透测试工具云盘下载、最新渗透测试资料、最新黑客工具下载……
还没有评论,来说两句吧...