通信の中身まで解析したいならtshark
通信量を把握するだけなら「以前紹介したdstat」が向いています。
このページでは更に細かく通信の内容を知りたいときに利用するtsharkについて解説します。
tsharkは通信の状態をGUIで解析することのできるWiresharkのCUI版です。Wiresharkのようにグラフ化して解析ということはできませんが、コマンドライン上でパケットの詳細な中身を見ることができます。
WiresharkにはWindows版やMac版もあるので興味のある方は以下のリンクからダウンロードしてみてください。利用しているアプリが変な通信をしていないかといった監視をすることができます。
http://sourceforge.net/projects/wireshark/files/
tsharkのインストール
早速Cent OS6にインストールします。
Cent OS公式リポジトリで提供されているのでyumで簡単にインストールできます。
# yum install wireshark (省略) Dependencies Resolved ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: wireshark x86_64 1.8.10-7.el6_5 updates 11 M Installing for dependencies: libpcap x86_64 14:1.4.0-1.20130826git2dbcaa1.el6 base 130 k libsmi x86_64 0.4.8-4.el6 base 2.4 M Transaction Summary ================================================================================ Install 3 Package(s)
簡単ですね。
tsharkの使い方
こちらも普段wiresharkを利用している方なら至って簡単。
オプションの詳細は公式にあるので参照してみてください。
と、これで終わっては解説にならないので、一般的な利用方法を解説します。
「-D」オプションでインターフェイスを調べる
# tshark -D
1. eth0
2. nflog (Linux netfilter log (NFLOG) interface)
3. nfqueue (Linux netfilter queue (NFQUEUE) interface)
4. usbmon1 (USB bus number 1)
5. any (Pseudo-device that captures on all interfaces)
6. lo
eth0が1番であることがわかったのでインターフェイスを指定する「-i」オプションを使ってパケットをキャプチャする
(通信の多いサーバだと大量に表示されるので注意。Ctrl + cで停止します。)
# tshark -i 1
2.420084 198.162.0.1 -> 198.162.0.1 DNS 81 Standard query 0xe2ce A aqwiki.net
2.420782 198.162.0.1 -> 198.162.0.1 DNS 181 Standard query response 0xe2ce A 198.162.0.1
2.423057 101.111.73.127 -> 198.162.0.1 TCP 54 59934 > 22454 [ACK] Seq=1 Ack=6849 Win=63824 Len=0
2.519348 101.111.73.127 -> 198.162.0.1 TCP 150 59934 > 22454 [PSH, ACK] Seq=1 Ack=6849 Win=63824 Len=96
58 packets captured
キャプチャフィルタで表示を限定する
上の表示ではあまりにも表示が多すぎるので目的のパケットを探すだけでも大変です。そこで意図したパケットだけ表示できるようにキャプチャフィルタを利用します。
フィルタは「-f」を付けて利用します。
IPアドレスが101.111.73.127に関するパケットを取得する
# tshark -i 1 -f 'host 101.111.73.127'
port 53に関するパケットを取得する
# tshark -i 1 -f 'port 53'
port 80のtcp通信に関するパケットを取得する
# tshark -i 1 -f 'port 80 and tcp'
www.example.comに関するパケットを取得するが、ポート80のものは取得しない
# tshark -i 1 -f 'host www.example.com and not port 80'
更に詳しいキャプチャフィルタについては公式のキャプチャフィルタのページを参照してください。
ちなみに「-R」とするとWiresharkディスプレイフィルタを利用することができます。しかしあくまでディスプレイフィルタなので実際には全てのパケットを取得しています。
あまりに多くのパケットをキャプチャすると負荷が大きくなるので注意が必要です。
Wiresharkディスプレイフィルタには非常に多くのフィルタが用意されています。こちらも詳細は公式のディスプレイフィルタのページを参照してください。
パケットの詳細を表示する
トラブルがあった際には、パケットのデータリンク層やネットワーク層について調べたい場合もあると思います。そんな時は「-V」オプションを利用します。
これはWiresharkのPacket Detailsに当たる機能です。
DNSに関するパケットの詳細を表示
# tshark -i 1 -V -f 'port 53' Frame 1: 83 bytes on wire (664 bits), 83 bytes captured (664 bits) on interface 0 Interface id: 0 WTAP_ENCAP: 1 Arrival Time: Sep 16, 2014 14:14:44.924549000 JST [Time shift for this packet: 0.000000000 seconds] Epoch Time: 1410844484.924549000 seconds [Time delta from previous captured frame: 0.000000000 seconds] [Time delta from previous displayed frame: 0.000000000 seconds] [Time since reference or first frame: 0.000000000 seconds] Frame Number: 1 Frame Length: 83 bytes (664 bits) Capture Length: 83 bytes (664 bits) [Frame is marked: False] [Frame is ignored: False] [Protocols in frame: eth:ip:udp:dns] Ethernet II, Src: Cisco_d8:34:ff (f8:72:ea:d8:34:ff), Dst: Xensourc_4a:04:86 (00:16:3e:4a:04:86) Destination: Xensourc_4a:04:86 (00:16:3e:4a:04:86) Address: Xensourc_4a:04:86 (00:16:3e:4a:04:86) .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) .... ...0 .... .... .... .... = IG bit: Individual address (unicast) Source: Cisco_d8:34:ff (f8:72:ea:d8:34:ff) Address: Cisco_d8:34:ff (f8:72:ea:d8:34:ff) .... ..0. .... .... .... .... = LG bit: Globally unique address (factory default) .... ...0 .... .... .... .... = IG bit: Individual address (unicast) Type: IP (0x0800) Internet Protocol Version 4, Src: 202.238.95.14 (202.238.95.14), Dst: 153.122.40.105 (153.122.40.105) Version: 4 Header length: 20 bytes Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport)) 0000 00.. = Differentiated Services Codepoint: Default (0x00) .... ..00 = Explicit Congestion Notification: Not-ECT (Not ECN-Capable Transport) (0x00) Total Length: 69 Identification: 0x6d96 (28054) Flags: 0x00 0... .... = Reserved bit: Not set .0.. .... = Don't fragment: Not set ..0. .... = More fragments: Not set Fragment offset: 0 Time to live: 52 Protocol: UDP (17) Header checksum: 0x2d32 [correct] [Good: True] [Bad: False] Source: 202.238.95.14 (202.238.95.14) Destination: 153.122.40.105 (153.122.40.105) User Datagram Protocol, Src Port: 6232 (6232), Dst Port: domain (53) Source port: 6232 (6232) Destination port: domain (53) Length: 49 Checksum: 0x9281 [validation disabled] [Good Checksum: False] [Bad Checksum: False] Domain Name System (query) Transaction ID: 0x97ad Flags: 0x0010 Standard query 0... .... .... .... = Response: Message is a query .000 0... .... .... = Opcode: Standard query (0) .... ..0. .... .... = Truncated: Message is not truncated .... ...0 .... .... = Recursion desired: Don't do query recursively .... .... .0.. .... = Z: reserved (0) .... .... ...1 .... = Non-authenticated data: Acceptable Questions: 1 Answer RRs: 0 Authority RRs: 0 Additional RRs: 1 Queries oxynotes.com: type AAAA, class IN Name: oxynotes.com Type: AAAA (IPv6 address) Class: IN (0x0001) Additional records: type OPT Name: Type: OPT (EDNS0 option) UDP payload size: 4096 Higher bits in extended RCODE: 0x0 EDNS0 version: 0 Z: 0x8000 Bit 0 (DO bit): 1 (Accepts DNSSEC security RRs) Bits 1-15: 0x0 (reserved) Data length: 0
パケットの中身を表示する
パケットの内容を16進数とアスキーキャラクタで表示します。
WiresharkのPacket Bytesに当たる機能。
DNSに関するパケットの詳細を表示
# tshark -i 1 -x -f 'port 53'
0.000000 202.216.224.17 -> 153.122.40.105 DNS 82 Standard query 0x1cfe A sukegra.com
0000 00 16 3e 4a 04 86 f8 72 ea d8 34 ff 08 00 45 00 ..>J...r..4...E.
0010 00 44 f3 35 40 00 f9 11 21 a5 ca d8 e0 11 99 7a .D.5@...!......z
0020 28 69 35 9f 00 35 00 30 f4 4a 1c fe 00 00 00 01 (i5..5.0.J......
0030 00 00 00 00 00 01 07 73 75 6b 65 67 72 61 03 63 .......sukegra.c
0040 6f 6d 00 00 01 00 01 00 00 29 02 00 00 00 80 00 om.......)......
0050 00 00
キャプチャのファイルへの書き出し
上記のようにパケットの詳細を調べる場合、リアルタイムに出力される内容を視認することは不可能です。
そこでキャプチャしたパケットをファイルに書き出して、後でゆっくりと分析することもできます。
「-w」オプションの後に保存ファイルの名前を付けます。(適当なところでCtrl + Cで停止してください)
# tshark -i 1 -w packet Running as user "root" and group "root". This could be dangerous. Capturing on eth0 116 ← この数字がキャプチャしたパケット数
ファイルの読込みと統計
保存したパケットは生データのため「-r」オプションでファイルを指定して読み込みます。
packetの読込み
# tshark -r packet
統計を利用した読込み
Wiresharkのような詳細なグラフ化はできませんが、「-z」オプションを使って、簡単な統計を取ることはできます。
ここではファイルに対して「-z」オプションを指定していますが、リアルタイムのパケットに対しても統計表示はできます。
ipベースの統計
# tshark -r packet -z conv,ip IPv4 Conversations Filter:| <- | | -> | | Total | Rel. Start | Duration | | Frames Bytes | | Frames Bytes | | Frames Bytes | | | 153.122.40.105 <-> 101.111.73.127 12 744 11 1650 23 2394 0.203053000 6.2070 153.122.40.105 <-> 37.58.100.152 8 726 5 4241 13 4967 2.782395000 3.2425 153.122.40.105 <-> 118.14.133.191 6 324 6 324 12 648 1.644933000 0.0590 153.122.40.105 <-> 116.81.119.103 5 275 5 330 10 605 4.910457000 0.5785 153.122.40.105 <-> 69.163.209.122 5 650 5 478 10 1128 1.358501000 0.3465 153.122.40.105 <-> 59.106.194.36 5 759 5 553 10 1312 0.848923000 0.2905 199.30.25.184 <-> 153.122.40.105 4 524 5 620 9 1144 2.142922000 0.5368 180.222.191.15 <-> 153.122.40.105 4 298 4 723 8 1021 0.848260000 0.5099 153.122.40.105 <-> 124.33.119.90 4 871 3 7086 7 7957 0.225297000 0.2115 153.122.40.105 <-> 119.72.196.172 1 66 1 66 2 132 3.537985000 1.7176 153.122.40.105 <-> 110.5.45.66 1 66 1 66 2 132 1.893945000 0.0044
HTTP Requestsベースの統計
# tshark -r packet -z http_req,tree
===================================================================
HTTP/Requests value rate percent
-------------------------------------------------------------------
HTTP Requests by HTTP Host 5 0.001199
oxynotes.com 1 0.000240 20.00%
/wp-content/themes/twentyten-child/images/uptop.png 1 0.000240 100.00%
d.hatena.ne.jp 1 0.000240 20.00%
/puchiban/20130110/1357832786 1 0.000240 100.00%
pnggauntlet.com 1 0.000240 20.00%
/ 1 0.000240 100.00%
aqwiki.net 2 0.000480 40.00%
/rss/rss_list.txt 1 0.000240 50.00%
/?plugin=rename&refer=NANOplus 1 0.000240 50.00%
===================================================================
ホストベースの統計
# tshark -r packet -z hosts
# Host data gathered from packet
59.106.194.36 d.hatena.ne.jp
219.99.167.170 ns0.future-s.com
219.99.160.181 ns1.future-s.com
66.33.206.206 ns1.dreamhost.com
208.97.182.10 ns2.dreamhost.com
66.33.216.216 ns3.dreamhost.com
69.163.209.122 pnggauntlet.com
2607:f298:1:140::2a2:10e2 pnggauntlet.com
ステータスコードごとに表示
# tshark -z http,stat, # tshark -z http,tree
IPとプロトコル、ポートごとに表示
# tshark -z dests,tree # tshark -z plen,tree
「-z」オプション使える全フィルタ
-z argument must be one of : afp,srt ancp,tree ansi_a, bacapp_instanceid,tree bacapp_ip,tree bacapp_objectid,tree bacapp_service,tree bootp,stat, camel,counter camel,srt collectd,tree compare, conv, dcerpc,srt, dests,tree diameter,avp expert follow,tcp follow,udp gsm_a, h225,counter h225,srt hart_ip,tree hosts http,stat, http,tree http_req,tree http_srv,tree icmp,srt icmpv6,srt io,phs io,stat, ip_hosts,tree isup_msg,tree mac-lte,stat megaco,rtd mgcp,rtd plen,tree proto,colinfo, ptype,tree radius,rtd rlc-lte,stat rpc,programs rpc,srt, rtp,streams rtsp,stat, rtsp,tree sametime,tree scsi,srt, sctp,stat sip,stat smb,sids smb,srt smpp_commands,tree sv ucp_messages,tree wsp,stat,
キャプチャの自動停止
特定の時間が経過したら記録を停止したい。特定のファイルサイズになったら記録を停止したい。といった指定もできます。
「-a」オプションで一定の値になったら記録を中止
停止するフラグ | 記述方法 |
---|---|
秒数で停止する | duration:value |
ファイルサイズで停止する | filesize:value(デフォルトの単位はKB) |
指定した保存ファイル数に達したら停止する | files:value(ファイル名は、ファイル名_五けたの連番_作成時間(yyyyMMddHHmmss)となる) |
開始から10秒で記録を停止する
# tshark -a duration:10
ファイルサイズが10キロバイトに達すると記録を停止する
# tshark -w packet -a filesize:10
ファイルサイズが10キロバイトに達すると次のファイルに記録。ファイル数が5つになったら停止する
# tshark -w packet -a filesize:10 -a files:5
以下の様なファイルが作成される
packet_00001_20140916171017 packet_00002_20140916171019 packet_00003_20140916171021 packet_00004_20140916171017 packet_00005_20140916171017
「-c」オプションを指定すると、パケット数を指定できる
# tshark -c 10
ファイルを切り替えるタイミングの指定
大量のパケットを一つのファイルに書き出すと読み込むだけでも重くなります。そのため一定のサイズが来たら別のファイルに切り替えます。
「-b」オプションを指定するとファイルのバッファサイズを指定できる
基本は「-a」と同じですが、ログローテーションのようにファイルを切り替えるタイミングを指定するだけで、停止はしないので注意。
切り替えるフラグ | 記述方法 |
---|---|
指定した秒数で新規ファイルに切り替える | duration:value |
指定したファイルサイズで新規ファイルに切り替える | filesize:value(デフォルトの単位はKB) |
指定した保存ファイル数に達したら古いファイルを消して上書きする | files:value(ファイル名は、ファイル名_五けたの連番_作成時間(yyyyMMddHHmmss)となる) |
ファイルサイズが10キロバイトに達したら別のファイルに切り替え。ファイル数が5つになったら1番古いファイルを削除して新しいファイルで上書きする
# tshark -w packet -b filesize:10 -b files:5
以上tsharkの基本的な使い方でした。
基本的には「-f」で取得したいデータをフィルタして、「-a」でファイルに取得する時間を指定。「-z」で統計を確認。
問題がありそうなパケットに関しては「-x」や「-V」で詳細を確認。といった流れで大抵の需要は満たせると思います。
更に高度な分析が必要な場合はWiresharkのディスプレイフィルタを利用しましょう。