tcpdumpを使いこなす!

2008年12月12日(金)
津川 知朗

tcpdumpで使用できるコマンドオプション

 TCPDUMP(http://www.tcpdump.org/)、MicroOLAP TCPDUMP for Windows(http://www.microolap.com/products/network/tcpdump/)で共通で使用できるコマンドオプションは以下の通りです。

tcpdump [-adeflnNOpqRStvxX][-c count][-F file]
[-i interface][-r file][-s snaplen][-T type][-w file]
[expression]

 ここでは、これらのうち、tcpdumpでよく使用されるコマンドオプションについて記述します。

 1つ目が-lです。-lオプションは、tcpdumpの出力結果をパイプ(|)を通じてほかのプログラムへ渡す際に必要となるオプションです。

 2つ目が-nです。tcpdumpは、デフォルトの状態ではホストのIPアドレスやポート番号を名前に変換して出力しようとします。-nオプションを指定するとそれらの名前への変換が行われず、IPアドレスやポート番号のまま出力されるようになります。

 3つ目が-xです。tcpdumpは、通常は各プロトコルのヘッダ情報のみを出力しますが、-xオプションを指定するとすべてのパケットの内容を出力するようになります。-xオプションは、パケットの内容を16進数で出力します。これに対して、-X(大文字)オプションはパケットの内容を16進数に加えてASCII文字でも出力します。パケットのデータ部分の内容を確認したいときに使用されます。

コマンドオプションの使い方

 4つ目が-cです。-cオプションは、[-c ]で出力するパケット数の上限を指定するためのオプションです(<>内は任意の値、また指定時に<>は不要、以降のオプションについても同様)。-cオプションが指定された場合、tcpdumpはで指定した個数のパケットの情報を出力するとプログラムを終了します。

 5つ目が-iです。-iオプションは、監視するNetwork Interface Card(以下、NIC)を指定するためのオプションです。「第1回:tcpdumpでネットワーク状況を知る!」でも述べたように、tcpdumpは一度に1つのNICしか監視しません。そのため、コンピュータに複数のNICが接続されている場合には、どのNICを監視対象にするのかを起動時に指定する必要があります。[-i ]の形式でに番号(例:1、2)またはNICの名前(例:eth0、eth1)を指定します。

 6つ目が-wです。tcpdumpは、受信したパケットを解析し、解析結果を人間が確認しやすい書式に整形して出力します。しかし、-wオプションを指定するとtcpdumpは解析を行わずに受信したパケットの情報をそのまま書き出します。[-w ]の形式で、出力するファイルをに指定します。-wオプションを指定して取得したパケット情報は、Wireshark(http://www.wireshark.org/)などのGUIベースのプログラムでも読み込むことができます。そのため、パケットの収集のみtcpdumpで行い、解析などそれ以外の作業はGUIで行うと言った使い方もできます。

 7つ目が-rです。-rオプションは、-wオプションを指定して作成されたファイルを読み込んで解析し、その結果を出力します。[-r ]の形式でファイルを指定します。

 8つ目が-Fです。[-F ]のように指定すると、tcpdumpは出力をフィルタリングするための条件式をから読み込むようになります。なお、-Fオプションが指定されている場合は、コマンドラインから後述する[expression]の個所にフィルタリングの条件式を与えても無視されます。

 また出力をフィルタリングする条件式については[expression]で指定します。フィルタリングの条件式については、次ページで解説します。

出力をフィルタリングするための条件式

 tcpdumpは、デフォルトの状態ではコンピュータ(-iオプションで指定されたNIC)に到着したすべてのパケットの情報を出力します。しかし、第1回でも述べたように、すべてのパケットの情報を出力すると情報量が膨大になるため、tcpdumpを使用する際にはしばしば出力結果に対してフィルタリングを行います。

 tcpdumpには出力をフィルタリングする条件式のためのキーワードが多数用意されており、これらのキーワードを組み合わせて作成した条件式が指定された場合、tcpdumpはその条件式が真(しん)となるパケットの情報のみ出力するようになります。

 条件式は前述したコマンドオプションの最後([expression]の箇所)に1つ以上の引数として指定することができます。条件式として2つ以上の引数が指定された場合、tcpdumpはそれらの引数を空白で結合して1つの条件式を作成します。指定した条件式の中に括弧(())などシェルのメタキャラクターが含まれるような場合には、条件式全体を引用符(')でくくって1つの引数として指定するのがよいでしょう。

条件式の指定方法と例

 条件式は1つ以上の「修飾子」と「ID」から構成されます。修飾子には以下の3種類が存在します。

 1つ目が[Type]で、ここでは、IDの種類を表します。利用可能なものは、(ホストのアドレスを指定。例:192.0.2.3、example.jpなど)、(ネットワークアドレスを指定。例:192.0.2.0/24)、の3種類です。なお、修飾子が省略された場合はが指定されたと見なされます。

 2つ目が[Direction]で、IDが送受信ホストのどちらに当たるのかを表します。利用可能なものは、 の4 通りです。

 3つ目が[Protocol]で、出力する情報を一部のプロトコルに限定します。利用可能なものは、 です。

 条件式については、以下にいくつか例を紹介しておきます。

[tcpdump -n tcp and dst host 192.0.2.3]

 192.0.2.3に向けて送信されたTCPプロトコルのパケットの情報のみを出力します。

[tcpdump -n ip proto \tcp dst host 192.0.2.3]

 前述した例と同じ出力結果となります。プロトコルを(TCP/IPのように)2段階で明示する場合には、キーワードを用いることで実現できます。ただし、の次に指定しているtcpは修飾子のとは別の扱いとなります。そのため、このような形で条件式を記述する場合には、バックスラッシュ(\)で修飾子として扱われることを回避する必要があります。

[tcpdump -n src 192.0.2.3 and dst \( 192.0.2.4 or 192.0.2.5 \)]

 192.0.2.3から192.0.2.4または192.0.2.5へ向けて送信されたパケットの情報のみを出力します。括弧のようにシェルのメタキャラクターが含まれる場合は、シェルが誤って解釈するのを回避するためにバックスラッシュ(\)でエスケープするか、条件式全体を引用符(')でくくる必要があります。なお、の後にはが省略されていると見なされます。

出力の書式

 最後に、tcpdumpが出力するパケットの情報に書式について説明します。tcpdumpは通信に使用されているプロトコルによって出力の書式(出力する情報)が異なります。そこで今回は、通信プロトコルとして最もよく使用されるTCP/IPプロトコルに限定し、tcpdumpがTCP/IPパケットを取得したときに出力する情報の書式について説明します。

 ローカルホスト(192.168.0.2)からwww.thinkit.co.jpへHTTPリクエストを送信したときの通信の様子を取得した結果が図3になります。TCP/IPプロトコルの大まかな書式は、第1回で述べたように、「時刻 IP 送信ホストアドレス.ポート番号 > 受信ホストアドレス.ポート番号: TCP プロトコル依存の情報」となります。

出力情報の書式

 TCPプロトコル依存部分の出力情報の書式は、以下のようになります。

制御フラグ [開始シーケンス番号:終了シーケンス番号(データサイズ)] [ack ACK番号]
win 広告ウィンドウサイズ []

 それぞれ説明しましょう。

 まず、制御フラグですが、TCPは、SYN、FIN、PSH、RST、ACK、URGの6種類の制御フラグをビット列で管理しています。SYNはデータ通信(コネクション)開始時、FINはデータ通信(コネクション)終了時に送信されるパケットで、PSHがそれ以外のデータパケット、ACKがACKパケットを表します。図のS、F、PがそれぞれSYN、FIN、PSHフラグが設定されていることを表しています。「.」は、そのパケットにはデータ部分が存在せず、それまでに送信されたデータパケットに対する応答を示すのみのパケットであることを表しています。

 続いて、シーケンス番号です。TCPはデータの順序をバイト単位の番号で管理しており、このバイト単位の番号をシーケンス番号と呼びます。このシーケンス番号は、0などの決まった値から始まるのではなく、送信ホストが適当な開始番号を選択します。tcpdumpでは、SYNパケットを取得したときのみパケットに格納されている実際のシーケンス番号を出力し、それ以降はその値を基準(0とする)とした相対的な値で出力されます。

 ACK番号は、受信ホストが送信ホストに対して(連続して)受信したデータのシーケンス番号の最大値を伝えるための値です。TCPは、このACK番号を用いてデータが欠けることなくすべて受信ホストへ到達するように制御を行います。tcpdumpで出力されるACK番号は、シーケンス番号と同様に、SYNパケットが出力されたシーケンス番号からの相対値となります。

 TCPは、データパケットを送信するときにACK番号に関する情報も一緒に送ることがあります。そのため、シーケンス番号の情報とACK番号の情報が同時に出力される場合もあります。

 広告ウィンドウサイズは、受信ホストが一度に受信可能なデータサイズの最大値(バイト単位)を伝えるための値です。送信ホストは、この値を基に一度に送信するデータ量を調整します。

 最後にTCPオプションです。TCPヘッダにはオプション領域と呼ばれる領域が存在しており、通信に使用しているTCPのバージョンによっては、この領域にバージョン独自の情報を設定することがあります。例えば、mssはパケットのデータ部分の最大値を表します。また、sackOKはSACKオプション(http://www.faqs.org/rfcs/rfc2018.html)と呼ばれるTCPの拡張機能が利用可能であることを表しています。

[参考文献]

Manpage of TCPDUMP(http://www.linux.or.jp/JM/html/tcpdump/man1/tcpdump.1.html)(アクセス:2008/11)

大阪大学
大阪大学 大学院情報科学研究科。研究の専門分野はTCP/IPネットワークで、C++プログラマー。現在の主な活動としては、オープンソースソフトウエアとして、ネットワーク関連のC++ライブラリの実装、公開を行っている。http://sourceforge.jp/projects/clxcpp/ http://d.hatena.ne.jp/tt_clown/

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています