手册页部分 1M: 系统管理命令

退出打印视图

更新时间: 2014 年 7 月
 
 

snoop(1M)

名称

snoop - 捕获并检查网络包

用法概要

snoop [-aqrCDINPSvV] [-t [r | a | d]] [-c maxcount]
     [-d device] [-I IP_interface] [-i filename] [-n filename]
     [-o filename] [-p first [, last]] [-s snaplen]
     [-x offset [, length]] [expression]

描述

snoop 从数据链路或 IP 接口捕获包并显示其内容。如果未指定数据链路或 IP 接口,snoop 将选取要使用的数据链路,并优先使用检测到 IP 通信的数据链路。snoop 使用 pfmod(7M)bufmod(7M) STREAMS 模块从网络有效捕获包。捕获的包可在接收或保存到文件(该文件符合 RFC 1761)时显示,以便在以后检查。

snoop 可在单行汇总表单或详细多行表单中显示这些包。在汇总表单中,除某些 VLAN 包以外,仅显示与最高级别的协议相关的数据。如果包具有一个 VLAN 头,并且其 VLAN ID 为非零,snoop 将显示此包带有 VLAN 标记。例如,NFS 包将仅显示 NFS 信息。除刚才介绍的条件下的 VLAN 信息以外,系统将隐藏底层 RPC、UDP、IP 和以太网帧信息,但是,如果选择某个详细选项,则可以显示这些信息。

如果缺少名称服务(例如,LDAP 或 NIS),snoop 会将主机名显示为数字 IP 地址。

snoop 需要交互式接口。


注 - snoop 命令已过时。建议改用 Wireshark 或其非 GUI 版本 Tshark。以下软件包中提供了这些程序:
  • pkg:/diagnostic/wireshark

  • pkg:/diagnostic/wireshark/tshark

Oracle Solaris 软件包系统信息库中提供了这些软件包。


选项

–C

列出根据内核包过滤器或 snoop 自己的过滤器的过滤器表达式生成的代码。

–D

在汇总行中显示捕获时删除的包的数目。

–N

根据捕获文件创建 IP 地址-名称文件。这必须与指定捕获文件的 –i filename 选项一起设置。地址-名称文件的名称与捕获文件相同,并附加了 .names。此文件在捕获站点记录 IP 地址到主机名的映射,并提高了捕获文件的可移植性。如果要在其他位置分析捕获文件,则生成一个 .names 文件。使用此标记时,不会显示包。

–I IP_interface

使用 IP_interface 指定的 IP 接口(例如,lo0)捕获网络中的 IP 包。ipadm(1M) 命令可用于列出可用 IP 接口。–I 选项和 –d 选项互斥。

–P

在非混杂模式下捕获包。仅显示发往主机的广播、多播或包。

–S

在汇总行中显示整个链路层帧的大小(以字节为单位)。

–V

详细汇总模式。从详细程度而言,此模式介于汇总模式和详细模式之间。此模式为包中的每个协议层显示一个汇总行,而不是仅为包中最高级别的协议显示汇总行。例如,对于 NFS 包,它将为 ETHER、IP、UDP、RPC 和 NFS 层各显示一行。通过 grep 可以轻松传输详细汇总模式输出以提取相关包。例如,要仅查看 RPC 汇总行,请输入以下内容:example# snoop -i rpc.cap -V | grep RPC

–a

/dev/audio 上侦听包(警告:可能有杂音)。

–c maxcount

在捕获 maxcount 包后退出。否则继续捕获,直到没有剩余磁盘空间或使用 Ctrl-C 中断为止。

–d datalink

使用 datalink 指定的 DLPI 数据链路(例如,bge0net0)从网络中捕获链路层包。dladm(1M) show-link 子命令可用于列出可用数据链路。–d 选项和 –I 选项互斥。

–i filename

显示 filename 中以前捕获的包。如果没有此选项,snoop 将从第一个网络接口读取包。如果存在 filename.names 文件,则会将其自动装载到 snoop IP 地址-名称映射表(请参见 –N 标志)。

–n filename

使用 filename 作为 IP 地址-名称映射表。此文件的格式必须与 /etc/hosts 文件的格式相同(后跟有主机名的 IP 地址)。

–o filename

在捕获包时将捕获到的包保存到 filename 中。(此 filename 称为“捕获文件”。)捕获文件的格式符合 RFC 1761。捕获包期间,将显示保存在此文件中的包的计数。如果您仅希望计算包的数目,而不保存到文件,请指定文件 /dev/null

–p first [ , last ]

从捕获文件中选择一个或多个要显示的包。此文件中的 first 包即为第 1 个包。

–q

将网络包捕获到文件中时,不会显示包计数。这可以提高捕获包的性能。

–r

不会将 IP 地址解析为符号名称。这会防止 snoop 在捕获和显示包时生成网络通信。但是,如果使用 –n 选项,并在映射文件中找到某个地址,则将使用其相应名称。

–s snaplen

snaplen 字节后截断各个包。通常捕获整个包。仅当需要某些包头信息时,此选项才会有用。包截断操作是在内核中完成的,使您可以更好地利用流包缓冲区。这意味着,在高通信期间,因缓冲区溢出而删除包的可能性较小。此选项还会在将大型跟踪捕获到捕获文件时节省磁盘空间。要仅捕获 IP 头(无选项),请使用 snaplen 34。对于 UDP,请使用 42,对于 TCP,请使用 54。您可以使用包含 80 个字节的 snaplen 捕获 RPC 头。可以 120 个字节为单位捕获 NFS 头。

–t [ –r | –a | –d ]

时间戳显示。时间戳精确至 4 微秒以内。缺省设置是以 –d(增量)格式显示时间(自收到上一个包以来的时间)。选项 –a(绝对)提供墙上时钟时间。选项 –r(相对)提供相对于显示的第一个包的时间。此选项可以与 –p 选项配合使用,以便显示相对于任何选定包的时间。

–v

详细模式。详细输出包头。此显示针对每个包使用多个行,并且只能用于选定包。

–xoffset [ , length]

以十六进制和 ASCII 格式显示包数据。offsetlength 值选择要显示的包的部分。要显示整个包,请使用 offset 0。如果未提供 length 值,则会显示包的其余部分。

操作数

expression

从网络或捕获文件中选择包。仅选择表达式为 true 的包。如果未提供表达式,则假定它为 true。

如果给定过滤器表达式,snoop 将为内核包过滤器或其自己的内部过滤器生成代码。如果使用网络接口捕获包,则将生成适用于内核包过滤器的代码。此过滤器作为流模块(即缓冲区模块的上游)实现。缓冲区模块会一直累积包,直到其已满为止,并将这些包传递到 snoop。在内核中不需要的包到达包缓冲区或 snoop 之前,内核包过滤器会拒绝这些包,因此此过滤器非常有效。内核包过滤器具有某些实现限制;它可以构建无法处理的过滤器表达式。此种情况下,snoop 会尝试拆分过滤器,并在内核中执行尽可能多的过滤操作。对于 snoop,其余过滤操作都由包过滤器完成。–C 标志可用于查看为内核包过滤器或 snoop 的包过滤器生成的代码。如果使用 –i filename 选项从捕获文件读取包,则仅使用 snoop 的包过滤器。

过滤器 expression 包含一个或多个布尔基元序列,这些基元可使用布尔运算符(ANDORNOT)组合在一起。应用布尔运算符的常规优先级规则。使用括号可以控制这些运算符的计算顺序。由于 shell 已知括号和其他过滤器表达式字符,因此通常需要将过滤器表达式包含在引号中。有关如何设置更有效的过滤器的信息,请参见示例 2

这些基元包括:

host hostname

如果源或目标地址是 hostname 的源或目标地址,则为 True。hostname 参数可以为文本地址。如果此名称不与其他表达式基元的名称冲突,则可以忽略关键字 host。例如,pinky 选择传送到主机 pinky 或从该主机接收的包,而 pinky and dinky 选择在主机 pinky AND dinky 之间交换的包。

使用的地址类型取决于 host 基元前面的基元。可能的限定符包括 inetinet6ether,或没有限定符。下面讨论了这三个基元。不提供任何基元等效于“inet host hostname or inet6 host hostname”。换言之,snoop 尝试根据与主机名关联的所有 IP 地址进行过滤。

inetinet6

修改后面的 host 基元的限定符。如果为 inetsnoop 尝试根据名称查找返回的所有 IPv4 地址进行过滤。如果为 inet6snoop 尝试根据名称查找返回的所有 IPv6 地址进行过滤。

ipaddratalkaddretheraddr

可以识别文本地址、IP 点分地址、AppleTalk 点分地址和以太网冒号地址。例如,

  • 172.16.40.13”与采用该 IP 的所有包匹配

  • 2::9255:a00:20ff:fe73:6e35”与采用此 IPv6 地址作为源或目标的所有包匹配;

  • 65281.13”与采用此 AppleTalk 地址的所有包匹配;

  • 8:0:20:f:b1:51”与采用此以太网地址作为源或目标的所有包匹配。

以字母开头的以太网地址解释为主机名。为了避免此种情况,请在指定地址时在此地址前面添加一个零。例如,如果以太网地址为 aa:0:45:23:52:44,通过添加一个前导零将此地址指定为 0aa:0:45:23:52:44

fromsrc

修改以下的 hostnetipaddratalkaddretheraddrportrpc 基元以便仅与源地址、端口或 RPC 回复匹配的限定符。

todst

修改以下的 hostnetipaddratalkaddretheraddrportrpc 基元以便仅与目标地址、端口或 RPC 调用匹配的限定符。

ether

修改以下的 host 基元以便将名称解析为以太网地址的限定符。通常执行 IP 地址匹配操作。IPoIB (IP over InfiniBand) 等介质上不支持此选项。

ethertype number

如果以太网类型字段的值为 number,则为 True。如果 number 不为 0x8100 (VLAN),并且包带有 VLAN 标记,表达式将与封装的以太网类型相匹配。

ipip6arprarppppoedpppoes

如果包是适当的 ethertype,则为 True。

vlan

如果包 ethertype 为 VLAN,并且 VLAN ID 不为零,则为 True。

vlan-id id

对于 ethertype 为 VLAN 且 ID 为 id 的包,则为 True。

pppoe

如果包 ethertype 为 pppoedpppoes,则为 True。

broadcast

如果包为广播包,则为 True。对于以太网,等效于 ether[2:4] = 0xffffffff。IPoIB (IP over InfiniBand) 等介质上不支持此选项。

多播

如果包为多播包,则为 True。在以太网上等效于“ether[0] & 1 = 1”。IPoIB (IP over InfiniBand) 等介质上不支持此选项。

bootp, dhcp

如果包是未分段的 IPv4 UDP 包,并且其源端口为 BOOTPS (67) 且目标端口为 BOOTPC (68),或者源端口为 BOOTPC (68) 且目标为 BOOTPS (67),则为 True。

dhcp6

如果包是未分段的 IPv6 UDP 包,并且其源端口为 DHCPV6-SERVER (547) 且目标端口为 DHCPV6-CLIENT (546),或者源端口为 DHCPV6-CLIENT (546) 且目标为 DHCPV6-SERVER (547),则为 True。

apple

如果包为 Apple Ethertalk 包,则为 True。等效于“ethertype 0x809b or ethertype 0x80f3”。

decnet

如果包为 DECNET 包,则为 True。

greater length

如果包长于 length,则为 True。

less length

如果包短于 length,则为 True。

udp, tcp, icmp, icmp6, ah, esp

如果 IP 或 IPv6 协议为适当的类型,则为 True。

net net

如果 IP 源或目标地址的网络号为 net,则为 True。fromto 限定符可用于选择网络号仅存在于源或目标地址中的包。

port port

如果源或目标端口为 port,则为 True。port 可以是来自 /etc/services 的端口号或名称。tcpudp 基元只能用于选择 TCP 或 UDP 端口。fromto 限定符可用于选择 port 仅作为源或目标的包。

rpc prog [ , vers [ , proc ] ]

如果包是 RPC 调用或 prog 标识的协议的回复包,则为 True。prog 可以是来自 /etc/rpc 的 RPC 协议的名称,也可以是程序编号。versproc 可用于进一步限定程序 versionprocedure 编号,例如,rpc nfs,2,0 选择 NFS 空过程的所有调用和回复。tofrom 限定符可用于仅选择调用或回复包。

zone zoneid

如果 zoneidipnet 设备上接收到的包的源或目标 zoneid 匹配,则为 True。

ldap

如果包是端口 389 上的 LDAP 包,则为 True。

gateway host

如果包已使用 host 作为网关,也即,以太网源或目标地址用于 host(而非 IP 地址),则为 True。等效于“ether host host and not host host”。

nofrag

如果包未分段或是 IP 分段序列中的第一个包,则为 True。等效于 ip[6:2] & 0x1fff = 0

expr relop expr

如果保持关系,其中 relop><>=<==!= 之一,并且 expr 是由数字、包字段选择器、length 基元和算术运算符 +*&|^% 组成的算术表达式,则为 True。在算术运算符之间应用关系运算符和常规优先级规则之前,系统会先计算 expr 中的算术运算符,例如,在执行加法运算之前先执行乘法运算。括号可用于控制计算顺序。要使用包中某个字段的值,请使用下面的语法:

base[expr [: size ] ]

其中 expr 计算包中离 base 偏移量的偏移量的值,前一个偏移量可以为 etheripip6udptcpicmpsize 值指定字段大小。如果未指定,则假定为 1。其他合法值为 2 和 4。例如,

ether[0] & 1 = 1

等效于 multicast

ether[2:4] = 0xffffffff

等效于 broadcast

ip[ip[0] & 0xf * 4 : 2] = 2049

等效于 udp[0:2] = 2049

ip[0] & 0xf > 5

使用选项选择 IP 包。

ip[6:2] & 0x1fff = 0

消除 IP 分段。

udp and ip[6:2]&0x1fff = 0 and udp[6:2] != 0

使用 UDP 校验和查找所有包。

length 基元可用于获取包的长度。例如,“length > 60”等效于“greater 60”,“ether[length − 1]”获取包中最后一个字节的值。

在两个布尔值之间执行逻辑 AND 运算。通过并列的两个布尔表达式来暗指 AND 运算,例如,“dinky pinky”与“dinky AND pinky”相同。

or,

在两个布尔值之间执行逻辑 OR 运算。可改用逗号,例如,“dinky,pinky”与“dinky OR pinky”相同。

not!

对下列布尔值执行逻辑 NOT 运算。在 AND 或 OR 之前计算此运算符。

slp

如果包为 SLP 包,则为 True。

sctp

如果包为 SCTP 包,则为 True。

ospf

如果包为 OSPF 包,则为 True。

示例

示例 1 使用 snoop 命令

捕获所有包,并在接收这些包时显示它们:

example# snoop

使用主机 funky 作为源或目标来捕获包,并在接收这些包时显示它们:

example# snoop funky

捕获 funkypinky 之间的包,并将其保存到文件。然后,使用相对于捕获的第一个包的时间(以秒为单位)检查包:

example# snoop -o cap funky pinky
example# snoop -i cap -t r | more

要查看其他捕获文件中的选定包:

example# snoop -i pkts -p 99,108
 99   0.0027   boutique -> sunroof     NFS C GETATTR FH=8E6
100   0.0046   sunroof -> boutique     NFS R GETATTR OK
101   0.0080   boutique -> sunroof NFS C RENAME FH=8E6C MTra00192 to .nfs08
102   0.0102   marmot -> viper        NFS C LOOKUP FH=561E screen.r.13.i386
103   0.0072   viper -> marmot       NFS R LOOKUP No such file or directory
104   0.0085   bugbomb -> sunroof    RLOGIN C PORT=1023 h
105   0.0005   kandinsky -> sparky    RSTAT C Get Statistics
106   0.0004   beeblebrox -> sunroof  NFS C GETATTR FH=0307
107   0.0021   sparky -> kandinsky    RSTAT R
108   0.0073   office -> jeremiah      NFS C READ FH=2584 at 40960 for 8192

要更详细地查看包 101:

example# snoop -i pkts -v -p101
ETHER:  ----- Ether Header -----
ETHER:
ETHER:  Packet 101 arrived at 16:09:53.59
ETHER:  Packet size = 210 bytes
ETHER:  Destination = 8:0:20:1:3d:94, Sun
ETHER:  Source      = 8:0:69:1:5f:e,  Silicon Graphics
ETHER:  Ethertype = 0800 (IP)
ETHER:
IP:   ----- IP Header -----
IP:
IP:   Version = 4, header length = 20 bytes
IP:   Type of service = 00
IP:         ..0. .... = routine
IP:         ...0 .... = normal delay
IP:         .... 0... = normal throughput
IP:         .... .0.. = normal reliability
IP:   Total length = 196 bytes
IP:   Identification 19846
IP:   Flags = 0X
IP:   .0.. .... = may fragment
IP:   ..0. .... = more fragments
IP:   Fragment offset = 0 bytes
IP:   Time to live = 255 seconds/hops
IP:   Protocol = 17 (UDP)
IP:   Header checksum = 18DC
IP:   Source address = 172.16.40.222, boutique
IP:   Destination address = 172.16.40.200, sunroof
IP:
UDP:  ----- UDP Header -----
UDP:
UDP:  Source port = 1023
UDP:  Destination port = 2049 (Sun RPC)
UDP:  Length = 176
UDP:  Checksum = 0
UDP:
RPC:  ----- SUN RPC Header -----
RPC:
RPC:  Transaction id = 665905
RPC:  Type = 0 (Call)
RPC:  RPC version = 2
RPC:  Program = 100003 (NFS), version = 2, procedure = 1
RPC:  Credentials: Flavor = 1 (Unix), len = 32 bytes
RPC:     Time = 06-Mar-90 07:26:58
RPC:     Hostname = boutique
RPC:     Uid = 0, Gid = 1
RPC:     Groups = 1
RPC:  Verifier   : Flavor = 0 (None), len = 0 bytes
RPC:
NFS:  ----- SUN NFS -----
NFS:
NFS:  Proc = 11 (Rename)
NFS:  File handle = 000016430000000100080000305A1C47
NFS:                597A0000000800002046314AFC450000
NFS:  File name = MTra00192
NFS:  File handle = 000016430000000100080000305A1C47
NFS:                597A0000000800002046314AFC450000
NFS:  File name = .nfs08
NFS:  

要仅查看 sunroofboutique 之间的 NFS 包:

example# snoop -i pkts rpc nfs and sunroof and boutique
1   0.0000   boutique -> sunroof    NFS C GETATTR FH=8E6C
2   0.0046    sunroof -> boutique   NFS R GETATTR OK  
3   0.0080   boutique -> sunroof   NFS C RENAME FH=8E6C MTra00192 to .nfs08

要将这些包保存到新捕获文件:

example# snoop -i pkts -o pkts.nfs rpc nfs sunroof boutique

要查看封装的包,包中将存在一个封装指示器:

example# snoop ip-in-ip
sunroof -> boutique ICMP Echo request    (1 encap)

如果在封装包中使用 -V:

example# snoop -V ip-in-ip
sunroof -> boutique  ETHER Type=0800 (IP), size = 118 bytes
sunroof -> boutique  IP D=172.16.40.222 S=172.16.40.200 LEN=104, ID=27497
sunroof -> boutique  IP  D=10.1.1.2 S=10.1.1.1 LEN=84, ID=27497
sunroof -> boutique  ICMP Echo request
示例 2 设置更有效的过滤器

要设置更有效的过滤器,应在表达式末尾使用下列过滤器,以便可以在内核中设置表达式的第一个部分:greaterlessportrpcnofragrelop。使用无法在内核中设置的这些基元时,如果存在 OR,则很难拆分过滤。而应改用括号以便强制应执行 OR 运算的基元。

要在 port 80 上封装 funkypinky 之间的 tcpudp 类型的包:

example# snoop funky and pinky and port 80 and tcp or udp

由于内核过滤器无法处理基元 port,并且表达式中还存在 OR,一种更有效的过滤方法是将 OR 移至表达式末尾,并使用括号在 tcpudp 之间强制 OR

example# snoop funky and pinky and (tcp or udp) and port 80

退出状态

0

成功完成。

1

出现错误。

文件

/dev/audio

指向系统的主要音频设备的符号链接。

/dev/null

空文件。

/etc/hosts

主机名数据库。

/etc/rpc

RPC 程序编号数据库。

/etc/services

Internet 服务和别名。

属性

有关下列属性的说明,请参见 attributes(5)

属性类型
属性值
可用性
service/network/network-clients
接口稳定性
过时

另请参见

dladm(1M)ipadm(1M)netstat(1M)hosts(4)rpc(4)services(4)attributes(5)audio(7I)ipnet(7D)bufmod(7M)dlpi(7P)pfmod(7M)

由 Callaghan, B. 和 Gilligan, R. 编著的《Snoop Version 2 Packet Capture File Format》,RFC 1761。Network Working Group 出版。1995 年 2 月。

警告

实时包解释的处理开销要高得多。因此,包删除计数可能较高。为了进行更可靠的捕获,请使用 –o 选项将原始包输出到文件,并脱机分析这些包。

未经过滤的包捕获会对主机施加大量处理负载,特别是当实时解释捕获的包时。如果使用详细选项,此处理负载将进一步增加。由于大量使用 snoop 会拒绝其他进程的计算资源,因此不应在生产服务器上使用它。仅限在专用计算机上大量使用 snoop

snoop 不会重装 IP 分段。解释较高级别的协议将在第一个 IP 分段末尾暂停。

使用 snoop 的负面影响是可能会生成额外的包。例如,它可以使用网络名称服务 (NIS) 将 IP 地址转换为主机名以便显示。通过捕获到文件以便在以后显示,可以延迟地址-名称映射,直到完成捕获会话后为止。捕获到挂载了 NFS 的文件中还会生成额外的包。

snaplen–s 选项)设置为较小值会删除解释较高级别的协议所需的头信息。确切截止值取决于使用的网络和协议。对于在 10 Mb/s 以太网上使用 UDP 的 NFS 版本 2 通信,请不要将 snaplen 设置为小于 150 字节的值。对于在 100 Mb/s 以太网上使用 TCP 的 NFS 版本 3 通信,snaplen 应为 250 字节或更大值。

snoop 需要来自 RPC 请求的信息,以便完全解释 RPC 回复。如果捕获文件或包范围中的 RPC 回复前面没有请求,则仅显示 RPC 回复头。