语法
带有最常用选项的 snoop 命令的语法是:
# /usr/sbin/snoop -qr -d [device] -o [filename] -s 300
-q --> don't show packet count when capturing packets into file. (Improves the packet capturing performance) -r --> Do not resolve IP to hostname (prevents snoop from generating its own traffic) -d device --> Interface used to run the snoop command on -o filename --> Save the captured packets in the file -s num --> truncate each packet after num bytes
示例 1:
要在接口 ce0 上捕获数据包并将其保存到文件 ce0_snoop.out 中,请使用:
# /usr/sbin/snoop -qr -d ce0 -o ce0_snoop.out -s 300
示例 2:验证文件是否由 snoop 命令生成
要确保文件是由 snoop 命令生成的:
# file snoop.out snoop.out: Snoop capture file - version 2
示例 3:从 snoop 文件中读取
从已经生成的 snoop 文件中读取:
# snoop -i [filename]
示例 4:侦听特定端口
要仅在特定端口 (8080) 上查找流量详细信息:
# /usr/sbin/snoop -qr -d ce0 -o ce0_snoop.out -s 300 port 8080
示例 5:侦听特定 IP
仅在特定 IP (192.168.1.20) 上查找流量详细信息:
# /usr/sbin/snoop -qr -d ce0 -o ce0_snoop.out -s 300 192.168.1.1
其中:我们还可以使用逗号分隔的 IP 来查找为这些 IP 生成的流量(发往或者发件人)。
示例 6:在 2 个 IP 之间进行窥探
要查找 IP 之间的流量详细信息:
# snoop -i [filename] [IP-address1] [IP-address2]
示例 7:监听特定协议
要查找仅与特定协议相关的流量详细信息,例如 ICMP、ARP:
# /usr/sbin/snoop -qr -d ce0 -o ce0_snoop.out icmp,arp
其中:它实际上显示了 IPMP 协议的数据包,因为 IPMP 反过来使用 ICMP 和 ARP 协议来实现其功能。
示例 8:检查进行窥探的时间
要检查数据包 9 到 13 的使用时间:
# snoop -i snoop.out -ta -p9,13 Loading name file snoop.out.names 9 18:10:54.71861 webcache -> mizue HTTP (proxy) R port=41579 10 18:10:55.03142 webcache -> mizue HTTP HTTP/1.1 200 OK 11 18:10:55.03168 mizue -> webcache HTTP (proxy) C port=41579 12 18:10:56.37426 webcache -> mizue HTTP (body) 13 18:10:56.47427 mizue -> webcache HTTP (proxy) C port=41579
示例 9:如何查看 FTP 数据传输的总时间
在 snoop 命令中使用 -tr 和端口 20 作为过滤器来找出 FTP 数据传输所用的总时间。
# snoop -i ftp.snoop -tr port 20 | tail -1 1393 1.52899 129.158.x.x -> 129.158.x.x FTP-DATA C port=32841
==> 1.52899 秒
示例 10:查看数据包的内容
要查看特定数据包(数据包编号 4)的内容:
# snoop -i snoop.out -p4 -x0 4 0.00377 HostA -> HostB HTTP GET http://patchpro.sun.com/expert/pprodetectors.jar HTTP/1.1 0: 0008 a4d2 5e40 0800 20a0 166a 0800 4500 ....^@.. ..j..E. 16: 00f9 dc05 4000 4006 b0be 0a0e 025f 819e ...@.@......_.. 32: 1f30 8063 1f90 12ed 2f71 0a9d 493a 5018 .0.c..../q..I:P. 48: c1e8 d859 0000 4745 5420 6874 7470 3a2f ...Y..GET http:/ 64: 2f70 6174 6368 7072 6f2e 7375 6e2e 636f /patchpro.sun.co 80: 6d2f 6578 7065 7274 2f70 7072 6f64 6574 m/expert/pprodet 96: 6563 746f 7273 2e6a 6172 2048 5454 502f ectors.jar HTTP/ 112: 312e 310d 0a55 7365 722d 4167 656e 743a 1.1..User-Agent: 128: 204a 6176 612f 312e 342e 315f 3031 610d Java/1.4.1_01a. 144: 0a48 6f73 743a 2070 6174 6368 7072 6f2e .Host: patchpro. 160: 7375 6e2e 636f 6d0d 0a41 6363 6570 743a sun.com..Accept:
示例 11:通过侦听对 Jumpstart 进行故障排除
Snoop 可以很好地用于解决快速启动问题。
在 Jumpstart 的情况下,我们可以使用 MAC 地址作为过滤器:
# snoop -i [filename] xx:xx:xx:xx:xx:xx
示例 12:检查 snoop 是否丢弃数据包
有时 snoop 命令本身会丢弃数据包(主要是在千兆网络的情况下)。
要找出丢弃的数据包,请使用 -D 标志:
# snoop -i snoop.out -D | grep TCP Loading name file snoop.out 7865 0.00000 aaa -> bbb drops: 0 TCP D=35215 S=20 Ack=2442259384 Seq=3714484080 Len=1460 Win=16060 7866 0.00012 aaa -> bbb drops: 0 TCP D=35215 S=20 Ack=2442259384 Seq=3714485540 Len=1460 Win=16060 7867 0.00013 aaa -> bbb drops: 0 TCP D=35215 S=20 Ack=2442259384 Seq=3714487000 Len=1460 Win=16060 7868 0.00015 bbb -> aaa drops: 0 TCP D=20 S=35215 Ack=3714484080 Seq=2442259384 Len=0 Win=33580 7869 0.00049 aaa -> bbb drops: 0 TCP D=35215 S=20 Ack=2442259384 Seq=3714488460 Len=1460 Win=16060
示例 13:将特定数据包从 snoop 文件提取到另一个 snoop 文件
如果我们一起使用 -i 和 -o 选项,我们可以从 snoop 文件中提取特定数据包并将其保存到另一个 snoop 文件中:
# snoop -i snoop.out -o snoop.telnet.out port 23
示例 14:查看协议信息
使用选项“-v”或者“-V”和snoop来找出协议信息。
# snoop -i nfs.snoop -p23 -V Loading name file nfs.snoop.names ________________________________ 23 0.00000 HostA -> HostB ETHER Type=0800 (IP), size = 206 bytes 23 0.00000 HostA -> HostB IP D=192.168.x.x S=192.168.55.106 LEN=192, ID=45661, TOS=0x0, TTL=64 23 0.00000 HostA -> HostB TCP D=2049 S=698 Push Ack=390460868 Seq=222184947 Len=152 Win=24820 23 0.00000 HostA -> HostB RPC C XID=1096378150 PROG=100003 (NFS) VERS=3 PROC=19 23 0.00000 HostA -> HostB NFS C FSINFO3 FH=0222
# snoop -i nfs.snoop -p23 -v Loading name file nfs.snoop.names ETHER: ----- Ether Header ---- ETHER: ETHER: Packet 23 arrived at 23:35:7.36 ETHER: Packet size = 206 bytes ETHER: Destination = 0:0:c:7:ac:27, Cisco ETHER: Source = 8:0:20:b5:fa:8, Sun ETHER: Ethertype = 0800 (IP) ETHER: 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 = 192 bytes IP: Identification = 45661 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 = 2175 IP: Source address = 192.168.x.x, HostA IP: Destination address = 192.168.x.x, HostB IP: No options IP: [output truncated for brevity]
示例 15:检查特定的 ping 数据包
ping(ICMP Echo reply) 数据包具有“ID”号,我们可以通过“ID”号进行过滤。
# snoop -i snoop.out "icmp[4:2] = 16005" 172 0.66838 10.20.220.120 -> 10.20.220.121 ICMP Echo request (ID: 16005 Sequence number: 0) 173 0.00021 10.20.220.121 -> 10.20.220.120 ICMP Echo reply (ID: 16005 Sequence number: 0)
snoop 命令可以非常方便地监控网络流量,以解决任何网络相关问题,如数据包丢失、高网络延迟等。
可以运行 Snoop 命令查看实时网络流量,也可以将其保存到文件中进行查看晚些时候。
注意:- 如果系统是“共享IP 区域”,那么我们需要在全局区域的物理接口上进行监听。
如果系统是“exclusive-IP zone”,那么你需要对非全局区域进行snoop。
如果正在使用“链路聚合”,我们应该在“链路聚合”接口 (aggr1) 上获得监听。
如果需要,我们也可以在每个物理接口上单独获取侦听。如果使用“VLAN”接口,则应在“VLAN”接口上获取侦听。
traceroute 到目的IP,找出源主机上需要监听的接口。