名前 | 形式 | 機能説明 | オプション | オペランド | 使用例 | 終了ステータス | ファイル | 属性 | 関連項目 | 警告
snoop [-aqrCDNPSvV] [-t [r | a | d]] [-c maxcount] [-d device] [-i filename] [-n filename] [-o filename] [-p first [, last]] [-s snaplen] [-x offset [, length]] [expression]
snoop はネットワークからのパケットを取得し、その内容を表示します。snoop は、ネットワークパケットフィルタとストリームバッファーモジュールの両方を使用して、効率的にネットワークからパケットを取得します。取得したパケットは、受信した順に表示することも、あとで検査するためファイル (RFC 1761 準拠) に保存することもできます。
snoop は、パケットを単一行の要約形式または詳細な複数行形式で表示できます。要約形式では、もっとも高いレベルのプロトコルに関連したデータのみが表示されます。たとえば、NFS パケットには NFS 情報だけが表示されます。RPC、UDP、IP、および Ethernet のフレーム情報は抑止されますが、verbose (詳細表示) オプションのいずれかを選択してあれば表示できます。
LDAP または NIS などのネームサービスがない場合、snoop は数値 IP アドレスとしてホスト名を表示します。
snoop には、対話型のインタフェースが必要です。
カーネルのパケットフィルタまたは snoop 独自のフィルタのいずれかに対するフィルタ式から生成されたコードをリスト表示します。
要約行の取得中にドロップしたパケットの数を表示します。
取得したファイルから IP アドレスと名前の対照ファイルを作成します。これは、取得したファイルの名前と -i オプションとともに設定する必要があります。アドレスと名前の対照ファイル名は、取得ファイル名に .names を付加したものです。このファイルは、取得するサイトで IP アドレスからホスト名へのマッピングを記録し、取得したファイルの可搬性を高めます。取得ファイルをどこか別の場所で分析する場合には、.names ファイルを生成します。このフラグが使用されたときは、パケットは表示されません。
プロミスキュアスでないモードでパケットを取得します。ブロードキャスト、マルチキャスト、またはホストマシン宛に送られたパケットだけが見えます。
要約行のリンクレイヤーフレーム全体のサイズをバイト単位で表示します。
詳細要約モードです。冗長度の程度では、要約モードと詳細モードの中間です。パケット内のもっとも高いレベルのプロトコルの要約行だけを表示する代わりに、パケット内のそれぞれのプロトコルレイヤーの要約行を表示します。たとえば、NFS パケットでは ETHER、IP、UDP、RPC および NFS レイヤーそれぞれに対して 1 行表示します。詳細要約モードは grep を介してパイプすることで、容易に必要とするパケットを抽出できます。たとえば、RPC 要約行だけを表示するには、次のように入力します。example# snoop -i rpc.cap -V | grep RPC
パケットを /dev/audio で聴きます (警告: うるさいかもしれません)。
maxcount パケットを取得したあとに終了します。指定しない場合は、残りのディスク容量がなくなるまで、または Control + C で割り込むまで取得し続けます。
たとえば eri0 または hme0 のように、device で指定したインタフェースを使用してネットワークからのパケットを受信します。プログラム netstat(1M) は -i フラグ付きで呼び出されると、マシンにあるすべてのインタフェースを一覧表示します。通常 snoop は、最初に検出したループバックしないインタフェースを自動的に選択します。
以前 filename で取得したパケットを表示します。このオプションを指定しない場合、snoop はネットワークインタフェースからパケットを読み取ります。filename .names ファイルが存在する場合、ファイルは自動的に snoop IP アドレスと名前のマッピングテーブル (-N フラグを参照) にロードされます。
filename を IP アドレスと名前のマッピングテーブルとして使用します。このファイルは /etc/hosts ファイル (IP アドレスの次にホスト名) の形式と同じである必要があります。
取得したパケットを、取得したとおりに filename に保存します。(この filename を「取得ファイル」と呼びます。)取得ファイルの形式は、RFC 1761 に準拠しています。パケットの取得中、ファイルに保存されたパケット数のカウントが表示されます。ファイルに保存せずにパケットのカウントだけを行う場合は、ファイル名を /dev/null とします。
取得ファイルから、表示するパケットを 1 つ以上選択します。ファイルの最初の first パケットの番号は 1 です。
ネットワークパケットをファイルに取得するとき、パケットのカウントを表示しません。これにより、パケット取得のパフォーマンスが向上します。
IP アドレスを記号名に解決しません。これにより、snoop がパケットを取得および表示している間に、ネットワークトラフィックが生じなくなります。ただし、-n オプションが使用されている、およびアドレスがマッピングファイルに存在する場合には、対応する名前が使用されます。
各パケットの snaplen バイトより後ろを切り捨てます。通常はパケット全体が取得されます。このオプションは、特定のパケットヘッダー情報だけが必要な場合に便利です。パケットの切リ捨てはカーネル内で行われるため、ストリームパケットバッファーを効率的に利用できます。これにより、トラフィックが過多の期間中のバッファーオーバーフローによってパケットがドロップされる可能性が減ります。また、大量のトレースを取得ファイルに取得するときにディスク容量を節約できます。IP ヘッダーのみ (オプションなし) を取得するには、34 の snaplen を使用します。UDP では 42、TCP では 54 を使用します。RPC ヘッダーは 80 バイトの snaplen で取得できます。NFS ヘッダーは 120 バイトで取得できます。
タイムスタンプの表示。タイムスタンプの精度は 4 マイクロ秒以内です。デフォルトでは、- d (デルタ) 形式 (以前のパケットを受信してからの時間) で時間が表示されます。オプション -a (絶対的) では、時計時刻になります。オプション -r (相対的) では、最初のパケットを表示した時間からの相対的な時間になります。これを -p オプションとともに使用すると、任意に選択したパケットに対する相対的な時間を表示できます。
詳細表示 (Verbose) モードです。パケットヘッダーを数多くの詳細付きで表示します。この表示方式では 1 つのパケットについて多くの行を消費するため、選択したパケットに対してのみ使用するべきです。
パケットデータを 16 進数および ASCII 形式で表示します。offset 値および length 値は、表示されるパケットの一部を選択します。パケット全体を表示するには、offset の 0 の値を使用します。length 値を指定しない場合、パケットの残りの部分が表示されます。
パケットをネットワーク、または取得ファイルのいずれかから選択します。式が true となるパケットのみ選択されます。式が指定されない場合は、真であるとみなされます。
フィルタ式を指定した場合、snoop はカーネルパケットフィルタ、またはそれ自体の内部フィルタのためのコードを生成します。ネットワークインタフェースでパケットを取得する場合、カーネルパケットフィルタ用のコードが生成されます。このフィルタは、バッファーモジュールの上位であるストリームモジュールとして実装されます。バッファーモジュールはいっぱいになるまでパケットを蓄積し、snoop に渡します。カーネルパケットフィルタは、カーネル内の不要なパケットをパケットバッファーまたは snoop に到達する前に拒否するので、非常に効率的です。カーネルパケットフィルタは、その実装に関していくつかの制限があります。カーネルが処理できないフィルタ式を作成することが可能です。この場合、snoop はフィルタの分割を試み、カーネルで可能な限りのフィルタリングを試みます。残りのフィルタリングは、snoop 用のパケットフィルタによって行われます。-C フラグを使用して、カーネル用のパケットフィルタまたは snoop 用のパケットフィルタのいずれかに生成されたコードを表示できます。パケットが -i オプションを使用して取得ファイルから読み込まれた場合、snoop 用のパケットフィルタのみ使用されます。
フィルタの expression は、1 つまたは複数のブール型プリミティブで構成されます。複数のプリミティブは、ブール型演算子 (AND、OR、および NOT) で組み合わせることができます。ブール型演算子の通常の優先順位規則が適用されます。これらの演算子の評価の順序は、括弧で制御することができます。シェルは括弧およびほかのフィルタ式の文字を認識するため、多くの場合フィルタ式を引用符で囲む必要があります。より効率的なフィルタの設定についての情報は、例 2 を参照してください。
プリミティブに含まれるのは次のとおりです。
発信元アドレスまたは着信先アドレスが hostname と同じ場合に true になります。 hostname 引数は、アドレス表記でもかまいません。名前がほかの式のプリミティブの名前と競合しない場合は、キーワード host を省略できます。たとえば、「pinky」では、ホスト pinky が着信先または発信元であるパケットが選択され、「pinky and dinky」では、2 つのホスト pinky と dinky との間で交換されるパケットが選択されます。
使用されるアドレスのタイプは、host プリミティブに先行するプリミティブに依存します。使用可能な修飾子は、"inet"、"inet6"、"ether"、または修飾子なしです。以降ではこれら 3 つのプリミティブについて説明します。プリミティブが 1 つもない状態は、「inet host hostname or inet6 host hostname」と同等です。つまり、snoop はホスト名と関連付けられた IP アドレスをすべてフィルタリングしようとします。
host プリミティブを変更する修飾子は、次のとおりです。inet の場合、snoop は名前の検索によって返された IPv4 アドレスすべてをフィルタリングしようとします。inet6 の場合、snoop は名前の検索によって返された IPv6 アドレスすべてをフィルタリングしようとします。
アドレス表記、IP ドット式、AppleTalk ドット式、および Ethernet コロンが認識されます。たとえば、
「172.16.40.13」は、その IP のすべてのパケットに一致します。
「2::9255:a00:20ff:fe73:6e35」は、発信元または着信先としてこの IPv6 アドレスを持つすべてのパケットに一致します。
「65281.13」は、その AppleTalk アドレスのすべてのパケットに一致します。
「8:0:20:f:b1:51」は、発信元または着信先として Ethernet アドレスのすべてのパケットに一致します。
文字で始まる Ethernet アドレスは、ホスト名であると解釈されます。これを避けるため、アドレスを指定する場合は最初にゼロをつけます。たとえば、Ethernet アドレスが「aa:0:45:23:52:44」の場合、最初に 0 を追加して「0aa:0:45:23:52:44 」のように指定します。
発信元アドレス、ポート、または RPC 応答にのみ一致する、後に続く host、net、ipaddr、atalkaddr、etheraddr、port または rpc プリミティブを変更する修飾子。
着信先アドレス、ポート、または RPC 呼び出しにのみ一致する、後に続く host、net、ipaddr、atalkaddr、etheraddr、port または rpc プリミティブを変更する修飾子。
名前を Ethernet アドレスに解決する、後に続く host プリミティブを変更する修飾子。通常、IP アドレスのマッチングが行われます。このオプションは、IPoIB (IP over InfiniBand) などのメディアではサポートされていません。
Ethernet タイプフィールドに値 number がある場合は true になります。「ether[12:2] = number」と同等です。
パケットが適切な ethertype の場合に true になります。
パケットの ethertype が pppoed または pppoes のいずれかの場合に true になります。
パケットがブロードキャストパケットの場合に true になります。Ethernet の「ether[2:4] = 0xffffffff 」と同等です。このオプションは、IPoIB (IP over InfiniBand) などのメディアではサポートされていません。
パケットがマルチキャストパケットの場合に true になります。Ethernet の「ether[0] & 1 = 1」と同等です。このオプションは、IPoIB (IP over InfiniBand) などのメディアではサポートされていません。
パケットが、BOOTPS (67) の発信元ポートおよび BOOTPC (68) の着信先ポート、または BOOTPC (68) の発信元ポートおよび BOOTPS (67) の着信先ポートのいずれかで断片化されていない UDP パケットの場合に true になります。
パケットが Apple Ethertalk パケットの場合に true になります。「ethertype 0x809b or ethertype 0x80f3」と同等です。
パケットが DECNET パケットの場合に true になります。
パケットが length よりも長い場合に true になります。
パケットが length よりも短い場合に true になります。
IP または IPv6 プロトコルが適切なタイプの場合に true になります。
IP 発信元アドレスまたは着信先アドレスのいずれかが net のネットワーク番号を持つ場合に true になります。from または to 修飾子を使用して、発信元アドレスまたは着信先アドレスの一方で当該ネットワーク番号が使われているパケットを選択することもできます。
発信元ポートまたは着信先ポートが port の場合に true になります。port は /etc/services からのポート番号または名前のいずれかです。 tcp または udp プリミティブを使用して、TCP または UDP ポートだけを選択することもできます。from または to 識別子を使用して、発信元または着信先としてだけ port が発生しているパケットを選択することもできます。
パケットが prog によって識別されるプロトコルの RPC 呼び出しまたは応答パケットである場合に true になります。prog は、/etc/rpc からの RPC プロトコルの名前またはプログラム番号のいずれかです。vers および proc を使用すると、プログラム version および procedure 番号をさらに修飾できます。たとえば、「rpc nfs,2,0」は NFS NULL 手続きのすべての呼び出しおよび応答を選択します。to または from 修飾子を使用すると、呼び出しパケットまたは応答パケットだけのいずれかを選択します。
パケットがポート 389 上の LDAP パケットの場合に true になります。
パケットが host をゲートウェイとして使用した場合、つまり Ethernet 発信元アドレスまたは着信先アドレスが host であって IP アドレスではない場合に true になります。「ether host host and not host host」と同等です。
パケットが断片化されていない、または一連の IP フラグメントの最初である場合に true になります。「ip[6:2] & 0x1fff = 0」と同等です。
relop が >、<、>=、<=、 =、!= のうちの 1 つであり、expr が数字、パケットフィールドセレクタ、length プリミティブ、および算術演算子 +、 -、 *、&、 |、 ^、および % からなる演算式である関係が成立する場合に true になります。expr 内の算術演算子は関係演算子の前に評価され、算術演算子間では加算の前に乗算などの通常の優先順位規則が適用されます。括弧を使用して評価の順序を制御することもできます。パケット内のフィールドの値を使用するには、次の構文を使用します。
base[expr [: size ] ] |
ここで expr は、ether、ip、ip6、udp、tcp、または icmp のいずれかである base オフセットからのパケットを、オフセットの値で評価します。size 値は、フィールドのサイズを指定します。指定しない場合は 1 とみなされます。その他の正当な値は、2 および 4 です。たとえば、
ether[0] & 1 = 1
は multicast と同等、
ether[2:4] = 0xffffffff
は broadcast と同等です。
ip[ip[0] & 0xf * 4 : 2] = 2049
は udp[0:2] = 2049 と同等、
ip[0] & 0xf > 5
はオプション付きの IP パケットを選択します。
ip[6:2] & 0x1fff = 0
は IP フラグメントを除去します。
udp and ip[6:2]&0x1fff = 0 and udp[6:2] != 0
UDP チェックサムを持つすべてのパケットを検索します。
length プリミティブを使用して、パケットの長さを取得することもできます。たとえば、「length > 60 」は「greater 60 」と同等であり、「ether[length - 1]」はパケットの最後のバイトを取得します。
2 つのブール型値の間の論理 AND 演算を実行します。2 つのブール型式を並べた場合は AND 演算を行うものとみなされます。たとえば「dinky pinky」は「dinky AND pinky」と同等です。
2 つのブール型値の間の論理 OR 演算を実行します。代わりにコンマを使用することもでき、たとえば「dinky,pinky」は「dinky OR pinky」と同じです。
後続のブール型値で論理 NOT 演算を実行します。この演算子は、AND または OR の前に評価されます。
パケットが SLP パケットの場合に true になります。
パケットが SCTP パケットの場合に true になります。
パケットが OSPF パケットの場合に true になります。
すべてのパケットを取得し、パケットを受信した順に表示します。
example# snoop |
ホスト funky が発信元または着信先であるパケットを取得し、受信した順に表示します。
example# snoop funky |
funky および pinky の間のパケットを取得し、ファイルに保存します。その後、最初に取得したパケットからの相対的な時間 (秒単位) を使用して、パケットを検査します。
example# snoop -o cap funky pinky example# snoop -i cap -t r | more |
別の取得ファイル内の選択したパケットを表示します。
example# snoop -i pkts -p 99,108 99 0.0027 boutique -> sunroof NFS C GETATTR FH=8E6 100 0.0046 sunroof -> boutique NFS R GETATTR OK 101 0.0080 boutique -> sunroof NFS C RENAME FH=8E6C MTra00192 to .nfs08 102 0.0102 marmot -> viper NFS C LOOKUP FH=561E screen.r.13.i386 103 0.0072 viper -> marmot NFS R LOOKUP No such file or directory 104 0.0085 bugbomb -> sunroof RLOGIN C PORT=1023 h 105 0.0005 kandinsky -> sparky RSTAT C Get Statistics 106 0.0004 beeblebrox -> sunroof NFS C GETATTR FH=0307 107 0.0021 sparky -> kandinsky RSTAT R 108 0.0073 office -> jeremiah NFS C READ FH=2584 at 40960 for 8192 |
パケット 101 をさらに詳細表示します。
example# snoop -i pkts -v -p101 ETHER: ----- Ether Header ----- ETHER: ETHER: Packet 101 arrived at 16:09:53.59 ETHER: Packet size = 210 bytes ETHER: Destination = 8:0:20:1:3d:94, Sun ETHER: Source = 8:0:69:1:5f:e, Silicon Graphics ETHER: Ethertype = 0800 (IP) ETHER: IP: ----- IP Header ----- IP: IP: Version = 4, header length = 20 bytes IP: Type of service = 00 IP: ..0. .... = routine IP: ...0 .... = normal delay IP: .... 0... = normal throughput IP: .... .0.. = normal reliability IP: Total length = 196 bytes IP: Identification 19846 IP: Flags = 0X IP: .0.. .... = may fragment IP: ..0. .... = more fragments IP: Fragment offset = 0 bytes IP: Time to live = 255 seconds/hops IP: Protocol = 17 (UDP) IP: Header checksum = 18DC IP: Source address = 172.16.40.222, boutique IP: Destination address = 172.16.40.200, sunroof IP: UDP: ----- UDP Header ----- UDP: UDP: Source port = 1023 UDP: Destination port = 2049 (Sun RPC) UDP: Length = 176 UDP: Checksum = 0 UDP: RPC: ----- SUN RPC Header ----- RPC: RPC: Transaction id = 665905 RPC: Type = 0 (Call) RPC: RPC version = 2 RPC: Program = 100003 (NFS), version = 2, procedure = 1 RPC: Credentials: Flavor = 1 (Unix), len = 32 bytes RPC: Time = 06-Mar-90 07:26:58 RPC: Hostname = boutique RPC: Uid = 0, Gid = 1 RPC: Groups = 1 RPC: Verifier : Flavor = 0 (None), len = 0 bytes RPC: NFS: ----- SUN NFS ----- NFS: NFS: Proc = 11 (Rename) NFS: File handle = 000016430000000100080000305A1C47 NFS: 597A0000000800002046314AFC450000 NFS: File name = MTra00192 NFS: File handle = 000016430000000100080000305A1C47 NFS: 597A0000000800002046314AFC450000 NFS: File name = .nfs08 NFS: |
sunroof と boutique の間の NFS パケットだけを表示するには、次のように入力します。
example# snoop -i pkts rpc nfs and sunroof and boutique 1 0.0000 boutique -> sunroof NFS C GETATTR FH=8E6C 2 0.0046 sunroof -> boutique NFS R GETATTR OK 3 0.0080 boutique -> sunroof NFS C RENAME FH=8E6C MTra00192 to .nfs08 |
これらのパケットを新規取得ファイルに保存するには、次のように入力します。
example# snoop -i pkts -o pkts.nfs rpc nfs sunroof boutique |
カプセル化されたパケットを表示するには、カプセル化を示す指示子があります。
example# snoop ip-in-ip sunroof -> boutique ICMP Echo request (1 encap) |
-V をカプセル化されたパケットに使用した場合は、次のようになります。
example# snoop -V ip-in-ip sunroof -> boutique ETHER Type=0800 (IP), size = 118 bytes sunroof -> boutique IP D=172.16.40.222 S=172.16.40.200 LEN=104, ID=27497 sunroof -> boutique IP D=10.1.1.2 S=10.1.1.1 LEN=84, ID=27497 sunroof -> boutique ICMP Echo request |
より効率的なフィルタを設定するには、次に示すフィルタは式の最後の方で使用し、式の最初の部分がカーネルに設定されるようにするべきです。greater、less、port、rpc、nofrag、および relop です。カーネルで設定できないプリミティブを使用する場合、OR が存在するとフィルタリングを分割するのが難しくなります。代わりに、括弧を使用して OR にするべきプリミティブを強制します。
funky と pinky の間のパケットで、port 80 上のタイプが tcp または udp のパケットを取得するには、次のように入力します。
example# snoop funky and pinky and port 80 and tcp or udp |
プリミティブ port はカーネルフィルタによって処理できず、また式には OR も存在するため、OR を式の最後に移動し、tcp と udp の間で括弧を使用して OR を強制すると、より効率的にフィルタリングできます。
example# snoop funky and pinky and (tcp or udp) and port 80 |
システムの主なオーディオデバイスへのシンボリックリンクです。
NULL ファイルです。
ホスト名データベースです。
RPC プログラム番号データベースです。
インターネットサービスとエイリアスです。
次の属性については、attributes(5) を参照してください。
|
属性タイプ |
属性値 |
|---|---|
|
使用条件 |
SUNWrcmdc |
netstat(1M), hosts(4), rpc(4), services(4), attributes(5), audio(7I), bufmod(7M), dlpi(7P), pfmod(7M), tun(7M)
Callaghan, B.、Gilligan, R. 著、『RFC 1761, Snoop Version 2 Packet Capture File Format』、Network Working Group 発行、1995 年 2 月。
リアルタイムにパケットを解釈するための処理オーバーヘッドは非常に高くなります。結果として、ドロップされるパケットの数も多くなる可能性があります。より信頼できる取得を行うために、生のパケットを -o オプションを使用してファイルに出力し、オフラインでパケットを分析してください。
フィルタリングしないパケットの取得は、特に取得したパケットをリアルタイムで解釈する場合、ホストコンピュータに大きな処理負荷がかかります。この処理負荷は、詳細表示オプションが使用されるとさらに増加します。snoop を頻繁に使用するとほかの処理に対してコンピューターリソースが提供されない可能性があるため、本稼働サーバーでは使用しないようにするべきです。snoop を頻繁に使用するのは、専用コンピュータに限定することをお勧めします。
snoop は IP フラグメントを再構成しません。高いレベルのプロトコルの解釈は、最初の IP フラグメントの最後で停止します。
snoop の副作用として、余分のパケットが生成される場合があります。たとえば、IP アドレスをホスト名に変換して表示するために、ネットワークネームサービス (NIS または NIS+) が使用される場合があります。ファイルに取得してあとで表示するようにすると、取得のセッションが完了するまでアドレスから名前のマッピングが延期されます。NFS でマウントされたファイルへの取得によっても余分のパケットが生成されます。
snaplen (-s オプション) に小さな値を設定すると、高いレベルのプロトコルの解釈に必要なヘッダー情報が削除される場合があります。切り取られる正確な値は、使用するネットワークとプロトコルによって異なります。10 Mbps Ethernet 上の UDP を使用する NFS バージョン 2 トラフィックの場合、snaplen を 150 バイト未満に設定しないでください。100 Mbps Ethernet 上の TCP を使用する NFS バージョン 3 トラフィックの場合、snaplen を 250 バイト以上に設定するべきです。
snoop は、RPC 応答を完全に解釈するために、RPC 要求からの情報を必要とします。取得ファイルまたはパケットレンジ内の RPC 応答に先行する要求がない場合、RPC 応答ヘッダーだけが表示されます。
名前 | 形式 | 機能説明 | オプション | オペランド | 使用例 | 終了ステータス | ファイル | 属性 | 関連項目 | 警告