snoop 是 Solaris 和 Oracle Solaris 操作系统中一个非常强大的网络数据包嗅探(抓包)和分析工具,它类似于 Linux 系统中广为人知的 tcpdump 命令,但 snoop 有其独特的功能和语法。

什么是 snoop?
snoop 命令允许你捕获和显示通过网络接口传输的数据包,它可以用来:
- 网络诊断:分析网络连接问题,如丢包、延迟、乱序等。
- 性能分析:查看网络流量,找出带宽瓶颈。
- 安全审计:检测可疑的网络活动,如扫描、攻击尝试。
- 协议分析:深入检查 TCP/IP 或其他协议的交互细节。
- 数据捕获:将数据包保存到文件中,供后续分析(例如用 Wireshark)。
基本语法
snoop 命令的基本语法如下:
snoop [选项] [捕获表达式] [输出文件]
- 选项:控制
snoop的行为,如显示方式、捕获模式等。 - 捕获表达式:这是
snoop的核心,用于过滤你想要捕获的数据包,如果不提供表达式,它会捕获所有数据包。 - 输出文件:将捕获到的数据包保存到指定文件中,如果不指定,数据包会直接显示在终端上。
常用选项
以下是一些最常用的 snoop 选项:
| 选项 | 描述 |
|---|---|
-i <interface> |
指定要监听的网络接口,如 hme0, bge0 等,默认是第一个可用的接口。 |
-d <device> |
指定网络设备文件,如 /dev/hme0,与 -i 类似。 |
-p <port> |
只捕获指定端口的流量。 |
-s <snaplen> |
设置抓取的数据包长度(快照长度),默认是 96 字节,通常可以增加到足够大的值(如 1500)以捕获完整数据包。 |
-c <count> |
只捕获指定数量的数据包后退出。 |
-S |
以 ASCII 字符显示数据包内容,非 ASCII 字符显示为 。 |
-x |
以十六进制和 ASCII 格式显示数据包内容,非常详细。 |
-v |
显示详细输出,包括数据包的头部信息,可以多次使用(如 -vv)来增加详细程度。 |
-o <filename> |
将捕获到的数据包保存到文件,这是推荐保存数据包的方式。 |
-A |
以纯文本方式尝试解码并显示数据包的负载部分。 |
-D |
列出所有可用的网络接口并退出。 |
-n |
不将主机名和端口名转换为数字(即不进行 DNS 反向解析),这可以加快捕获速度。 |
捕获表达式
snoop 的捕获表达式功能强大,它使用类似 C 语言的语法来过滤数据包,这是 snoop 与 tcpdump 语法差异最大的地方。

基本语法结构
表达式由 主机、网络、端口 和 方向 组成。
格式:
[方向] 协议 [主机] [端口]
-
方向:
from host <hostname>: 从指定主机发出的数据包。to host <hostname>: 发往指定主机的数据包。from host <hostname> to host <hostname>: 从 A 主机到 B 主机的数据包。from any: 从任何主机发出的数据包。to any: 发往任何主机的数据包。broadcast: 广播数据包。multicast: 多播数据包。- 如果省略方向,则匹配该方向和其相反方向(即双向)。
-
协议:
(图片来源网络,侵删)tcp,udp,icmp,arp,ip等。
-
主机:
host <hostname_or_ip>: 可以是主机名或 IP 地址。
-
端口:
port <port_number>: 端口号。port <service_name>: 服务名(如http,ssh)。
常用表达式示例
-
捕获所有流量
snoop
-
捕获与特定主机(如
168.1.100)相关的所有流量snoop host 192.168.1.100
-
捕获从
168.1.100发出的所有数据包snoop from host 192.168.1.100
-
捕获发往
168.1.100的所有数据包snoop to host 192.168.1.100
-
捕获通过 TCP 协议的流量
snoop tcp
-
捕获与特定端口(如 80,Web 服务)相关的流量
snoop port 80 # 或者使用服务名 snoop port http
-
捕获从
168.1.100到168.1.200的 TCP 流量snoop tcp from host 192.168.1.100 to host 192.168.1.200
-
捕获除了 ICMP 之外的所有流量
snoop and not icmp
-
捕获源或目的端口为 22 (SSH) 的流量
snoop tcp port 22
实用示例
示例 1:查看与特定主机的完整 HTTP 交互
# 捕获与 web.server.com 的 http 流量,并显示详细内容 snoop -v host web.server.com port http
示例 2:捕获流量并保存到文件,供 Wireshark 分析
# 捕获所有流量,保存到 capture.pcap 文件 # 注意:snoop 默认保存的格式是 Sun Snoop 格式,现代工具通常能识别 snoop -o capture.pcap # 如果需要捕获更完整的数据包,可以指定 snaplen snoop -s 1500 -o capture.pcap
示例 3:快速查看 DNS 查询
# 捕获 DNS 请求(通常是 UDP 端口 53) snoop -v udp port 53
示例 4:只捕获 100 个数据包后退出
snoop -c 100 host 10.0.0.5
示例 5:以十六进制查看数据包内容
# 捕获前 5 个数据包,并以十六进制/ASCII 显示 snoop -c 5 -x host 10.0.0.1
snoop 与 tcpdump 的主要区别
| 特性 | snoop (Solaris) |
tcpdump (Linux/BSD) |
|---|---|---|
| 语法 | snoop [方向] 协议 主机 端口 |
tcpdump [协议] [主机] [端口] |
| 方向处理 | from, to 是关键字,语法更明确。 |
方向通常通过 src, dst, src or dst 等选项实现。 |
| 默认输出 | 默认显示更友好的信息,如服务名。 | 默认显示更原始的信息,如端口号。 |
| 输出格式 | -o 保存的文件格式是 Sun Snoop 格式。 |
-w 保存的文件是标准的 pcap 格式,兼容性更好。 |
| 性能 | 在 Solaris 上通常性能更好,因为它是系统原生工具。 | 是跨平台的通用工具,性能取决于系统。 |
重要注意事项
- 权限:
snoop需要root权限或具有snoop特权的用户才能运行,因为它需要直接访问网络接口。 - 性能影响:在繁忙的网络上,
snoop会消耗大量 CPU 资源,建议在必要时使用,并尽量使用精确的过滤表达式来减少负载。 - 文件大小:长时间捕获会产生巨大的文件,务必在开始前规划好存储空间,并使用
-c选项限制捕获数量。 - 隐私与法律:未经授权捕获网络流量可能违反公司政策或当地法律,请确保你有权限监控你想要捕获的网络流量。
snoop 是 Solaris 环境下进行网络故障排查和协议分析的利器,掌握它的过滤语法是高效使用它的关键。
