snoop 是一个在 Solaris 和 illumos (如 OpenIndiana, SmartOS) 系列操作系统上非常强大的命令行网络数据包嗅探器(或称为“协议分析器”),它的工作原理类似于 Linux 系统上广为人知的 tcpdump,但 snoop 提供了一些自己独特的功能和语法。

什么是 snoop?
snoop 命令可以捕获通过网络接口进出系统的数据包,它允许你将这些数据包以原始或可读的形式显示在终端上,或者将它们保存到文件中以供后续分析,这对于网络故障排查、性能分析、安全审计和协议学习等任务至关重要。
基本语法
snoop 命令的基本语法如下:
snoop [选项] [捕获表达式]
- 选项: 用于控制
snoop的行为,例如输出格式、捕获数量、是否写入文件等。 - 捕获表达式: 这是一个可选的过滤规则,用于只捕获符合特定条件的数据包,如果省略,
snoop会捕获所有经过网络接口的数据包。
常用选项
以下是一些最常用和重要的 snoop 选项:
| 选项 | 描述 | 示例 |
|---|---|---|
-i <文件> |
从指定的文件中读取数据包,而不是从网络接口捕获。 | snoop -i capture.pcap |
-o <文件> |
将捕获到的数据包写入到指定的文件中。 | snoop -o capture.pcap |
-d <设备> |
指定要嗅探的网络接口。 | snoop -d bge0 |
-s <snaplen> |
设置快照长度(单位:字节),即每个数据包捕获的最大字节数,默认为 96,通常可以增大到 0(捕获完整数据包)或 65535。 | snoop -s 0 (捕获完整数据包) |
-c <数量> |
在捕获指定数量的数据包后退出。 | snoop -c 100 (捕获100个包后停止) |
-v |
显示详细信息(verbose),包括数据包的完整时间戳、IP ID、TTL等。 | snoop -v |
-x |
以十六进制(和ASCII)形式显示数据包的负载内容。 | snoop -x |
-q |
静默模式,只输出数据包的摘要信息,不显示数据包内容。 | snoop -q |
-n |
不将主机名解析为可读名称,直接显示 IP 地址。 | snoop -n |
-P |
在捕获数据包时,将网络接口设置为混杂模式,默认情况下,snoop 不会捕获非发给本机的包,此选项可以改变这一点。 |
snoop -P |
捕获表达式
snoop 的表达式语法非常强大,类似于 tcpdump,你可以通过组合不同的协议、主机、端口和方向来精确地过滤你感兴趣的数据包。

基本表达式结构:
[qualifier] primitive [and|or|not [qualifier] primitive ...]
- 限定词:
host,net,port,gateway,ip,tcp,udp,icmp等。 - 原语: IP 地址、网络地址、端口号等。
- 逻辑运算符:
and,or,not。
常用表达式示例:
| 命令 | 描述 |
|---|---|
snoop host 192.168.1.10 |
捕获所有与 IP 地址 168.1.10 相关的数据包(无论源或目的)。 |
snoop src host 192.168.1.10 |
捕获所有源 IP 地址为 168.1.10 的数据包。 |
snoop dst port 80 |
捕获所有目的端口为 80 (HTTP) 的数据包。 |
snoop host 192.168.1.10 and port 22 |
捕获来自或发往 168.1.10 并且端口为 22 (SSH) 的数据包。 |
snoop tcp |
捕获所有 TCP 协议的数据包。 |
snoop icmp |
捕获所有 ICMP 协议的数据包(ping 命令使用的包)。 |
snoop arp |
捕获所有 ARP 协议的数据包。 |
snoop net 192.168.1.0/24 |
捕获所有在 168.1.0 网络段内的数据包。 |
snoop 'tcp port 80 and host 10.0.0.1' |
使用单引号包裹复杂的表达式,防止 shell 解释。 |
实用示例
示例 1:捕获所有流量并显示摘要
snoop -q
这会快速地显示每个数据包的摘要信息,如 168.1.10.12345 > 8.8.8.8.5353: ...,非常适合快速浏览流量。
示例 2:捕获所有发往或来自特定主机的 HTTP 流量
snoop host www.example.com and port 80
或者使用 IP 地址:
snoop host 93.184.216.34 and port 80
示例 3:捕获完整的 SSH 会话(包括用户名和密码)
警告: 此命令会捕获敏感信息,请务必在授权和网络允许的情况下使用。

snoop -x -s 0 port 22
-s 0: 确保捕获完整的数据包,防止数据被截断。-x: 以十六进制和 ASCII 显示数据负载,这样你就能看到明文的 SSH 协议交互内容。
示例 4:将捕获结果保存到文件
snoop -o traffic.pcap host 192.168.1.10
这个命令会将所有与 168.1.10 相关的流量保存到 traffic.pcap 文件中,你可以使用 Wireshark 等图形化工具打开这个文件进行更深入的分析。
示例 5:从保存的文件中读取并分析
snoop -i traffic.pcap -v
这会从 traffic.pcap 文件中读取数据,并以详细模式显示出来。
示例 6:查看 DNS 查询
snoop port 53
DNS 通常使用 UDP 端口 53,但有时也使用 TCP,这个命令会捕获所有 DNS 流量。
与 tcpdump 的对比
| 特性 | snoop (Solaris/illumos) |
tcpdump (Linux/BSD/macOS) |
|---|---|---|
| 操作系统 | Solaris, illumos (如 OpenIndiana) | Linux, BSD, macOS, Windows (with WinPcap/Npcap) |
| 语法 | 类似,但有一些细微差别 | 业界标准,语法非常通用 |
| 输出格式 | 默认格式略有不同 | 格式更标准化,被广泛接受 |
| 功能 | 功能强大,是 Solaris/illumos 上的首选 | 功能极其强大,是 Linux 上的首选 |
| 读取文件 | 可以读取 .pcap 文件 |
可以读取 .pcap 文件 |
| 解析主机名 | 默认会解析,可用 -n 禁用 |
默认会解析,可用 -n 禁用 |
snoop 是 Solaris 和 illumos 系统管理员和网络工程师的必备工具,虽然 tcpdump 在 Linux 世界中更为流行,但 snoop 在其原生平台上同样高效且功能强大,掌握 snoop 的基本用法和过滤表达式,将极大地提升你在这些系统上进行网络分析和故障排除的能力。
