Linux tcpdump命令详解(4)

UDP 数据包
 
UDP 数据包的显示格式,可通过rwho这个具体应用所产生的数据包来说明:
 actinide.who > broadcast.who: udp 84
 
其含义为:actinide主机上的端口who向broadcast主机上的端口who发送了一个udp数据包(nt: actinide和broadcast都是指Internet地址).
 这个数据包承载的用户数据为84个字节.
 
一些UDP服务可从数据包的源或目的端口来识别,也可从所显示的更高层协议信息来识别. 比如, Domain Name service requests(DNS 请求,
 在RFC-1034/1035中), 和Sun RPC calls to NFS(对NFS服务器所发起的远程调用(nt: 即Sun RPC),在RFC-1050中有对远程调用的描述).
 
UDP 名称服务请求
 
(注意:以下的描述假设你对Domain Service protoco(nt:在RFC-103中有所描述), 否则你会发现以下描述就是天书(nt:希腊文天书,
 不必理会, 吓吓你的, 接着看就行))
 
名称服务请求有如下的格式:
 src > dst: id op? flags qtype qclass name (len)
 (nt: 从下文来看, 格式应该是src > dst: id op flags qtype qclass? name (len))
 比如有一个实际显示为:
 h2opolo.1538 > helios.domain: 3+ A? ucbvax.berkeley.edu. (37)
 
主机h2opolo 向helios 上运行的名称服务器查询ucbvax.berkeley.edu 的地址记录(nt: qtype等于A). 此查询本身的id号为'3'. 符号
 '+'意味着递归查询标志被设置(nt: dns服务器可向更高层dns服务器查询本服务器不包含的地址记录). 这个最终通过IP包发送的查询请求
 数据长度为37字节, 其中不包括UDP和IP协议的头数据. 因为此查询操作为默认值(nt | rt: normal one的理解), op字段被省略.
 如果op字段没被省略, 会被显示在'3' 和'+'之间. 同样, qclass也是默认值, C_IN, 从而也没被显示, 如果没被忽略, 她会被显示在'A'之后.
 
异常检查会在方括中显示出附加的域: 如果一个查询同时包含一个回应(nt: 可理解为, 对之前其他一个请求的回应), 并且此回应包含权威或附加记录段, 
 ancount, nscout, arcount(nt: 具体字段含义需补充) 将被显示为'[na]', '[nn]', '[nau]', 其中n代表合适的计数. 如果包中以下
 回应位(比如AA位, RA位, rcode位), 或者字节2或3中任何一个'必须为0'的位被置位(nt: 设置为1), '[b2&3]=x' 将被显示, 其中x表示
 头部字节2与字节3进行与操作后的值.
 
UDP 名称服务应答
 
对名称服务应答的数据包,tcpdump会有如下的显示格式
 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 所发送的3号查询请求回应了3条回答记录(nt | rt: answer records), 3条名称服务器记录,
 以及7条附加的记录. 第一个回答记录(nt: 3个回答记录中的第一个)类型为A(nt: 表示地址), 其数据为internet地址128.32.137.3.
 此回应UDP数据包, 包含273字节的数据(不包含UPD和IP的头部数据). op字段和rcode字段被忽略(nt: op的实际值为Query, rcode, 即
 response code的实际值为NoError), 同样被忽略的字段还有class 字段(nt | rt: 其值为C_IN, 这也是A类型记录默认取值)
 
第二行表示: helios 对h2opolo 所发送的2号查询请求做了回应. 回应中, rcode编码为NXDomain(nt: 表示不存在的域)), 没有回答记录,
 但包含一个名称服务器记录, 不包含权威服务器记录(nt | ck: 从上文来看, 此处的authority records 就是上文中对应的additional
 records). '*'表示权威服务器回答标志被设置(nt: 从而additional records就表示的是authority records).
 由于没有回答记录, type, class, data字段都被忽略.
 
flag字段还有可能出现其他一些字符, 比如'-'(nt: 表示可递归地查询, 即RA 标志没有被设置), '|'(nt: 表示被截断的消息, 即TC 标志
 被置位). 如果应答(nt | ct: 可理解为, 包含名称服务应答的UDP数据包, tcpdump知道这类数据包该怎样解析其数据)的'question'段一个条
 目(entry)都不包含(nt: 每个条目的含义, 需补充),'[nq]' 会被打印出来.
 
要注意的是:名称服务器的请求和应答数据量比较大, 而默认的68字节的抓取长度(nt: snaplen, 可理解为tcpdump的一个设置选项)可能不足以抓取
 数据包的全部内容. 如果你真的需要仔细查看名称服务器的负载, 可以通过tcpdump 的-s 选项来扩大snaplen值.
 
SMB/CIFS 解码
 
tcpdump 已可以对SMB/CIFS/NBT相关应用的数据包内容进行解码(nt: 分别为'Server Message Block Common', 'Internet File System'
 '在TCP/IP上实现的网络协议NETBIOS的简称'. 这几个服务通常使用UDP的137/138以及TCP的139端口). 原来的对IPX和NetBEUI SMB数据包的
 解码能力依然可以被使用(nt: NetBEUI为NETBIOS的增强版本).
 

tcpdump默认只按照最简约模式对相应数据包进行解码, 如果我们想要详尽的解码信息可以使用其-v 启动选现. 要注意的是, -v 会产生非常详细的信息,
 比如对单一的一个SMB数据包, 将产生一屏幕或更多的信息, 所以此选项, 确有需要才使用.
 
关于SMB数据包格式的信息, 以及每个域的含义可以参看 或者samba.org 镜像站点的pub/samba/specs/ 目录. linux 上的SMB 补丁
 (nt | rt: patch)由 Andrew Tridgell (tridge@samba.org)提供.
 

NFS 请求和回应
 
tcpdump对Sun NFS(网络文件系统)请求和回应的UDP数据包有如下格式的打印输出:
 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向主机wrl发送了一个'交换请求'(nt: transaction), 此请求的id为6709(注意, 主机名字后是交换
 请求id号, 而不是源端口号). 此请求数据为112字节, 其中不包括UDP和IP头部的长度. 操作类型为readlink(nt: 即此操作为读符号链接操作),
 操作参数为fh 21,24/10.73165(nt: 可按实际运行环境, 解析如下, fd 表示描述的为文件句柄, 21,24 表示此句柄所对应设
 备的主/从设备号对, 10表示此句柄所对应的i节点编号(nt:每个文件都会在操作系统中对应一个i节点, 限于unix类系统中),
 73165是一个编号(nt: 可理解为标识此请求的一个随机数, 具体含义需补充)).
 
第二行中, wrl 做了'ok'的回应, 并且在results 字段中返回了sushi想要读的符号连接的真实目录(nt: 即sushi要求读的符号连接其实是一个目录).
 
第三行表明: sushi 再次请求 wrl 在'fh 9,74/4096.6878'所描述的目录中查找'xcolors'文件. 需要注意的是, 每行所显示的数据含义依赖于其中op字段的
 类型(nt: 不同op 所对应args 含义不相同), 其格式遵循NFS 协议, 追求简洁明了.
 
 
 
如果tcpdump 的-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 域, 但在此例中, 都略过了(nt: 可理解为,简洁起见, 做了删减))
 在第一行, sushi 请求wrl 从文件 21,11/12.195(nt: 格式在上面有描述)中, 自偏移24576字节处开始, 读取8192字节数据.
 Wrl 回应读取成功; 由于第二行只是回应请求的开头片段, 所以只包含1472字节(其他的数据将在接着的reply片段中到来, 但这些数据包不会再有NFS
 头, 甚至UDP头信息也为空(nt: 源和目的应该要有), 这将导致这些片段不能满足过滤条件, 从而没有被打印). -v 选项除了显示文件数据信息, 还会显示
 附加显示文件属性信息: file type(文件类型, ''REG'' 表示普通文件), file mode(文件存取模式, 8进制表示的), uid 和gid(nt: 文件属主和
 组属主), file size (文件大小).
 
如果-v 标志被多次重复给出(nt: 如-vv), tcpdump会显示更加详细的信息.
 
必须要注意的是, NFS 请求包中数据比较多, 如果tcpdump 的snaplen(nt: 抓取长度) 取太短将不能显示其详细信息. 可使用
 '-s 192'来增加snaplen, 这可用以监测NFS应用的网络负载(nt: traffic).
 
NFS 的回应包并不严格的紧随之前相应的请求包(nt: RPC operation). 从而, tcpdump 会跟踪最近收到的一系列请求包, 再通过其
 交换序号(nt: transaction ID)与相应请求包相匹配. 这可能产生一个问题, 如果回应包来得太迟, 超出tcpdump 对相应请求包的跟踪范围,
 该回应包将不能被分析.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/20459.html