【保存版】Wiresharkのキャプチャフィルタ ~設定方法と注意点~

Wiresharkでは、2種類のフィルタ存在します。ひとつは、表示フィルタでありこちらは以前の記事でご紹介しました。今回は、もうひとつのフィルタである「キャプチャフィルタ」について説明します。
キャプチャフィルタは、条件に合致したパケットのみキャプチャを実施します。

2022年10月にWireshark Ver.4.0がリリースされました。記述にあるVer.3.xはVer.3.6.9、Ver.4.xは4.0.1でそれぞれ検証しています。

パケットキャプチャの開始方法とキャプチャフィルタの設定

パケットキャプチャを開始は、Welcom Pageからキャプチャする方法と、トレースファイルからキャプチャする方法の2種類あります。

1.Welcom Pageからのキャプチャ

Wiresharkを起動すると以下の画面が表示されます。

Welcomページからのキャプチャ

キャプチャするインターフェイスをダブルクリックするとキャプチャが開始されます。
その際、キャプチャフィルタをボックスに入力すると、定義されたパケットのみキャプチャされます。

2.トレースファイルからのキャプチャ

トレースファイルを開いた状態からのキャプチャは、ボタンまたはメニューより行います。

トレースファイルからのキャプチャ

動作 ボタン メニュー ショートカットキー
キャプチャ開始
(キャプチャが停止している場合有効)
キャプチャ開始 [Capture]menu>Start Ctrl + E
キャプチャ停止
(キャプチャが開始している場合有効)
キャプチャ停止 [Capture]menu>Stop Ctrl + E
キャプチャリスタート
(キャプチャが開始している場合有効)
キャプチャリスタート [Capture]menu>Restart Ctrl + R
キャプチャオプションを開く
(キャプチャが停止している場合有効)
キャプチャオプション [Capture]menu>Options... Ctrl + K

キャプチャオプションを開くとWelcome Pageと同様フィルタを設定できます。また、キャプチャ中のファイルの自動保存やキャプチャ中の表示などの設定が可能です。
キャプチャの開始、停止を頻繁に行う作業であれば、ショートカットキーを覚えておくととても便利です。地味に作業効率が上がります。そしてキーボード操作のみで作業が行えると手も疲れません。(私だけかもしれませんが...。)

キャプチャフィルタのパラメータ

キャプチャフィルタのパラメータは、Berkeley Packet Filter(BPF)構文となっています。
BPFは、パケットフィルタリング機構です。多くのパケット解析ツールがこの構文に対応したライブラリを使用しています。
tcpdumpもこの構文を採用していますので、馴染みがある方も多いと思います。

Wiresharkキャプチャフィルタパタラメータ

BPF構文は、1つ以上の「プリミティブ(要素)」で構成されています。プリミティブは、1つ以上の修飾子とその後に続くID文字列または数値のセットから構成されます。

修飾子は、以下の3種類があります。

修飾子の種類 説明
Type ID文字列や数値の意味 ether、host、net、port
なにも指定しない場合はhostが指定されたとみなされる
Dir ID文字列や数値の方向 src、dst
なにも指定しない場合は"src or dst"、つまり双方向で指定したとみなされる
Proto プロトコル名 ether、arp、ip、icmp、tcp、udp

論理演算子を使ってプリミティブを組み合わせて、複数の条件を指定することが可能です。
使える演算子は以下のとおりです。

論理結合 指定方法1 指定方法2
AND結合 and &&
OR結合 or ||
NOT結合 not !

キャプチャフィルタの条件設定

キャプチャフィルタは、表示フィルタに比べ表現方法が少ないため、複雑な条件の設定をするためには少し工夫が必要です。実例でよく使う表現を説明します。

宛先MACアドレスが00:00:00:00:00:01のパケットをフィルタ

ether src host 00:00:00:00:00:01

MACアドレスでフィルタする場合のType修飾子は"ether host"となります。
単に"host"と指定した場合は、IPアドレスでの指定となります。

送信元か宛先にポート80番か443番が含まれるパケットをフィルタ

port 80 || port 443

修飾子にDirを省略した場合は、双方向での指定となります。

ICMパケットをフィルタ

icmp

ポートによる指定ができないアプリケーション層によるフィルタは、Proto修飾子を使用します。

Ping要求とPing応答のパケットをフィルタ

icmp[0] ==  0x08 || icmp[0] == 0x00

アドレス、ポート、プロトコル以外の複雑な設定は、オフセットとデータパターンで設定します。
Ping要求(Echo Request)は、ICMPヘッダのオフセット"0"バイトのパターンが16進数で"08"です。
Ping応答(Echo Reply)は、ICMPヘッダのオフセット"0"バイトのパターンが16進数で"00"です。
16進数を指定する場合は、パターンの先頭に"0x"を指定します。
ですので、この例の場合は、ICMPヘッダのはじめのバイトが16進数で"08"か"00"のパケットをフィルタする、という意味となります。

キャプチャフィルタを使う際の注意点

キャプチャフィルタを使用する一番の目的は、リソースの節約です。
解析するパケットがあらかじめわかっている場合は、無駄なパケットを排除することができます。
また、大量のトラフィックで必要なパケットに限定して調査ができるため、解析作業を高速化できます。

しかしながら、キャプチャフィルタは慎重に設定すべきです。これはWiresharkに限らずパケットキャプチャ製品全般に当てはまります。
トラブルシューティングのような目的でパケットキャプチャを行う場合は、どの通信に原因があるかは特定できない場合が多いです。その場合は、パケットをすべてキャプチャし、そこから表示フィルタで排除していくほうが合理的です。

当社では、パケットキャプチャ製品「SYNESIS」を開発、販売しています。Wiresharkでキャプチャが困難な高速回線、高トラフィックな状況でもロスなくキャプチャが可能です。
パケットキャプチャの手段や方法は、状況に応じて適切に選択、設定することが重要です。

あとがき

表示フィルタと違い、キャプチャフィルタでは、Ver.3.xとVer.4.xの明確な差分は見当たりませんでした。
Welcome Pageのインターフェイスの選択は、トラフィックがあるものが上に表示されるようになっていて使いやすくなっていました。
また新たな発見がありましたら、共有したいと考えています。