tcpdumpdump网络包。

概要

1
2
3
4
5
6
7
8
9
10
11
12
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参数, 将包数据保存到文件中,以便后期分析,后期可以使用-r参数读文件中取包数据。 它还可以使用-V参数,让它从多个文件中读取。所有情况下,tcpdump只处理匹配expression的包。

如果不使用-c参数,它会一直捕捉包,一直到收到SIGINT或者SIGTERM信号。 如果使用-c参数,它会捕捉包到收到SIGINT或者SIGTERM信号,或者收到指定数量的包。

tcpdump完成捕捉包,它会报告以下的计数: captured包数(tcpdump收到和处理的包)。
received by filter包数。
dropped by kernel包数(丢弃的包,由于buffer空间不够引起)。

对于支持SIGINFO信号的平台,比如大多数的BSD(包括mac osx)和Digital/Tru64 UNIX, 它收到SIGINFO信号时会报告这些计数,然后继续捕捉包。

从网络设备上读取包需要root权限,从文件上读取不需要。

参数

  • -A 使用ASCII打印每一个包(不打印link level header)。方便捕捉web网页。

  • -b 使用ASDOT符号打印BGP包的AS数字,而不使用ASPLAIN符号。

  • -B 设置操作系统的捕捉buffer大小为buffer_size,KB单位。

  • -c 收到count个包后退出。

  • -C 写入一个raw包到文件之前,先检查当前文件大小是否已经超过file_size,如果已经超过,
    则关闭当前的文件,打开一个新的。每个文件包后加一个数字以区分。file_size的单位是1000000bytes。

  • -d 使用人类可读的方式打印compiled packet-matching code到标准输出,然后退出。

  • -dd 使用c语言片段的方式打印packet-matching code。

  • -ddd 使用十进制数字的方式打印packet-matching code。

  • -D 打印可以用tcpdump捕捉的网络接口。对于每一个网络接口,包含一个数字和一个接口名字, 还可能包括一个文件描述。捕捉的时候可以使用-i来指定特定的接口。
    这对于那些没有命令来显示接口的操作非常有用(例如windows,缺少ifconfig -a的unix)。 数字对于windows 2000及以后的系统非常有用,因为它的网络接口名字非常复杂。
    -D参数不支持libpcap缺少pcap_findalldevs()函数的系统。

  • -e 每行打印link-level header。这个可以用来打印mac地址。

  • -E 对于addr的地址包含spi的Security Parameter Index,使用spi@ipaddr algo:secret来解密Ipsec ESP包。
    多个可以使用逗号或者换行分隔。
    algo可以是:des-cbc, 3des-cbc, blowfish-cbc, cast128-cbc, none。 默认是des-cbc。解密包需要tcpdump的编译启动cryptography。
    secret是ASCII形式的ESP密钥key。如果以0x开头,则使用十六进制。

  • -f 打印foreign IPv4地址,而不使用名字符号。

  • -F 从file中读取过滤表达式。命令行中的表达式会被忽略。

  • -G 如果指定,每rotate_seconds秒就滚动-w指定的写入文件。每个-w指定的文件应该有strftime定义的时间格式, 如果不指定,则新文件会覆盖掉旧文件。
    如果结合-c参数使用,则会使用file<count>的格式。

  • -h 输出帮助信息。

  • -H 尝试检测802.11s网络头。

  • -i 监听interface接口。如果没指定,tcpdump会搜索系统中编号最少的接口(不包括回环地址)。
    对于linux 2.2及以后的系统,可以使用any来指定捕捉所有的接口。对于promiscuous模式不适用。
    如果支持-D参数,可以使用接口数字来进行指定。

  • -I 将接口放到monitor mode。这只有部分操作的wifi接口有效。
    对于monitor mode,网络适配器可能会从网络中分离,所以不能使用这个适配器的无线网络。 这可以防止网络服务器访问文件,或者解释主机名和地址,在monitor mode下捕捉, 不会连接到另一个适配器的网络。
    这个参数会影响-L参数的输出。如果-I参数没指定,只有链路层不在monitor mode的才会被显示。 如果指定-I指定,只有链路层在monitor mode的才会被显示。

  • -j 设置捕捉的时间戳类型为tstamp_type。支持的类型在pcap-tstamp-type(7)的手册里。 并不是所有的类型对任意的接口都支持。

  • -J 列出接口支持的时间戳类型。如果接口不支持设置时间戳类型,则不会显示。

  • -K 不要尝试效验IP, TCP, UDP的效验和。这对于硬件上计算效验和非常有用。否则, 所有的流出tcp效验和都会被标记成错误的。

  • -l 使标准输出为行buffered。对于查看数据非常有用。比如:tcpdump -l | tee dat。 注意,在windows下,行buffered意味着没有buffer,所以WinDump会每个字符的打印,如果指定了-l-U的行为类似于-l,但是它是包buffered的。所以收完每个名后进行打印。

  • -L 列出接口中知道的data link types,然后退出。data link types基于不同的模式, 例如在一些平台下,wifi接口在非monitor mode下可能支持一组data link types, 在monitor mode下支持另外一组data link types。

  • -m 从module文件加加载SMI MIB模块的定义。这个参数可以多次使用来加载多个MIB模块。

  • -M 使用secret做为一个共享的密钥来效验tcp段的数字。

  • -n 不要转换地址到名字。

  • -N 不要显示域名。例如显示nic,而不是nic.ddn.mil

  • -O 不要支持packet-matching code优化器。

  • -p 不要把接口放到promiscuous mode。

  • -P 指定发送/接收方向来捕捉包。支持的值为in, out, inout。不是所有的平台都支持。

  • -q 安静模式输出,打印更少的协议信息。

  • -R 假定ESP/AH包基本旧的规范(RFC1825到RFC1829)。如果指定这个参数,tcpdump不打印预防重播域。 因为ESP/AH规范没有协议版本字段,tcpdump不能推导出ESP/AH的协议版本。

  • -r 从file中读取包(使用-w参数创建的)。如果file是-,则从标准输入中读取。

  • -S 使用绝对TCP sequence number替换相对TCP sequence number。

  • -s 指定每个捕捉包的包长,默认值是65535bytes。snap为0设置为默认值65535,向后兼容老版本的tcpdump

  • -T 强制expression使用指定的type进行解释。当前支持的类型: aodv (Ad-hoc On-demand Distance Vector protocol), cnfp (Cisco NetFlow protocol), lmp (Link Management Protocol), pgm(Pragmatic General Multicast), pgm_zmtp1 (ZMTP/1.0 inside PGM/EPGM), 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), vxlan (Virtual eXtensible Local Area NetworkA)。

  • -t 不要对每一行都打印时间戳。

  • -tt 对每一行打印非格式化的时间戳。

  • -ttt 打印当前行与上一行的时间差。

  • -tttt 打印格式化的时间。

  • -ttttt 打印当前行与第一行的时间差。

  • -u 打印没解码的NFS处理。

  • -U 如果没指定-w参数,使用包缓存。

  • -v 解析和打印的时候,提供更多的信息。例如:连接时间,标识,总长度,IP参数等。

  • -vv 输出更多信息。比如添加NFS回复包。

  • -vvv 输出更多信息。

  • -V 从file中读取一个文件名列表。如果file为-,则从标准输入中读取。

  • -w 把raw信息写入到file文件,而不是进行输出。后续可以使用-r来读取。如果file为-,则写到标准输出。
    输出会被缓存,所以从文件中读可能会读不到内容,使用-U参数来强制使用包缓存。
    写到文件的MIME类型为application/vnd.tcpdump.pcap。建议使用.pcap做文件后缀。

  • -W 结合-C一起使用。这个参数限制文件个数。超过会rotating进行覆盖写。另外, 它可以增加文件名增加足够的开头0。
    结合-G一起使用,会限制文件的个数,当达到上限时会退出,退出码为0。

  • -x 解析和打印的时候,额外打印每个包的头,以十六进制打印内存(不打印链路层的头)。 最小的snaplen bytes会被打印。

  • -xx 解析和打印的时候,以十六进制额外打印每个包的头和内容,包括链路层的头。

  • -X 解析和打印的时候,以十六进制和ASCII打印每个包的头和内容,不打印链路层头。

  • -XX 解析和打印的时候,以十六进制和ASCII打印每个包的头和内容,包括链路层头。

  • -y 捕捉包时设置使用的数据链路类型。

  • -z 结合-C-G一起使用,它使tcpdumpcommand file的格式运行,file是保存 rotation关闭后的文件。例如:使用-z gzip或者-z bizp2会使用gzip或者bzip2压缩 每一个保存的文件。
    tcpdump会并行运行命令来捕捉,使用最低的优先级别以不打断捕捉包。

  • -Z 如果以root运行tcpdump,切换到指定的用户。

  • expression 选择需要打印的包。如果没有expression,则所有的包都会被打印。否则, 只有expression为true的包才会被打印。
    对于expression的请求,查看pcap-filter(7)。 expression的参数可以是单个shell参数,也可以是多个shell参数。一般expression包括shell元字符, 例如反斜杠来转换协议名,可以通过单引号包住以免shell进行转换。多个参数会以空格连接起来。

例子

打印所有到达或者离开sundown主机的包:

1
tcpdump host sundown

打印holios与hot或者ace通信的包:

1
tcpdump host helios and \( hot or ace \)

打印除了helios的所有与ace通信的ip包:

1
tcpdump ip host ace and not helios

打印所有本与秘Berkeley主机的包:

1
tcpdump net ucb-ether

打印所有经过snup的ftp通信包,使用单括号包住以免括号被shell解释:

1
tcpdump 'gateway snup and (port ftp or ftp-data)'

打印所在不是本机发出,也不到达本机的包

1
tcpdump ip and not net localnet

打印非本机的开始和结束包(SYN和FIN包):

1
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

打印所有通过80端口的IPv4 HTTP包,也就是说只打印数据包,不打印SYN、FIN、ACK-only包。

1
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

打印所有发送经过snup大于576 bytes的包:

1
tcpdump 'gateway snup and ip[2:2] > 576'

打印IP广播或者多播包,并且不经过Ethernet广播或者多播:

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

打印所有的非echo请求响应ICMP包,也就是说非ping包:

1
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

输出格式

tcpdump的输出是基于协议的。以下给出了大多数的格式描述和例子。

如果指定-e参数,链路层的头会被打印。在以太网上,源和目标的地址、协议、包长度会被打印。

在FDDI网络上,-e参数会导致tcpdump打印frame control域,源和目标的地址和包长度。 frame control域管理后续包的解释。正常的包(例如包括IP数据报)是async包,优先级别在0到7之间, 例如async4。这些包假设包括802.2 Logical Link control(LLC)包,LLC头会被打印,如果它不是一个ISO包或者SNAP包。

在令牌环形网络上,-e参数打印access contrlframe control域,源和目标的地址和包长度。 就像在FDDI网络,包假设包含LLC包。基于-e参数是否指定,源路由信息会打印在源路由包上。

在802.11网络上,-e选项打印frame control域。所有在802.11头上的地址,包长。 就像FDDI网络,包假设包含LLC包。

在SLIP链路上,方向标识(I表示入包,O表示出包),包类型,压缩信息会被打印。 包类型会优先打印,类型括号ip, utcpctcp。没有进一步的连接信息能被打印了。 对于TCP包,连接标识符会接着类型打印。如果包是压缩的,它的编码头会被打印。 一个特殊的案例打印成*S+n*SA+n,n是sequence num变化的量(或者sequence num和ack)。 如果不是特殊的案例,0或者更多的变化会被打印。一个变化由U(urgent pointer), W(window), A(ack), S(secuence num), I(packet ID)标识,接着一个差值(+n或者-n), 或者一个新值(=n)。最后,所有的数据和压缩包头长度会被打印。

例如,下面一行出包压缩的TCP包,包含一个隐藏的标识符,ack的变化为6,sequence number是49, packet ID为6,包括3字节的内容和6字节的压缩头。

1
0 ctcp * A+6 S+49 I+6 3 (6)

ARP/RARP Packets

Arp/rarp输出请求类型和它的参数。这里有一个在rtsg上使用rlogin请求到csam的例子:

1
2
arp who-has csam tell rtsg
arp reply csam is-at CSAM

第一行是rtsg发送arp包到互联网地址上询问谁有csam的址。csam回复了它的互联网地址。

下面是使用-n打印ip的过程,tcpdump -n:

1
2
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

如果使用-e参数,tcpdump -e:

1
2
RTSG Boardcast 0806 64: arp who-has csam tell rtsg
CSAM RTSG 0806 64: arp reply csam is-at CSAM

TCP Packets

tcp协议行的基本格式如下:

1
src > dst: flags data-seqno ack window urgent options

src和dst是源和目标的ip地址和端口。flags是以下的组合S(SYN), F(FIN), P(PUSH), R(RST), U(URG), W(ECN CWR), E(ECHO-Echo), .(ACK),或者空表示没有flags。 data-seqno描述了这个包中包含数据哪部分数据。ack是另一个方向的下一个期望数据的seqno。 window是窗口大小,表示另一方的接收buffer空间大小。urg指示这个包的数据是urgent的。 options是tcp参数(例如:<mss 1024>)。

src, dst, flags会一直出现。其他的域基于包中的tcp协议头适当出现。

以下是一个从rtsg rlogin到csam的一部分数据:

1
2
3
4
5
6
7
8
9
rtsg.1023 > csam.login: S 768512:768512(0) win 4096 <mss 1024>
csam.login > rtsg.1023: S 947648:947648(0) ack 768513 win 4096 <mss 1024>
rtsg.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

第一行表示rtsg的1023端口发送一个包到csam和login端口。S表示设置了SYN。这个包的seqno是768512, 不包含数据(first:last(nbytes)符号表示seqno从first到last,不包含last,包含nbytes的数据)。 不包含ack标识,窗口大小为4096字节,max-segment-size参数为1024字节。

casm回复了一个类似的包给rtsg,同时包含了ack标识。然后rtsg ack了csam的syn包, .表示设置了ack,这个包不包含数据,所以没有seqno。注意,这里的seqno是一个小数(1)。 第一次会话的时候,它会打印seqno,然后在以后的会话中,则使用与第一次会话的相对seqno。 -S可以指定为强制所有的会话都使用原始的seqno。

在第6行,rtsg发送了19字节的数据(第2字节到第20字节)。这个包设置了PUSH标识。 在第7行,csam回复表示已经收到rtsg到21字节(不包含)的数据。csam同时发送了1字节的数据到rtsg。 在第8、9行,csam发送了2字节的urgent数据到rtsg。

如果快照足够小的,那么tcpdump不能捕捉一个完整的tcp包头,它尽可能多的解释头, 然后报告一个[|tcp]来指示剩下的数据不能够被解释。如果头中包含一个伪参数(有一个长度要么太小,要么超出了头的末端), tcpdump会报告[bad opt],然后不再解释接正愁的参数,因为它不知道从哪里开始了。 如果指定了头的长度,但是IP数据报的长度不够,tcpdump会报告[bad hdr length]

使用特定的标识来捕捉tcp包

tcp头中包含8位的控制位。

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

假设我们需要观察TCP的连接建议过程。回忆一下tcp的3次握手过程,连接过程中包含的标识如下:

  1. 客户端发送SYN
  2. 服务器响应SYN和ACK
  3. 客户端响应ACK

现在我们只想捕捉只设置了SYN的包(第1步)。我们需要一个正确的expression。

回忆一下不包含参数的tcp包头:

1
2
3
4
5
6
7
8
9
10
11
12
 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字节的数据,除非包含了tcp参数。图中的第一包包含了03字节,第二行包含了47字节。

TCP控制位在第13字节:

1
2
3
4
5
 0             7|             15|             23|             31
----------------|---------------|---------------|----------------
| HL | rsvd |C|E|U|A|P|R|S|F| window size |
----------------|---------------|---------------|----------------
| | 13th octet | | |

我们直接看第13字节:

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

从右到左标上位置0到7。

回忆一下我们需要只设SYN位的包。tcp头的第13字节如下:

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

我们需要SYN位设为1。

第13字节的位在网络序中的二进制数为:

1
00000010

它对应的十进制值为2。

因为我们只要SYN设置了的包,在tcp头中的第13字节的值在网络序中为2。可以写成以下的表达式:

1
tcp[13] == 2

我们把这个表达式添加到tcpdump的过滤条件中:

1
tcpdump -i xl0 tcp[13] == 2

假设我们需要捕捉SYN包,但是不关心是否有ACK或者其他位被置上。我们先看一下同时有SYN-ACK位的第13字节:

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

第1跟第4位被置上,其二进制的值为

1
00010010

对应的十进制为18。

我们不能简单的使用tcp[13] == 18来进行过滤。因为我们要的不是只匹配SYN-ACK包, 而是设了SYN的包,而不关心其他位。

我们需要使用位与操作,来保留出SYN位是否为1,我们把需要的位与第13字节与,再判断是否存在SYN位:

1
2
3
4
     00010010 SYN-ACK              00000010 SYN
AND 00000010 (we want SYN) AND 00000010 (we want SYN)
-------- --------
= 00000010 = 00000010

因此对应的表达式为:

1
tcp[13] & 2 == 2

对应的tcpdump命令为:

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

一些位移和域可以使用名字替换数字位,例如tcp[13]可以使用tcp[tcpflags]替换。 以下的tcp域值可以使用: tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-act, tcp-urg

例如:

1
tcpdump -i xl0 'tcp[tcpflags] & tcp-push != 0'

注意要使用单引号防止&被shell解释。

UDP包

udp包格式如下:

1
actinide.who > broadcast.who: udp 84

主机actinide的who端口给广播的who端口发送84字节的用户数据。

一些UDP服务名可以被识别而打印更高级别的协议信息。

UDP域名服务请求

域名服务器请求格式如下:

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

主机h2opolo请求helios的domain服务,要求返回一个(qtype=A)的ucbvax.berkeley.edu的地址。 查询id是3,+表示递归查询。请求长度为37,不包括UDP包头和IP包头。查询操作是标准的Query, 所以op域被忽略了。否则会在3和+之前插入op。类似的qclass也是标准的的C_IN,所以被忽略了, 其他的会打印在A之后。

一些小异常是结果存在额外的域附加在中括号里:如果一个查询包含一个答案,鉴权记录或者附加章节, ancount, nscount, arcount会打印成[na], [nn], [nau],n是个数。如果一些响应位被置上 (AA, RA, rcode)或者其他必需是0的位被置上,会打印[b2&3=x]x是一个16进制数。

UDP域名服务响应

域名服务器响应格式如下:

1
2
3
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(Query)和响应码(NoError)被忽略了。

在第二个例子中,helios响应h2opolo查询 id为2的请求,返回一个non-existent domain(NXDomain)的响应码, 而没有答案,一个域名服务,没有授权记录。*表示授权答案被置上。

另外可能出现的字符有-(recursion avaliable,RA, not set), |(truncated message, TC, set)。 如果问题节不包含一个,则[nq]会被打印。

SMB/CIFS decoding

tcpdump当前包含SMB/CIFS/NBT解码在UDP/137, UDP/138, TCP/139。一些原始的IPX和NetBEUI SMB数据解码也支持。

默认使用一个最小的解码,可以-v可以得到更多详细的解码信息。注意,-v会使一个单个的SMB包显示一页或者更多, 所以确保在需要更多信息的时候才使用-v

可以SMB包的格式和种个域的意思可以查看www.cifs.org。

NFS请求和响应

Sun NFS(Network File System)请求响应打印如下:

1
2
3
4
5
6
7
8
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(源主机后面的数字是事务id而不是端口)。 请求包大小为112 bytes,不包括udp头和ip头。这个操作是执行readlink操作,操作文件操作符(fh) 21,24/10.73165119 (如果够幸运,就像这个例子,文件操作符可以解释成一个最大,最小设备数字对,跟着一个inode数字和生成数字)。 wrl回复了ok,内容为链接。

在第三行,sushi咨询lookup文件9,74/4096.6878xcolors。打印内容是基于操作类型的。 输出格式会意图自我说明的,如果结合NFS协议规范使用。

如果指定-v参数,额外的信息会被打印,例如:

1
2
3
4
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 fields,这个例子中忽略了)。 在第一行,sushi请求wrl读取文件21,11/12.19524576位置的8192字节数据。wrl回复ok, 第二行显示的包是第一个包的回复,因此长度是1472字节(另外的字节会接着后续的包片段, 但是这些片段不包含NFS和UDP头,所以可能不会被打印,基于过滤规则)。因为指定了-v, 一些文件属性会被打印:文件类型(REG,常规文件),文件权限位(8进制),uid, gid, 文件大小。

如果-v参数多次指定,更多的信息会被打印。

NFS回复包不会显式的识别RPC操作。tcpdump保持跟踪recent操作和通过事件id匹配它们的回复。 如果一个回复不匹配紧跟着的请求,它可以不会被解释。

AFS请求和响应

AFS(Andrew File System)请求响应打印如下:

1
2
3
4
5
6
7
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

在第一行,主机elvis发送一个RX包给pike。这是一个RX数据包,发送到fs(fileserver)服务, 它开始于一个RPC调用。RPC的名字为rename,包含一个旧的目录文件id536876964/1/1和一个旧文件名.newsrc.new, 新目录文件id536876964/1/1和新文件名为.newsrc。主机pike响应一个rename请求的RPC回复。

在一般情况下,所有的AFS RPC都会被解包成RPC调用名字。大多的AFS RPC参数会被解释。

格式是自我描述的。

如果-v给定两次,确认包和头文件会被打印,例如RX调用ID,调用号码,sequence number, serial number,RX包的flag。

如果-v给定两次,额外的信息会被打印,例如RX调用ID,serial number,RX包的flag。 RX的ack包同时打印MTU信息。

如果-v给定三次,安全索引和服务器id会被打印。

abort包会打印错误代码。

AFS回复包不会显式的识别RPC操作。tcpdump保持跟踪recent操作和通过事件id匹配它们的回复。 如果一个回复不匹配紧跟着的请求,它可以不会被解释。

KIP AppleTalk (DDP in UDP)

封装成UDP的AppleTalk DDP包会解释成DDP包来打印(也就是说所有的UDP包头信息都会被丢弃)。 文件/etc/atalk.names会翻译AppleTalk网络和节点编号。文件格式如下:

1
2
3
4
5
number    name

1.254 ether
16.1 icsd-net
1.254.110 ace

头两个给了AppleTalk网络的名字。第三行给了一个特定主机的名字(主机与网络的区分通过第三个8进制数, 一个网络必须包含两个8进制数,一个主机必须包含三个8进制数)。数字和名字必须以空格隔开。 /etc/atalk.names可以包含空行和注释(以#开头的行)。

AppleTalk地址打印如下:

1
2
3
4
5
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 port 2)在网络144.1,节点209上发送到任意监听220端口的icsd网络112节点。 第二行是一样的,除了源结点的名字被识别为office。第三行jssmag结点149节点的235端口发送一个广播到icsd-net NBP端口。

NBP(name binding protocol)和ATP(AppleTalk transaction protocol)包有它们的内容解释器。 其他协议只是打印协议名(或者数字,如果没有注册到协议名)和包大小。

NBP包打印格式如下:

1
2
3
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

IP片段

IP片段打印如下:

1
2
(frag id:size@offset+)
(frag id:size@offset)

第一种格式说明有更多的的数据片段。第二种说明是最后一个数据片段。

id是片段id。size是片段(字节单位),不包含IP着。offset是片段在原始数据报的位移。

每个片段都会打印片段信息。第一个片段包含高层协议头和frag信息,在协议信息之后。 第一个片段之后不再包含高层协议头,frag信息打印在源和目标地址之后。例如, 这里是从arizona.edu到lbl-rtsg.arpa的ftp包片段:

1
2
3
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协议信息都在第一个片段。 第二,第一行的tcd sequence信息打印了308字节的用户数据,实际上是512字节(第一个片段包含308字节, 第二个片段包含204字节)。

相关文章