ネットワークトラフィックが複雑化する現代において、パケット解析はシステムトラブルの解消やセキュリティインシデントの調査に欠かせない作業となっています。
膨大な通信データの中から、問題の核心となるパケットを迅速に特定するにはツールの習熟が求められます。
特に世界中で利用されているネットワークプロトコルアナライザ「Wireshark」は、非常に強力なフィルタ機能を備えています。
本記事では、解析の効率を劇的に向上させるための「キャプチャフィルタ」と「表示フィルタ」の使い分け、および実践的な記述方法について解説します。
キャプチャフィルタと表示フィルタの根本的な違い
Wiresharkには、大きく分けて2種類のフィルタが存在することをご存知でしょうか。
一つはパケットを収集する段階で適用する「キャプチャフィルタ」であり、もう一つは収集済みのデータに対して適用する「表示フィルタ」です。
これら二つは、使用する目的だけでなく記述するための構文(シンタックス)も全く異なります。
キャプチャフィルタは、Wiresharkがネットワークインターフェースからパケットを取り込む前に、どのデータを保存するかを選択するために使用します。
これに対し、表示フィルタは保存されたすべてのパケットから、画面上に表示したいものだけを絞り込むために使用します。
この二つの違いを理解しておくことが、効率的なパケット解析の第一歩となります。
以下の表に、それぞれの主な特徴をまとめました。
| 項目 | キャプチャフィルタ | 表示フィルタ |
|---|---|---|
| 設定タイミング | パケットキャプチャの開始前 | キャプチャ中またはキャプチャ後 |
| 構文の形式 | BPF(Berkeley Packet Filter)構文 | Wireshark独自の表示フィルタ構文 |
| 目的 | 不要なデータを破棄し、保存負荷を抑える | 膨大なデータから特定の情報を抽出する |
| 柔軟性 | 比較的限定的 | 非常に高く、詳細な条件指定が可能 |
キャプチャフィルタを使いこなすための基礎知識
トラフィック量の多いネットワークでパケットを長時間採取する場合、すべてのデータを保存するとストレージやメモリを圧迫します。
このような状況では、あらかじめ必要な通信のみを定義するキャプチャフィルタが非常に有効です。
キャプチャフィルタの構文は「BPF(Berkeley Packet Filter)」と呼ばれ、コマンドラインツールのtcpdumpなどと共通の形式を採用しています。
基本的には「[識別子] [値]」という形式で記述し、論理演算子を組み合わせて条件を構成します。
ホストやポートによるフィルタリング
特定の端末との通信のみを調査したい場合は、hostキーワードを使用します。
例えば、特定のIPアドレスに関連する通信のみを記録したい場合は、以下のように記述します。
host 192.168.1.10
特定のサーバー宛ての送信パケットのみをキャプチャしたい場合は、dst hostを使用します。
dst host 192.168.1.100
特定のアプリケーション(ポート番号)に限定して調査を行う場合は、portキーワードが役立ちます。
HTTP通信のみを追跡したい場合は、ポート80を指定します。
tcp port 80
ネットワーク範囲とプロトコルによるフィルタリング
セグメント単位で通信を把握したい場合は、netキーワードを使用してネットワークアドレスを指定します。
net 192.168.1.0/24
特定のプロトコルのみ、例えばICMP(Ping)のやり取りだけを見たい場合は、プロトコル名を直接記述します。
icmp
複数の条件を組み合わせる場合は、and(かつ)、or(または)、not(否定)を使用します。
例えば、「192.168.1.10以外のホスト」かつ「TCPの443番ポート(HTTPS)」の通信を除外せずに取得したい場合は、以下のように記述します。
host 192.168.1.10 and tcp port 443
キャプチャフィルタで絞り込みすぎると、問題発生時の前後関係を把握できなくなるリスクがあるため注意が必要です。
表示フィルタの強力な表現力を活用する
キャプチャが完了した後は、表示フィルタを活用して特定のシーケンスを特定するフェーズに移ります。
表示フィルタはキャプチャフィルタよりも遥かに柔軟で、パケット内の特定のフィールド値まで細かく指定できます。
フィルタバーに条件を入力すると、Wiresharkが構文チェックをリアルタイムで行い、正しい場合は背景が緑色に変わります。
比較演算子の使い方
表示フィルタでは、プログラミング言語に似た比較演算子を使用します。
以下は、表示フィルタで使用される代表的な比較演算子の一覧です。
| 演算子(英字) | 演算子(記号) | 意味 |
|---|---|---|
| eq | == | 等しい |
| ne | != | 等しくない |
| gt | > | より大きい |
| lt | < | より小さい |
| ge | >= | 以上 |
| le | <= | 以下 |
| contains | ~を含む(文字列検索) | |
| matches | ~ | 正規表現に一致 |
例えば、IPアドレスが「192.168.10.5」の通信のみを表示するには、ip.addr == 192.168.10.5と入力します。
論理演算子による複雑な条件設定
複数の条件を組み合わせる際、表示フィルタでは記号または英字の論理演算子を使用します。
&&(および)、||(または)、!(否定)が一般的です。
例えば、「HTTPのレスポンスコードが404(Not Found)」かつ「特定のクライアントからの通信」を表示させたい場合は、以下のようになります。
http.response.code == 404 && ip.src == 192.168.1.50
特定のドメインへのDNSクエリを特定したい場合は、以下のフィルタが役立ちます。
dns.qry.name contains "google"
このように、プロトコル階層を意識した記述ができる点が表示フィルタの最大の強みです。
実践的なパケット解析シーン別のフィルタ例
ここからは、実際のトラブルシューティングやセキュリティ調査で頻繁に使用される実践的なフィルタ例を紹介します。
TCPのコネクション問題の調査
ネットワークの遅延や切断が疑われる場合、TCPのフラグ情報を確認することが重要です。
接続試行(SYNパケット)のみを抽出するには、以下のフィルタを使用します。
tcp.flags.syn == 1 && tcp.flags.ack == 0
また、異常終了(RSTパケット)が発生している箇所を特定したい場合は、以下の記述が有効です。
tcp.flags.reset == 1
再送(Retransmission)が発生しているパケットを見つけ出すには、Wiresharkが自動で解析した解析情報フィルタを利用します。
tcp.analysis.retransmission
HTTP/HTTPSプロトコルの詳細解析
Webサーバーへの攻撃やパフォーマンス低下を調査する際、HTTPヘッダーの内容を確認したいことがあります。
特定のホスト名へのリクエストを表示するには、http.hostを使用します。
http.host == "example.com"
POSTメソッド(データの送信)のみを確認したい場合は、http.request.methodを指定します。
http.request.method == "POST"
なお、HTTPS通信は暗号化されているため、WiresharkにSSLキーログをインポートしていない限り、パケットの中身をこれらのフィルタで見ることはできません。
セキュリティインシデントの特定
不審なポートスキャンが行われている形跡を探すには、短時間で大量の接続試行を行っているホストを探します。
特定のIPアドレスからのICMP通信をすべて抽出するには、ip.src == [攻撃者のIP] && icmpと入力します。
もし、特定のマルウェアが外部のC2サーバーと通信している疑いがある場合、宛先IPアドレスの一致を確認します。
ip.dst == 203.0.113.1
また、攻撃者が「admin」という文字列を含むURLにアクセスしようとしている形跡を探すなら、以下のフィルタが強力です。
http.request.uri contains "admin"
フィルタ作成を効率化するWiresharkの機能
フィルタを最初からすべて手入力するのは時間がかかりますし、構文ミスも発生しやすくなります。
Wiresharkには、マウス操作だけでフィルタを作成できる「フィルタ作成アシスト機能」が備わっています。
パケットの詳細ビュー(Packet Details)ウィンドウで、フィルタリングの条件にしたいフィールドを右クリックしてください。
メニューから「表示フィルタとして適用(Apply as Filter)」を選択し、さらに「Selected」をクリックします。
これにより、選択したフィールドに基づいた表示フィルタが自動的に入力欄へ反映されます。
既存のフィルタに条件を追加したい場合は、「…and Selected」や「…or Selected」を選択することで、現在の条件を維持したまま拡張できます。
また、頻繁に使用する複雑なフィルタは「ボタン」として保存しておくことも可能です。
フィルタバーの右端にある「+」ボタンをクリックすると、現在入力されているフィルタに名前を付けて、ツールバーに登録できます。
これにより、次回以降はワンクリックで同じ解析条件を呼び出せるようになります。
パフォーマンスに配慮したキャプチャのヒント
最後に、大規模な解析をスムーズに進めるためのアドバイスをいくつか紹介します。
ギガビット級の通信が発生している環境でフィルタなしのキャプチャを行うと、Wireshark自体がパケットを取りこぼす「パケットドロップ」が発生しやすくなります。
このような場合、「キャプチャフィルタ」でまずポートやプロトコルをある程度絞り込んでから解析を開始するのがベストプラクティスです。
一方で、原因が特定できていない段階でキャプチャフィルタを強くかけすぎると、真の原因を見逃すリスクがあります。
リスクを抑えたい場合は、いったんすべての通信をキャプチャしてファイル(pcapng形式)に保存し、後から「editcap」や「tshark」といったコマンドラインツールでファイルを分割・抽出する方法も検討してください。
また、表示フィルタの結果が表示されるまでに時間がかかる場合は、メモリ消費量を抑えるために不要なプロトコルの解析を無効化(Analyze -> Enabled Protocols)することも有効です。
Wiresharkは多機能であるがゆえに、適切なフィルタリング戦略が解析者のスキルを左右するといっても過言ではありません。
まとめ
Wiresharkにおける「キャプチャフィルタ」と「表示フィルタ」の使い分けは、パケット解析の速度と精度を決定づける極めて重要な要素です。
キャプチャフィルタは収集するデータそのものを制限することで負荷を下げ、表示フィルタは蓄積された膨大なデータから自在に情報を抽出します。
それぞれの構文の違いを理解し、比較演算子や論理演算子を組み合わせることで、目指すデータへ最短距離で到達できるようになります。
まずは日常的なネットワーク管理において、よく使うフィルタを登録することから始めてみてはいかがでしょうか。
高度なフィルタリング技術を習得すれば、ネットワーク上のわずかな異常やセキュリティリスクも、確実に見つけ出せるようになるはずです。
