ナビゲーションリンクをスキップ | |
印刷ビューの終了 | |
![]() |
Oracle Solaris 11.1 ネットワークの構成と管理 Oracle Solaris 11.1 Information Library (日本語) |
snoop コマンドを使用すると、データ転送の状態を監視できます。snoop コマンドは、ネットワークパケットを取り込んで、その内容を指定された書式で表示します。取得したパケットについては、そのまま表示することも、ファイルに保存することも可能です。snoop が中間ファイルに書き込む場合、トレースのビジー状態でパケットロスはほとんど発生しません。そのあと、snoop 自体はファイルの解釈に使用されます。
デフォルトのインタフェースにおいて、パケットをプロミスキュアスモードで取り込むには、ネットワーク管理者役割になるか、スーパーユーザーになる必要があります。サマリー形式では、snoop は最高レベルのプロトコルに関連するデータだけを表示します。たとえば NFS パケットでは、NFS 情報のみが表示されます。RPC、UDP、IP、および Ethernet のフレーム情報は抑止されますが、verbose (詳細表示) オプションのいずれかを選択してあれば表示できます。
頻繁かつ定期的に 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 パケットや、IPv6 リンクローカルアドレスから in.ripngd への通知も含まれます。
# snoop -o filename
次に例を示します。
# snoop -o /tmp/cap Using device /dev/eri (promiscuous mode) 30 snoop: 30 packets captured
この例では、30 個のパケットが /tmp/cap というファイルに取り込まれています。ディスク容量が十分にあれば、ファイルはどのディレクトリにでも格納できます。取り込んだパケットの数はコマンド行に表示され、Ctrl-C を押せばいつでも終了できます。
snoop 自体によってホストマシン上にネットワーク負荷がかかるので、結果に誤差が生じる場合があります。実際の結果を表示するには、第 3 のシステムから 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
この第 3 のシステム (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
IP の監視機能を強化するため、IP 層デバイスが Oracle Solaris に導入されています。これらのデバイスは、システムのネットワークインタフェースに関連付けられたアドレスを含むすべてのパケットにアクセスできます。アドレスには、ローカルアドレスのほか、非ループバックインタフェースまたは論理インタフェースにホストされたアドレスも含まれます。監視可能なトラフィックには、IPv4、IPv6 のどちらのアドレスが含まれていてもかまいません。したがって、システムに向かうすべてのトラフィックを監視できます。トラフィックには、ループバック IP トラフィック、リモートマシンからのパケット、システムから送信されるパケット、またはすべての転送トラフィックが含まれる場合があります。
大域ゾーンの管理者は IP 層デバイスを使用することで、ゾーン間のトラフィックやゾーン内のトラフィックを監視できます。非大域ゾーンの管理者も、そのゾーンによって送受信されるトラフィックを監視できます。
IP 層でトラフィックを監視するために、snoop コマンドに新しいオプション -I が追加されています。このオプションは、コマンドが、ベースとなるリンク層デバイスではなく新しい 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
2 つのゾーン 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」の ID は、トラフィックが大域ゾーンから生成されていることを示します。
例 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) から Sandbox (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 の使用はサポートされていません。