Wiresharkを使ってみよう
tcpdumpの限界
これまで3回にわたり、tcpdumpの概要や使用方法について説明してきました。しかし、パケットの解析を行うためのツールはtcpdump以外にも数多くのものが開発、公開されています。
tcpdumpは、コマンドの実行によってパケットをフィルタリングするコマンドラインベースのツールです。しかし、tcpdumpが提供する数多くのコマンドオプションをすべて把握しておくことは大変であり、またいくつかの入力情報についてはユーザーが何らかの方法を用いて事前に調査しておかなければならないなど、利用するにはやや敷居が高いツールです。
また、出力結果についても、tcpdumpは到着したパケットのヘッダー情報をユーザーが解読可能な書式に変換するだけです。よって、tcpdumpの出力結果の解析/整形を行うには、ユーザーが自力で何らかのプログラミング言語でスクリプトなどを記述する必要があります。
そのため、より簡単に、かつ直感的に解析を行うために、GUIベースでパケットの解析を行うツールが数多く開発されてきました。例えば、GUIベースのパケット解析ツールには図1に示すようなものがあります。
GUIベースでパケットの解析を行うツール
図1のパケット解析ツールは、tcpdumpと同様、コンピュータに到着した各パケットの情報をユーザーが解読可能な書式に変換して出力する機能に加えて、独自の機能を持っているものも多く、場合によっては非常に有用なツールとなります。
例えば、tcpdumpではパケットのデータ部分については、16進数(または、ASCII文字)でそのまま出力するオプションしか存在していません。しかし、上記のパケット解析ツールの多くは、パケットのデータ部分についても解析を行い、プロトコルに応じて必要な情報をユーザーに分かりやすい形で表示してくれます。
またtcpdumpから提供される機能は、パケット単位で処理を行ってその結果を出力することのみです。一方、上記のパケット解析ツールの多くは、それに加えて、例えば監視対象のNetwork Interface Card(以下、NIC)に到着したパケットの総数とプロトコル種別(TCP、UDP、ICMPなど)の割合を計算して結果を出力する機能など、到着したパケット群に対して何らかの統計処理を行うような機能も提供しています。
もちろん、GUIであることも効率よく解析を行う上で大きな助けとなります。例えば、WindowsはNICの名前がLinuxなどのように簡単な名前(eth0など)ではなく、930F53DA-F4FC-4080-BC07-27BD7C90072EというようなGlobally Unique IDentifier(以下、GUID)と呼ばれる値で管理されています。よって、複数のNICがコンピュータに接続されている場合、tcpdumpでは、-iオプションを用いてそれぞれ指定を行うのは大変煩雑です。
tcpdumpの-iオプションは、NICの名前のほかに番号(始めに認識されているNICから順番に1、2、3...)で指定することもできますが、対象としているNICにどの番号が割り当てられているのかは、ユーザーが独自に調査しなければなりません。GUIベースのパケット解析ツールの多くは、コンピュータに接続されているNICの一覧を分かりやすい形で表示してくれるため、前述した面倒な調査、入力の手間を省くことができます。
GUIベースのパケット解析ツールは、tcpdumpと比較して数多くの利点を持っています。しかし、これらのツールの多くは商用の製品であり、高価なものも多いため、気軽に利用することはなかなか困難です。
そこで、今回はGUIベースのパケット解析ツールの中から、フリーで公開されており、かつ多くの人に利用されているWiresharkを取り上げ、その概要と使用方法について説明していきます。
Wireshakの概要
Wiresharkは、Open Source Software(OSS)として開発、公開されているGUIベースのパケット解析ツールです。OSSであるため、誰もが無償で入手して使用することができます(ライセンスは、GNU General Public License version 2)。また、FreeBSD、Linux、Solaris、Mac OS Xなどの多くのUNIX風OSやWindowsなど数多くのOS上で利用することができます。
Wiresharkは、当初はEtherealと言う名前で開発、公開が進められていました。しかし、Etherealの著作権を、Etherealの開発者が所属していた企業が保持していたため、開発者は退職後それ以上Etherealの開発を進めることができなくなりました。そこで、開発者は2006年半ばにWiresharkと言う名前で新たに開発を開始し、現在も開発を進めています。
Wiresharkは、Wireshark:Go deep(http://www.wireshark.org/)よりソースコードをダウンロードし、ビルドすれば利用できます。また、WindowsなどいくつかのOSにおいては、ソースコードのほかにバイナリ形式のものも公開されているため、それらを利用してインストールすることもできます。
Wiresharkを用いてコンピュータに到着するパケットの監視を始めるには、メイン画面のメニューから「Capture」を選択し、さらに「Interfaces」を選択します。「Interfaces」には、コンピュータに接続されているNICの一覧がIPアドレスとともに表示されるため、その中から自分が監視したいNICの右側にある「Start」ボタンをクリックします。パケットの監視を終了する場合は、同じく「Capture」メニューから「Stop」を選択すると、それまでに到着したパケットの情報がメイン画面に表示されます。
Wireshark実行結果
図2が実際にWiresharkを用いてパケットを監視したときの出力結果です。上段には、到着したパケットの簡単な情報の一覧、中段には選択しているパケットの詳細なヘッダー情報、下段にはパケットの内容を16進数(およびASCII文字)が表示されます。
上段の一覧情報は、プロトコルごとに色分けをして表示させることができます。また、プロトコルによっては同じプロトコルであっても、正常なパケットとエラーパケットを色分けすることができます。そのため、色分けを工夫することによって、通信中に何らかの問題が発生した部分が視覚的に分かりやすいように設定することができます。色分けの設定は、メイン画面の「View」メニューから「Coloring Rules」を選択することで変更できます。
中段のヘッダー情報は、プロトコルごとに分けて出力されます。例えば、HTTPの場合は、Frame、Ethernet、IP、TCP、HTTPの順で表示されます。tcpdumpでは解析されなかったトランスポート層より上位のプロトコルのヘッダー情報に関しても解析して表示されるので、プログラムのバグや問題が発生した原因を調査する際には役立つでしょう。
パケットのフィルタリングオプションについては、「Capture」メニューの「Options」で設定することができます。フィルタリングオプションの条件指定は、tcpdumpと同様の指定方法が用いられています。パケットのフィルタリングオプションに関する詳細は、連載の第2回(http://thinkit.jp/article/730/1/)を参照してください。
また、パケットの監視を終了する条件もここで指定することができます。tcpdumpは、Ctrl+Cコマンドで強制終了するか、一定数のパケットが到着を終了条件とする2通りしか終了方法がありませんが、Wiresharkでは終了条件として一定量のパケット(Byte 単位)が到着すること、および一定時間が経過することの2通りが追加されています。
Wiresharkの持つさまざまな機能
Wiresharkには、パケット単位の処理に加えてさまざまな有用な機能が存在しています。
例えば、Wiresharkの「Statistics」メニューには監視結果に対するさまざまな統計情報を表示させるためのメニューが存在します。「Statistics」メニューの「Summary」では、監視期間中のコンピュータの平均転送レートが表示されます。また、「Protocol Hierarchy」では、コンピュータに到着したパケットをプロトコルごとに分類してその割合が表示されます。
Wiresharkは統計情報だけでなく、経過時間に対する変化もグラフとして表示する機能を持っています。例えば「Statistics」メニューの「TCP Stream Graph」では、Round Trip Time「RTT」やシーケンス番号など、TCPの各種情報の変化がグラフとして表示されます。プロトコルの挙動を解析する場合、これらの機能は大きな助けとなります。
また、Wiresharkの持つ非常に役立つ機能の1つとしてTCP Streamと言う機能があります。これは、複数のパケットを結合し、ユーザーが使用しているアプリケーションプログラムが送受信するデータの形に整形して表示する機能です。
例えば、図3はWebブラウザを用いてwww.thinkit.co.jpのWebページを閲覧したときの通信を監視したものです。パケット単位で細かいデータの破片を見るよりも、GETリクエストの送信からhtmlの受信までの様子が分かりやすく表示されます。
TCP Streamを使用する場合は、表示させたいデータの(一部となる)パケットを右クリックで選択し、表示されたメニューの中から「Follow TCP Stream」を選択します。
tcpdumpとの連携
最後に、Wiresharkとtcpdumpとの連携について触れておきます。WiresharkはGUIベースのツールであるため、直感的に操作を行うことはできますが、スクリプトなどとの連携は不得手となります。
例えば、毎日(あるいは、毎週、毎月)ある時刻に一定時間だけネットワーク上を流れるパケットを監視するような場合は、あらかじめスクリプトを記述しておいてスケジューラなどで自動的に実行させる方が楽で効率的ですが、そのような利用方法はWiresharkでは難しいです。
しかし、Wiresharkが出力するログの書式はtcpdumpと互換性があります(正確には、-wオプションを指定して出力したログ)。つまり、Wiresharkはtcpdumpが出力したログファイルを読み込むことができます。そのため、例えば、定時に行っているパケットの監視はtcpdump(とスクリプト)を用いて、出力結果をファイルとして保存しておき、解析はそのファイルをWiresharkで読み込んで行うなどパケットの監視と解析を独立して行うことで、作業の効率化、負担の軽減が期待できます。
コマンドラインベースのツールとGUIベースのツールは、それぞれに利点と欠点が存在しています。パケット解析を行う場合は、これらのツールを条件によってうまく使い分けることで、効率的に解析を進めていくことができるでしょう。