IP 層の可観測性を高めるため、IP 層デバイスが Oracle Solaris に導入されています。これらのデバイスを使用すると、システムのネットワークインタフェースに関連付けられたアドレスを持つすべてのパケットにアクセスできます。アドレスには、ローカルアドレスのほか、非ループバックインタフェースまたは論理インタフェースにホストされたアドレスも含まれます。監視可能なトラフィックには、IPv4、IPv6 のどちらのアドレスが含まれていてもかまいません。したがって、システムに向かうすべてのトラフィックをモニターできます。トラフィックには、ループバック IP トラフィック、リモートマシンからのパケット、システムから送信されるパケット、またはすべての転送トラフィックが含まれる場合があります。
Oracle Solaris の大域ゾーンの管理者は 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 dhcp ok 10.153.123.225/24 lo0/v6 static ok ::1/128 net0/v6 addrconf ok fe80::214:4fff:2731:b1a9/10 net0/v6 addrconf ok 2001:0db8:212:60bb:214:4fff:2731:b1a9/64 net0/v6 addrconf ok 2001:0db8:56::214:4fff:2731:b1a9/64
2 つのゾーン sandbox と toybox が次の IP アドレスを使用しているとします。
sandbox – 172.0.0.3
toybox – 172.0.0.1
snoop –I コマンドは、システム上のさまざまなインタフェースに対して使用できます。表示されるパケット情報は、ユーザーが大域ゾーン、非大域ゾーンのいずれの管理者であるかに依存します。
使用例 10 ループバックインタフェース上のトラフィックの監視次に、ループバックインタフェースに対する netstat コマンドの出力例を示します。
# 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 の両方が示されます。ID が 0 の場合は、トラフィックが大域ゾーンから生成されていることを示します。
使用例 11 ローカルゾーン内の net0 デバイスにおけるパケットフローの監視次の例は、システム内の異なるゾーン内で発生したトラフィックを示しています。ローカルでほかのゾーンに配信されるパケットも含め、net0 の IP アドレスに関連するすべてのパケットを表示できます。詳細出力を生成すれば、パケットのフローに関連するゾーンを確認することもできます。
# 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
# 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) に送信されていることを示しています。
使用例 12 ゾーンを特定したネットワークトラフィックの監視次の例は、ゾーンを特定してネットワークトラフィックを監視する方法 (複数のゾーンを持つシステムにはきわめて有用) を示しています。現在のところ、ゾーンを特定するには、ゾーン ID を使用するしかありません。ゾーン名を指定して snoop コマンドを使用することはできません。
# 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