2026年10月1日

2026年10月1日

Wiresharkのフィルター設定と解析方法|キャプチャフィルターと表示フィルターの使い分け

Wireshark で目的のパケットにたどり着くには、「何を記録するか」を決めるキャプチャフィルターと、「記録したものから何を見るか」を決める表示フィルターを使い分けることが近道です。この記事では、2種類のフィルターの書き方の違い、よく使う表示フィルターの例、サーバーで取得したキャプチャを手元の Wireshark で解析する流れ、遅延や接続エラーを調べるときの見方を順に説明します。WordPress サーバーから外部 API への通信が遅い、TLS 接続に失敗する、といった調査にそのまま使える内容です。

前提:キャプチャしてよい通信か確認する

パケットキャプチャには、通信相手のIPアドレス、Cookie、フォームの入力内容など個人情報や認証情報が含まれることがあります。キャプチャは自分が管理する、または管理者から許可を得たネットワークとサーバーに限って行ってください。保存した pcap ファイルは機密情報として扱い、調査が終わったら削除する、共有するときは必要な範囲に絞る、といった取り扱いを決めておくことが大切です。

2種類のフィルターの違い

Wireshark のフィルターは、似ているようで文法がまったく別物です。ここを混同すると「フィルターが赤くなって受け付けられない」という状態になります。

  • キャプチャフィルター:キャプチャ開始前に指定し、条件に合わないパケットはそもそも記録しません。libpcap の BPF 構文(tcpdump と同じ書き方)を使います。ファイルサイズと負荷を抑えるのが目的です。
  • 表示フィルター:記録済みのパケットに対して、画面上で表示を絞り込みます。Wireshark 独自の構文で、プロトコルのフィールド名を指定できるため、より細かい条件を書けます。後から何度でも変えられます。

迷ったら、キャプチャフィルターは「対象ホストやポートで大まかに絞る」程度にとどめ、細かい絞り込みは表示フィルターで行うのが基本です。キャプチャ時に絞りすぎると、原因になっていたパケット(DNS の問い合わせや別ポートへの接続など)を記録し損ねることがあります。

キャプチャフィルターの例

host 203.0.113.10
tcp port 443
host 203.0.113.10 and tcp port 443
net 192.168.10.0/24
udp port 53 or tcp port 443
not port 22

SSH 越しにサーバー上でキャプチャするときは、not port 22 を入れておかないと、自分の SSH セッションのパケットまで大量に記録されてしまいます。

表示フィルターの例

表示フィルターは「プロトコル名.フィールド名 演算子 値」の形で書きます。

ip.addr == 203.0.113.10
tcp.port == 443
dns
dns.flags.rcode != 0
http.request.method == "POST"
http.response.code >= 400
tls.handshake.type == 1
tcp.flags.syn == 1 && tcp.flags.ack == 0
tcp.analysis.retransmission
tcp.analysis.flags
frame contains "wp-login.php"
ip.addr in {203.0.113.10 203.0.113.20}

演算子には ==、!=、>、<、contains(バイト列や文字列を含む)、matches(正規表現)などがあり、&&(and)、||(or)、!(not)で組み合わせます。

ip.addr のように送信元と宛先の両方に当てはまるフィールドに != を使うときは注意が必要です。Wireshark 3.6 で != の意味が見直され、現在の版では ip.addr != 203.0.113.10 は !(ip.addr == 203.0.113.10) と同じく「送信元・宛先のどちらもそのアドレスではない」パケットを表します。古い版の解説記事と挙動が違うことがあるので、意図どおりか迷ったら !(ip.addr == ...) と書くと誤解がありません。

フィールド名が分からないときは、パケット詳細ペインで目的の項目を選ぶと、ステータスバーにフィールド名が表示されます。項目を右クリックしてフィルターとして適用するメニュー(「Apply as Filter」など、表記は版や言語設定で異なります)を使えば、構文を手で書かずに済みます。

サーバーで取得して手元で解析する流れ

本番の Linux サーバーには GUI がないことが多いので、サーバー側では tcpdump で pcap ファイルに保存し、それを手元の PC にコピーして Wireshark で開くのが一般的です。

# 外部APIとの通信と DNS を 200MB 上限・ローテーションありで記録する例
sudo tcpdump -i any -nn -s 0 \
  -C 100 -W 2 \
  -w /tmp/wp-capture.pcap \
  'host 203.0.113.10 or udp port 53'

-C 100 -W 2 は「100MB ごとにファイルを切り替え、最大2ファイルを循環させる」指定で、ディスクを使い切る事故を防ぎます。-i any はすべてのインターフェースをまとめて記録できますが、Linux ではイーサネットヘッダーの代わりに疑似ヘッダー(Linux cooked capture)で保存されるため、MAC アドレスを見たい調査では具体的なインターフェース名を指定します。

問題を再現させたら Ctrl+C で止め、scp などで手元にコピーして開きます。Wireshark の付属コマンド tshark を使えば、GUI を開かずに表示フィルターを適用することもできます。

# DNS の問い合わせ名と応答時間を一覧にする
tshark -r wp-capture.pcap -Y 'dns.flags.response == 1' \
  -T fields -e frame.time_relative -e dns.qry.name -e dns.time

# TCP の再送だけを数える
tshark -r wp-capture.pcap -Y 'tcp.analysis.retransmission' | wc -l

解析の進め方

フィルターを書く前に、まず全体像をつかむと調べる範囲を絞れます。Wireshark の「統計」メニュー(Statistics)には、次のような機能があります(メニュー名は版や表示言語によって異なることがあります)。

  • プロトコル階層:キャプチャ中にどのプロトコルがどれくらいの割合で含まれているか
  • 対話(Conversations):どのホストの組み合わせで、どれだけのパケットとバイトがやり取りされたか
  • エキスパート情報:再送、順序の乱れ、ゼロウィンドウなど、Wireshark が自動で検出した注意点の一覧
  • I/O グラフ:時間あたりのパケット数やバイト数の推移

気になる通信が見つかったら、パケットを右クリックして TCP ストリームを追跡する機能(Follow TCP Stream)を使うと、その接続のやり取りだけを時系列で読めます。

例1:外部APIへの接続が遅い

WordPress のプラグインが外部 API を呼び出すたびに画面表示が遅くなる場合、遅れがどの段階で起きているかを切り分けます。

  1. dns で絞り込み、問い合わせから応答までの時間(dns.time)を見ます。ここが数秒かかっているなら名前解決が原因です。
  2. tcp.flags.syn == 1 で接続開始を探し、SYN に対する SYN/ACK がすぐ返っているかを見ます。SYN が何度も送り直されている場合は、経路上のファイアウォールや相手側の受け付け状況を疑います。
  3. tls.handshake.type == 1(Client Hello)以降、ハンドシェイクがどこで止まっているかを確認します。Alert が返っている場合は、TLS バージョンや証明書の問題が考えられます。
  4. 接続確立後に待ち時間が長いなら、相手サーバーの処理時間です。この場合はネットワークではなく API 側の問題として扱います。

例2:通信が不安定で途中で切れる

tcp.analysis.flags で再送・重複 ACK・ゼロウィンドウなどをまとめて表示し、特定のホストや時間帯に集中していないかを I/O グラフと合わせて確認します。tcp.flags.reset == 1 で RST を探すと、どちら側が接続を切ったかが分かります。

HTTPS の中身を見たいとき

HTTPS の通信は暗号化されているため、そのままでは HTTP のヘッダーや本文は見えません。自分の PC のブラウザーが行う通信であれば、環境変数 SSLKEYLOGFILE にファイルパスを設定してブラウザーを起動すると、セッション鍵がそのファイルに書き出されます。Wireshark の TLS プロトコル設定で、そのキーログファイルを指定すると復号して表示できます(設定項目の名前は版によって異なります)。

キーログファイルは通信を復号できる鍵そのものです。調査が終わったら環境変数を外し、ファイルを削除してください。サーバー側の通信(PHP から外部 API への接続など)を復号するのは手間がかかるため、まずはアプリケーション側のログや curl -v で確認できないかを検討する方が現実的です。

フィルターを使いやすくする工夫

よく使う表示フィルターは、フィルターツールバーのブックマーク機能やフィルターボタンとして保存しておくと、毎回入力せずに済みます。また、「表示 → 時間表示形式」で前のパケットからの経過時間を表示するように切り替えると、待ち時間の長い箇所を見つけやすくなります。この記事は Wireshark 4 系の画面を想定しています(2026年10月現在)。メニュー構成は版によって変わることがあります。

まとめ

  • キャプチャフィルター(BPF 構文)は記録量を抑えるためのもの、表示フィルター(Wireshark 構文)は記録後に絞り込むためのもので、文法が異なります
  • キャプチャ時は大まかに絞り、細かい条件は表示フィルターで調整すると取りこぼしを防げます
  • ip.addr != ... の意味は版によって違うため、迷ったら !(ip.addr == ...) と書きます
  • サーバーでは tcpdump で容量上限付きで保存し、手元の Wireshark や tshark で解析します
  • 遅延の調査は DNS → TCP 接続 → TLS → 応答待ちの順に切り分け、キャプチャファイルは機密情報として扱います

お気軽にご相談ください

お見積りへ お問い合わせへ
▲