Wireshark on Ubuntu 応用 — パケット解析とフィルタリングの実践

ネットワーク

UbuntuにWiresharkをインストールしてGUI操作まで確認したあと、「もう少し踏み込んで使いたい」と感じる方は多いと思います。
この記事では CLI 版の tshark でパケットをキャプチャする方法と、
知っておくと便利な表示フィルタの書き方を実際のコマンド出力で解説します。

環境は Ubuntu 24.04 LTS の Docker 公式イメージ(ubuntu:24.04)上で実測しています。
同じ手順を VPS や手元のマシンで試せるよう、コマンドとその実出力を省略せず載せます。

この記事のポイント

  • apt install tshark で入る CLI 版 Wireshark のバージョンは Ubuntu 24.04 で 4.2.2(22.04 は 3.6.2)
  • tshark -i lo -a duration:4 で ループバックに流れるパケットを 4 秒キャプチャできる
  • 表示フィルタは -Y 'icmp.type==8' のように指定し、pcap 保存後でもオフライン適用できる
  • -z io,phs でプロトコル階層統計、-z io,stat,1 で 1 秒単位の I/O 統計を出力できる
  • フィルタ式が無効なら「is neither a field nor a protocol name」エラーが即時に返る

1. tshark のインストール(Ubuntu 22.04 vs 24.04 の違い)

Wireshark の CLI 版が tshark です。Ubuntu の universe リポジトリに収録されています。
インストール後にバージョンを確認したときの実出力が下記です。

tshark apt インストール実ログ(Ubuntu 24.04)
tshark apt インストール実ログ(Ubuntu 24.04)



ubuntu@linuxlab: ~
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
$ sudo apt install tshark
The following additional packages will be installed:
libpcap0.8t64 libwireshark-data libwireshark17t64
libwiretap14t64 libwsutil15t64 wireshark-common
Setting up wireshark-common (4.2.2-1.1build3) …
Setting up tshark (4.2.2-1.1build3) …
$ tshark –version
TShark (Wireshark) 4.2.2 (Git v4.2.2 packaged as 4.2.2-1.1build3).

Ubuntu のバージョンごとに収録バージョンが異なります。実際に docker run ubuntu:22.04ubuntu:24.04 の両方で確認した結果が次の表です。

Ubuntu 22.04 vs 24.04 tshark バージョン比較(実測)
Ubuntu 22.04 vs 24.04 tshark バージョン比較(実測)
Ubuntu バージョン tshark バージョン LTS サポート期限 備考
22.04 LTS (Jammy) 3.6.2-2 2027年4月 Wireshark 3.6.x 系
24.04 LTS (Noble) 4.2.2-1.1build3 2029年4月 Wireshark 4.2.x 系・Qt6 移行済み

22.04 では Wireshark 3.6 系、24.04 では 4.2 系が入ります。フィルタ構文・統計コマンドは両方でほぼ共通ですが、
TLS 1.3 の解析改善など 4.2 系に固有の改良が数多くあります。
新規インストールするなら 24.04 を使っておいたほうが後悔しません。

注意

Ubuntu 24.04 で apt install wireshark を実行すると GUI 版の Wireshark がインストールされます。
CLI 専用で使うなら apt install tshark だけで十分です。tshark は wireshark-common を共有ライブラリとして使います。

2. キャプチャ対象のインターフェースを確認する

キャプチャ前にまず使えるインターフェースを確認します。-D オプションで一覧が出ます。




ubuntu@linuxlab: ~
$ tshark -D
1. eth0
2. any
3. lo (Loopback)
4. bluetooth-monitor
5. nflog
6. nfqueue
7. dbus-system
8. dbus-session
9. ciscodump (Cisco remote capture)
10. sshdump (SSH remote capture)
11. udpdump (UDP Listener remote capture)

番号またはインターフェース名を -i オプションに渡してキャプチャします。
any を指定すると全インターフェースを同時監視できます。
VPS や実機では eth0、コンテナでは eth0 または any を使うことが多いです。

著者アイコン
著者アイコン

Docker コンテナ内でキャプチャするときは --cap-add=NET_ADMIN --cap-add=NET_RAW が必要です。これがないと「Permission denied」で止まります。

3. ライブキャプチャを実行する(ループバック ICMP の例)

tshark -i <インターフェース> でキャプチャが始まります。
ここでは lo(ループバック)を対象に、ping が生成する ICMP パケットを取得した実測結果を見てみます。

tshark ループバックキャプチャ実測(ICMP 14パケット)
tshark ループバックキャプチャ実測(ICMP 14パケット)
tshark -i lo ライブキャプチャ端末セッション
tshark -i lo ライブキャプチャ端末セッション



ubuntu@linuxlab: ~
# バックグラウンドで ping を流しながらキャプチャ
$ ping -c 8 127.0.0.1 -i 0.25 &
$ tshark -i lo -a duration:4 -T fields \
-e frame.number -e frame.time_relative \
-e ip.src -e ip.dst -e _ws.col.Protocol -e frame.len
1 0.000000000 127.0.0.1 127.0.0.1 ICMP 98
2 0.000007224 127.0.0.1 127.0.0.1 ICMP 98
3 0.256977440 127.0.0.1 127.0.0.1 ICMP 98
4 0.256980125 127.0.0.1 127.0.0.1 ICMP 98
5 0.511978871 127.0.0.1 127.0.0.1 ICMP 98
6 0.511981717 127.0.0.1 127.0.0.1 ICMP 98

14 packets captured

フレーム1と2が約7マイクロ秒差のペアになっています。奇数フレームが Echo Request(送信)、偶数フレームが Echo Reply(受信)です。
約 256ms ごとにペアが来るのは、-i 0.25(0.25 秒間隔)を指定したためです。

主要なオプションをまとめます。

オプション 意味 使用例
-i eth0 キャプチャ対象インターフェース -i any で全 IF
-c 100 パケット数で自動停止 100 パケットで終了
-a duration:10 秒数で自動停止 10 秒で終了
-w file.pcap pcap ファイルに保存 後から解析できる
-T fields -e ... 特定フィールドのみ抽出 TSV 形式で出力

4. pcap ファイルに保存してあとから解析する

ライブキャプチャをそのまま端末に流すと確認が難しいです。-w で pcap 保存してから -r で読み直す方法が実運用に向いています。




ubuntu@linuxlab: ~
# キャプチャして保存(4秒間)
$ tshark -i lo -a duration:4 -w /tmp/capture.pcap
14 packets captured

# 全パケットを読み直して表示
$ tshark -r /tmp/capture.pcap -T fields \
-e frame.number -e ip.src -e ip.dst \
-e _ws.col.Protocol -e frame.len
1 127.0.0.1 127.0.0.1 ICMP 98
2 127.0.0.1 127.0.0.1 ICMP 98
3 127.0.0.1 127.0.0.1 ICMP 98
4 127.0.0.1 127.0.0.1 ICMP 98
… (全 14 フレーム)

pcap は Wireshark の GUI でも開けますし、Python の scapydpkt でスクリプト処理もできます。
まず保存、あとから解析が pcap ワークフローの基本です。

5. 表示フィルタの書き方(-Y オプション)

tshark の表示フィルタは -Y '式' で指定します。
フィールド名はドット区切り(ip.src tcp.port icmp.type など)です。

tshark 表示フィルタ実測(icmp / icmp.type==8 / プロトコル統計)
tshark 表示フィルタ実測(icmp / icmp.type==8 / プロトコル統計)
tshark フィルタ + 統計コマンドの端末セッション
tshark フィルタ + 統計コマンドの端末セッション



ubuntu@linuxlab: ~
# すべての ICMP パケットを抽出
$ tshark -r /tmp/capture.pcap -Y ‘icmp’
1 127.0.0.1 → 127.0.0.1 ICMP 98 Echo (ping) request
2 127.0.0.1 → 127.0.0.1 ICMP 98 Echo (ping) reply
3 127.0.0.1 → 127.0.0.1 ICMP 98 Echo (ping) request
4 127.0.0.1 → 127.0.0.1 ICMP 98 Echo (ping) reply

# Echo Request だけ(type=8)
$ tshark -r /tmp/capture.pcap -Y ‘icmp.type==8’ -T fields \
-e frame.number -e frame.time_relative -e frame.len
1 0.000000 98
3 0.256977 98
5 0.511978 98
7 0.768977 98

# 特定 IP を含む全パケット
$ tshark -r /tmp/capture.pcap -Y ‘ip.addr==192.168.1.1’
# TCP ポート 80 の通信のみ
$ tshark -r /tmp/capture.pcap -Y ‘tcp.port==80’

フィルタには比較演算子(== != > <)と論理演算子(&& / and|| / or! / not)が使えます。
たとえば「ポート 80 以外の TCP」は tcp and not tcp.port==80 と書きます。

6. 統計コマンド(プロトコル階層・I/O タイムライン)

-z オプションで豊富な統計が取れます。実測で使い勝手の良かった2つを紹介します。

①プロトコル階層統計(-z io,phs)




ubuntu@linuxlab: ~
$ tshark -r /tmp/capture.pcap -q -z io,phs
===================================================================
Protocol Hierarchy Statistics
Filter:

eth frames:14 bytes:1372
ip frames:14 bytes:1372
icmp frames:14 bytes:1372
===================================================================

-q(quiet)を付けると個別パケットを表示せず統計だけを出します。
このキャプチャは ICMP しか流れていないため、eth → ip → icmp の 3 層がそれぞれ 14 フレーム・1372 バイトになっています。
実際のサーバーを見ると TCP・UDP・DNS など多層にわたる階層が見えます。

②I/O 時系列統計(-z io,stat)




ubuntu@linuxlab: ~
$ tshark -r /tmp/capture.pcap -q -z io,stat,1
=============================
| IO Statistics |
| |
| Duration: 1.535983 secs |
| Interval: 1 secs |
|—————————|
| |1 |
| Interval | Frames | Bytes |
|—————————|
| 0 <> 1 | 8 | 784 |
| 1 <> End| 6 | 588 |
=============================

最後の引数が集計間隔(秒)です。io,stat,1 なら 1 秒ごと、io,stat,0.5 なら 0.5 秒ごとに集計します。
突発的なトラフィック増加の検出にも使えます。

7. フィルタ式のデバッグ方法

間違ったフィルタを書いたとき、tshark は即座にエラーメッセージを出します。
これを手がかりに修正するのがデバッグの基本です。




ubuntu@linuxlab: ~
# 有効なフィルタ(エラーなし)
$ tshark -r /tmp/capture.pcap -Y ‘icmp’ -c 0
0 packets captured

# 無効なフィルタ(エラーあり)
$ tshark -r /tmp/capture.pcap -Y ‘invalid.xyz’
tshark: “invalid.xyz” is neither a field nor a protocol name.
invalid.xyz

# フィールド名の確認(ip. で始まるものを検索)
$ tshark -G fields | grep -E “^F\s+ip\.src”
F Source Address ip.src IP ip FT_IPv4

正式なフィールド名は tshark -G fields で全一覧が出ます。数万行あるので grep と組み合わせて使います。
"is neither a field nor a protocol name" が出たらフィールド名のタイポを疑いましょう。

8. 表示フィルタ早見表

tshark 表示フィルタ早見表(よく使うパターン)
tshark 表示フィルタ早見表(よく使うパターン)
フィルタ式 説明 用途
icmp すべての ICMP パケット ping の往復を確認
icmp.type==8 ICMP Echo Request のみ 送信パケットだけ見たい
icmp.type==0 ICMP Echo Reply のみ 応答パケットだけ見たい
ip.addr==192.168.1.1 特定 IP を含む全通信 1台だけ追いたい
ip.src==10.0.0.1 送信元 IP が 10.0.0.1 特定ホストの送信のみ
tcp.port==80 TCP ポート 80(HTTP) HTTP 通信の確認
tcp.flags.syn==1 TCP SYN フラグが立っている 接続試行の検出
dns DNS クエリ/応答 名前解決の追跡
frame.len > 1000 フレーム長 1000 バイト超 大きなパケットの検出
!(arp or icmp) ARP と ICMP を除外 ノイズ除去

フィルタは複数条件を and / or でつなげます。
たとえば「送信元 192.168.1.5 からの TCP 通信のみ」は ip.src==192.168.1.5 and tcp です。

9. よくあるエラーと対処

注意

次のエラーはコンテナや VPS で tshark を使い始めたときに頻出します。

エラーメッセージ 原因 対処
Permission denied (キャプチャ時) NET_ADMIN / NET_RAW 権限が不足 Docker なら --cap-add=NET_ADMIN --cap-add=NET_RAW を追加
"invalid.xyz" is neither a field nor a protocol name フィルタ式のタイポ tshark -G fields | grep 目的のキーワード でフィールド名を確認
The capture session could not be initiated on interface インターフェース名が間違っている tshark -D で正しいインターフェース名を確認
File "/dev/null" is a special file -r /dev/null は使えない 有効な pcap ファイルパスを指定する

まとめ

  • Ubuntu 24.04 では apt install tshark で tshark 4.2.2 が入る(22.04 は 3.6.2)
  • tshark -i lo -a duration:4 でループバックの ICMP を実際に 14 フレーム取得できた
  • キャプチャを -w で pcap 保存し -r で読み直すのが実運用の基本フロー
  • 表示フィルタは -Y 'icmp.type==8' のような形式。フィールド名は tshark -G fields で確認
  • -z io,phs でプロトコル階層統計、-z io,stat,1 で 1 秒ごとの I/O 統計が取れる
  • 無効なフィルタは “is neither a field nor a protocol name” エラーで即検出できる

tshark は GUI 版の Wireshark と同じエンジンで動くので、フィルタ構文はそのまま両方で使えます。
コマンドラインに慣れてきたら GUI との組み合わせも試してみてください。

VPS 上で本番サービスを動かしながらパケット解析をしたい場合は、まず VPS 選びから始める必要があります。

コメント

タイトルとURLをコピーしました