跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 管理:IP 服务 Oracle Solaris 11 Information Library (简体中文) |
可以使用 snoop 命令监视数据传送的状态。snoop 捕获网络包并以指定的格式显示其内容。系统收到包或将其保存到文件之后,便会立即显示这些包。当 snoop 向中间文件执行写入操作时,在密切跟踪的情况下不可能丢失包。然后,可以使用 snoop 本身来解释此文件。
要以混杂模式捕获进出缺省接口的包,您必须承担网络管理员角色或成为超级用户。在汇总表单中,snoop 仅显示与最高级协议有关的数据。例如,NFS 包仅显示 NFS 信息,而不会显示底层 RPC、UDP、IP 和以太网帧信息,但是如果选择了两个详细选项之一,则会显示这些信息。
坚持不懈地使用 snoop 可以使您熟悉常规系统行为。有关对包进行分析的帮助,请查找最新的白皮书和 RFC,并搜寻专家针对特定领域(如 NFS 或 NIS)提供的建议。有关使用 snoop 及其选项的详细信息,请参阅 snoop(1M) 手册页。
# ipadm show-if
snoop 命令通常使用第一个非回送设备,通常为主网络接口。
示例 5-15 snoop 命令的输出
基本 snoop 命令针对双栈主机返回如下所示的输出。
% snoop Using device /dev/net (promiscuous mode) router5.local.com -> router5.local.com ARP R 10.0.0.13, router5.local.com is 0:10:7b:31:37:80 router5.local.com -> BROADCAST TFTP Read "network-confg" (octet) myhost -> DNSserver.local.com DNS C 192.168.10.10.in-addr.arpa. Internet PTR ? DNSserver.local.com myhost DNS R 192.168.10.10.in-addr.arpa. Internet PTR niserve2. . . . fe80::a00:20ff:febb:e09 -> ff02::9 RIPng R (5 destinations)
在此输出中捕获的包显示了远程登录部分,包括查找 NIS 和 DNS 服务器以便进行地址解析。同时还包括来自本地路由器的定期 ARP 包以及向 in.ripngd 发出的 IPv6 链路本地地址的通告。
# snoop -o filename
例如:
# snoop -o /tmp/cap Using device /dev/eri (promiscuous mode) 30 snoop: 30 packets captured
此示例中,在名为 /tmp/cap 的文件中捕获到了 30 个包。可以将此文件放在任何具有足够磁盘空间的目录中。捕获的包数显示在命令行中,您可以随时按 Ctrl-C 组合键中止捕获。
snoop 将在主机上生成大量网络负载,这会使结果失真。要查看实际结果,请从第三方系统运行 snoop。
# snoop -i filename
示例 5-16 snoop 输出捕获文件的内容
以下内容显示了可能会作为 snoop -i 命令输出接收到的各种捕获。
# snoop -i /tmp/cap 1 0.00000 fe80::a00:20ff:fee9:2d27 -> fe80::a00:20ff:fecd:4375 ICMPv6 Neighbor advertisement ... 10 0.91493 10.0.0.40 -> (broadcast) ARP C Who is 10.0.0.40, 10.0.0.40 ? 34 0.43690 nearserver.here.com -> 224.0.1.1 IP D=224.0.1.1 S=10.0.0.40 LEN=28, ID=47453, TO =0x0, TTL=1 35 0.00034 10.0.0.40 -> 224.0.1.1 IP D=224.0.1.1 S=10.0.0.40 LEN=28, ID=57376, TOS=0x0, TTL=47
第三方系统(snoop 系统)将检查所有干预通信,因此 snoop 跟踪会反映网络上实际出现的情况。
有关 snoop 捕获文件的详细信息,请参阅 RFC 1761, Snoop Version 2 Packet Capture File Format。
您可以使用 snoop 命令来仅显示 IPv6 包。
# snoop ip6
有关 snoop 命令的更多信息,请参见 snoop(1M) 手册页。
示例 5-17 仅显示 IPv6 网络通信
以下示例显示了在节点上运行 snoop ip6 命令时可能显示的典型输出。
# snoop ip6 fe80::a00:20ff:fecd:4374 -> ff02::1:ffe9:2d27 ICMPv6 Neighbor solicitation fe80::a00:20ff:fee9:2d27 -> fe80::a00:20ff:fecd:4375 ICMPv6 Neighbor solicitation fe80::a00:20ff:fee9:2d27 -> fe80::a00:20ff:fecd:4375 ICMPv6 Neighbor solicitation fe80::a00:20ff:febb:e09 -> ff02::9 RIPng R (11 destinations) fe80::a00:20ff:fee9:2d27 -> ff02::1:ffcd:4375 ICMPv6 Neighbor solicitation
Oracle Solaris 中引入了用于增强 IP 观察功能的 IP 层设备。通过这些设备,可以访问具有与系统网络接口关联的地址的所有包。这些地址包括本地地址以及位于非回送接口或逻辑接口上的地址。可观察的通信流量可以是 IPv4 和 IPv6 地址。因此,可以监视以系统为目标的所有通信流量。通信流量可以是回送 IP 通信流量、来自远程计算机的包、要从系统发送的包或转发的所有通信流量。
使用 IP 层设备,全局区域的管理员可以监视区域之间以及区域内的通信流量。非全局区域的管理员也可以观察由该区域发送和接收的通信流量。
要监视 IP 层上的通信流量,请将一个新选项 -I 添加到 snoop 命令。此选项对该命令指定将使用新 IP 层设备,而不是底层链路层设备以显示通信流量数据。
# ipadm show-if
# snoop -I interface [-V | -v]
所有示例都基于下列系统配置:
# ipadm show-addr ADDROBJ TYPE STATE ADDR lo0/v4 static ok 127.0.0.1/8 net0/v4 static ok 192.68.25.5/24 lo0/? static ok 127.0.0.1/8 net0/? static ok 172.0.0.3/24 net0/? static ok 172.0.0.1/24 lo0/? static ok 127.0.0.1/8
假设两个区域 sandbox 和 toybox 使用以下 IP 地址:
sandbox-172.0.0.3
toybox-172.0.0.1
您可以对系统上的不同接口发出 snoop -I 命令。显示的包信息取决于您是全局区域的管理员还是非全局区域的管理员。
示例 5-18 回送接口上的通信流量
# snoop -I lo0 Using device ipnet/lo0 (promiscuous mode) localhost -> localhost ICMP Echo request (ID: 5550 Sequence number: 0) localhost -> localhost ICMP Echo reply (ID: 5550 Sequence number: 0)
要生成详细输出,请使用 -v 选项。
# snoop -v -I lo0 Using device ipnet/lo0 (promiscuous mode) IPNET: ----- IPNET Header ----- IPNET: IPNET: Packet 1 arrived at 10:40:33.68506 IPNET: Packet size = 108 bytes IPNET: dli_version = 1 IPNET: dli_type = 4 IPNET: dli_srczone = 0 IPNET: dli_dstzone = 0 IPNET: IP: ----- IP Header ----- IP: IP: Version = 4 IP: Header length = 20 bytes ...
为了支持观察 IP 层上的包,引入了优先于要观察的包的新 ipnet 数据包头。将同时指示源和目标 ID。ID 为“0”指示将从全局区域生成通信流量。
示例 5-19 本地区域的 net0 设备中的包流
# snoop -I net0 Using device ipnet/net0 (promiscuous mode) toybox -> sandbox TCP D=22 S=62117 Syn Seq=195630514 Len=0 Win=49152 Options=<mss sandbox -> toybox TCP D=62117 S=22 Syn Ack=195630515 Seq=195794440 Len=0 Win=49152 toybox -> sandbox TCP D=22 S=62117 Ack=195794441 Seq=195630515 Len=0 Win=49152 sandbox -> toybox TCP D=62117 S=22 Push Ack=195630515 Seq=195794441 Len=20 Win=491
该输出显示了系统内不同区域中发生的通信。您可以查看与 net0 IP 地址关联的所有包,包括从本地传递到其他区域的包。如果生成详细输出,则可以查看包流中涉及的区域。
# snoop -I net0 -v port 22 IPNET: ----- IPNET Header ----- IPNET: IPNET: Packet 5 arrived at 15:16:50.85262 IPNET: Packet size = 64 bytes IPNET: dli_version = 1 IPNET: dli_type = 0 IPNET: dli_srczone = 0 IPNET: dli_dstzone = 1 IPNET: IP: ----- IP Header ----- IP: IP: Version = 4 IP: Header length = 20 bytes IP: Type of service = 0x00 IP: xxx. .... = 0 (precedence) IP: ...0 .... = normal delay IP: .... 0... = normal throughput IP: .... .0.. = normal reliability IP: .... ..0. = not ECN capable transport IP: .... ...0 = no ECN congestion experienced IP: Total length = 40 bytes IP: Identification = 22629 IP: Flags = 0x4 IP: .1.. .... = do not fragment IP: ..0. .... = last fragment IP: Fragment offset = 0 bytes IP: Time to live = 64 seconds/hops IP: Protocol = 6 (TCP) IP: Header checksum = 0000 IP: Source address = 172.0.0.1, 172.0.0.1 IP: Destination address = 172.0.0.3, 172.0.0.3 IP: No options IP: TCP: ----- TCP Header ----- TCP: TCP: Source port = 46919 TCP: Destination port = 22 TCP: Sequence number = 3295338550 TCP: Acknowledgement number = 3295417957 TCP: Data offset = 20 bytes TCP: Flags = 0x10 TCP: 0... .... = No ECN congestion window reduced TCP: .0.. .... = No ECN echo TCP: ..0. .... = No urgent pointer TCP: ...1 .... = Acknowledgement TCP .... 0... = No push TCP .... .0.. = No reset TCP: .... ..0. = No Syn TCP: .... ...0 = No Fin TCP: Window = 49152 TCP: Checksum = 0x0014 TCP: Urgent pointer = 0 TCP: No options TCP:
ipnet 数据包头指示该包是从全局区域 (ID 0) 发送至沙箱 (ID 1) 的。
示例 5-20 通过标识区域观察通信流量
# snoop -I hme0 sandboxsnoop -I net0 sandbox Using device ipnet/hme0 (promiscuous mode) toybox -> sandbox TCP D=22 S=61658 Syn Seq=374055417 Len=0 Win=49152 Options=<mss sandbox -> toybox TCP D=61658 S=22 Syn Ack=374055418 Seq=374124525 Len=0 Win=49152 toybox -> sandbox TCP D=22 S=61658 Ack=374124526 Seq=374055418 Len=0 Win=49152 #
通过标识区域来观察包的功能在具有多个区域的系统中非常有用。当前,只能使用区域 ID 标识区域。不支持将 snoop 与区域名称一起使用。