tsharkコマンドでLinuxのパケット解析をスクリプト化する方法|tcpdumpとの違い・フィールド抽出・JSON出力の実践手順

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxコマンド > ネットワーク管理コマンド > tsharkコマンドでLinuxのパケット解析をスクリプト化する方法|tcpdumpとの違い・フィールド抽出・JSON出力の実践手順
「tcpdumpでパケットをキャプチャしているけど、IPアドレスとポートだけをCSVに取り出したい」
「WiresharkのDisplay Filterをコマンドラインで使いたい」

ネットワーク障害を調べているとき、tcpdumpは頼りになります。ただ「フィールドを選んで出力したい」「シェルスクリプトで集計したい」となると、awkやsedを組み合わせる必要があり一手間かかります。

そこで使うべきがtsharkです。tsharkはWiresharkのコマンドライン版で、GUIなしのLinuxサーバー上でWiresharkと同じDisplay Filterを使いながら、指定したフィールドだけをCSVやJSONとして出力できます。

この記事では、RHEL/Rocky Linux・Ubuntu環境へのtsharkのインストールから、基本キャプチャ、-T fields/-eでのフィールド抽出、pcapファイルのオフライン解析、シェルスクリプトとの組み合わせによる集計自動化まで解説します。動作確認はRocky Linux 9.4とUbuntu 24.04 LTSで行っています。

この記事のポイント

・tsharkはWiresharkのCLI版でDisplay Filterが使える
・-T fields -e でフィールドを選んでCSV/TSV出力できる
・pcapファイルを読み込んでオフライン解析も可能
・root権限なしで使うにはwiresharkグループ設定が必要


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

tsharkとtcpdumpの違い|なぜtsharkを使うのか

tcpdumpとtsharkはどちらもLinux上でパケットをキャプチャできますが、使い所が異なります。

tcpdumpはBPF(Berkeley Packet Filter)フィルタを使ってキャプチャを絞り込み、シンプルなテキスト形式で出力します。軽量で汎用性が高く、ほぼすべてのLinuxに標準搭載されているため「とりあえず見たい」ときに向いています。

一方、tsharkはWiresharkのDisplay Filterが使えます。「http.request.method == "GET"」「tcp.flags.syn == 1 && tcp.flags.ack == 0」のように、プロトコルを意識した絞り込みが書けます。さらに-T fieldsと-eの組み合わせで「IPアドレスだけ」「ポートだけ」という出力も可能で、シェルスクリプトとの親和性が高いのが特徴です。

比較項目 tcpdump tshark
フィルタ書式 BPFフィルタのみ BPFフィルタ + Display Filter
フィールド選択出力 不可(awk加工が必要) 可(-T fields -e)
JSON出力 不可 可(-T json)
プロトコル解析の深さ 基本ヘッダのみ アプリケーション層まで
標準搭載 多くのLinuxに標準搭載 別途インストールが必要

tsharkのインストール方法

1. RHEL/Rocky Linux(dnf)

Rocky Linux 9.4での手順です。tsharkはwiresharkパッケージに含まれますが、CLIのみ使う場合はwireshark-cliパッケージだけで十分です。

# EPELリポジトリが必要(未設定の場合) $ sudo dnf install epel-release # wireshark-cli(tsharkとdumpcap)をインストール $ sudo dnf install wireshark-cli # インストール確認 $ tshark --version TShark (Wireshark) 4.0.10

2. Ubuntu/Debian(apt)

# tsharkをインストール $ sudo apt install tshark # インストール時に「非rootユーザーにキャプチャを許可しますか?」ダイアログが表示される # "Yes"を選ぶとwiresharkグループが作成され、所属ユーザーがキャプチャ可能になる

3. dumpcapグループへの追加(root権限なしでキャプチャする)

インストール後、そのまま一般ユーザーで実行すると「Couldn't run /usr/bin/dumpcap in child process: Permission denied」エラーが出ます。wiresharkグループに追加することで解決できます。

# ユーザーをwiresharkグループに追加 $ sudo usermod -aG wireshark $(whoami) # グループを即時反映(再ログインするか newgrp を使う) $ newgrp wireshark # 確認:グループに追加されているか $ groups tomohiro wheel wireshark # dumpcapのパーミッションを確認 $ ls -l /usr/bin/dumpcap -rwxr-xr-- 1 root wireshark 106504 ... /usr/bin/dumpcap

基本的なパケットキャプチャ手順

1. インターフェース一覧の確認

まずどのインターフェース名でキャプチャするかを確認します。

$ tshark -D 1. eth0 2. lo (Loopback) 3. any 4. nflog 5. nfqueue

2. キャプチャの開始と停止

-iでインターフェースを指定し、-cでパケット数を指定すると自動停止します。

# eth0で5パケットだけキャプチャ $ tshark -i eth0 -c 5 Capturing on 'eth0' 1 0.000000000 192.168.10.5 → 192.168.10.1 TCP 74 52398 → 22 [SYN] Seq=0 Win=65535 Len=0 2 0.000234156 192.168.10.1 → 192.168.10.5 TCP 74 22 → 52398 [SYN, ACK] Seq=0 Ack=1 3 0.000489213 192.168.10.5 → 192.168.10.1 TCP 66 52398 → 22 [ACK] Seq=1 Ack=1 4 0.001023456 192.168.10.1 → 192.168.10.5 SSHv2 202 Server: Key Exchange Init 5 0.001345678 192.168.10.5 → 192.168.10.1 SSHv2 710 Client: Key Exchange Init 5 packets captured

3. BPFフィルタとDisplay Filterで絞り込む

tsharkはBPFフィルタ(-f)と、Wireshark独自のDisplay Filter(-Y)の両方を使えます。

# BPFフィルタ: ポート80のみキャプチャ(キャプチャ段階で絞り込む) $ tshark -i eth0 -f "port 80" -c 10 # Display Filter: SYNパケットだけ表示(-Y で表示段階で絞り込む) $ tshark -i eth0 -Y "tcp.flags.syn == 1 && tcp.flags.ack == 0" -c 10 # ポート80のGETリクエストのみ抽出(アプリケーション層フィルタ) $ tshark -i eth0 -Y "http.request.method == "GET""

BPFフィルタは「キャプチャする前に」フィルタリングするため、対象外パケットはメモリにも入りません。大量トラフィックの環境ではBPFフィルタを組み合わせることでパフォーマンスへの影響を最小化できます。

4. pcapファイルに保存する

後でオフライン解析するためにpcapファイルに保存しておけます。

# -w でpcapファイルに保存(60秒後に自動停止) $ tshark -i eth0 -w /tmp/capture.pcap -a duration:60 # -c でパケット数上限を指定して保存 $ tshark -i eth0 -w /tmp/capture.pcap -c 1000

フィールド指定で必要な列だけ出力する

tsharkのもっとも強力な機能が-T fieldsと-eオプションの組み合わせです。

1. -T fieldsと-eオプションの使い方

-T fieldsで出力形式をフィールド列モードに切り替え、-e フィールド名で取り出すカラムを指定します。

# 接続元IP・接続先IP・宛先ポートをCSVで出力 $ tshark -i eth0 -T fields -e ip.src -e ip.dst -e tcp.dstport -E header=y -E separator=, -c 5 ip.src,ip.dst,tcp.dstport 192.168.10.5,192.168.10.1,22 192.168.10.1,192.168.10.5, 192.168.10.5,192.168.10.1,22 192.168.10.1,192.168.10.5, 192.168.10.5,192.168.10.1,22

-E header=yでヘッダ行を追加、-E separator=,で区切り文字をカンマに変更しています。

2. よく使うフィールド名一覧

フィールド名 内容
ip.src 送信元IPアドレス
ip.dst 宛先IPアドレス
tcp.srcport 送信元ポート
tcp.dstport 宛先ポート
frame.time_epoch Unixタイムスタンプ(秒)
frame.len フレームサイズ(バイト)
http.host HTTPホストヘッダ
http.request.uri HTTPリクエストURI
dns.qry.name DNSクエリのホスト名
dns.a DNS Aレコードの応答IPアドレス
フィールド名はtshark -G fieldsですべて確認できます(数千件あるのでgrepで絞り込む)。

# HTTPプロトコルのフィールド一覧を確認 $ tshark -G fields | grep "^F\s*http\." | head -20

3. DNSクエリをリアルタイム監視する実例

Linuxサーバーがどのホスト名に問い合わせているかをリアルタイムで追いたいときの例です。名前解決に失敗する問題の調査に役立ちます。Linux DNS 設定の基本と組み合わせて、resolv.confの設定確認と合わせて使うと効果的です。

$ tshark -i eth0 -Y "dns.flags.response == 0" -T fields -e frame.time_epoch -e ip.src -e dns.qry.name -E separator=$' ' 1699320001.123456 192.168.10.5 api.example.com 1699320001.234567 192.168.10.5 mail.example.com 1699320002.345678 192.168.10.5 cdn.example.com

pcapファイルをオフライン解析する

事前に保存したpcapファイルを解析するには-rオプションを使います。本番環境でキャプチャしたファイルを手元の環境で解析するワークフローで便利です。

# pcapファイルから特定のフィールドを抽出 $ tshark -r /tmp/capture.pcap -T fields -e ip.src -e ip.dst -e tcp.dstport -E header=y -E separator=, # JSON形式で出力してjqと組み合わせる $ tshark -r /tmp/capture.pcap -T json | jq -r '.[].layers.ip."ip.src"' | sort | uniq -c | sort -rn | head -10

シェルスクリプトで通信量の多いIPを集計する

tsharkの真価は、シェルスクリプトと組み合わせた自動化です。以下はサーバーの通信先トップ10を集計するスクリプトの例です。開いているポートの状態を把握したい場合はLinux ポート確認の全コマンドも合わせて確認してみてください。

#!/bin/bash # top-talkers.sh: 過去60秒間の通信先IPトップ10を集計する INTERFACE="${1:-eth0}" DURATION=60 echo "インターフェース: ${INTERFACE} / キャプチャ時間: ${DURATION}秒" tshark -i "${INTERFACE}" -a duration:${DURATION} -T fields -e ip.dst 2>capture-error.log | grep -E '^[0-9]+\.' | sort | uniq -c | sort -rn | head -10 | awk '{printf "%6d パケット → %s ", $1, $2}'

実行例:

$ bash top-talkers.sh eth0 インターフェース: eth0 / キャプチャ時間: 60秒 3842 パケット → 203.0.113.10 2156 パケット → 198.51.100.5 891 パケット → 192.168.10.1 524 パケット → 203.0.113.20 312 パケット → 192.0.2.100

スクリプト内ではtsharkの標準エラー(キャプチャ統計の表示)をログファイルに退避しています。2>/dev/nullで捨ててしまうと本物のエラー(Permission denied等)も見えなくなるため、ファイルに残しておくのが安全です。

tsharkが動かない時のトラブルシュート

1. Couldn't run /usr/bin/dumpcap in child process: Permission denied

もっともよく遭遇するエラーで、一般ユーザーでキャプチャ権限がない場合に発生します。

# ユーザーをwiresharkグループに追加して再ログイン $ sudo usermod -aG wireshark $(whoami) $ newgrp wireshark # sudoで実行する場合(グループ設定の代替) $ sudo tshark -i eth0 -c 5

2. インターフェース名が違ってキャプチャできない

仮想マシンやクラウドではインターフェース名がens3・ens5・enpXsYのように変わります。

# まずインターフェース一覧を確認 $ tshark -D 1. ens5 2. lo (Loopback) 3. any # anyを指定すれば全インターフェースをキャプチャできる $ tshark -i any -c 10

3. キャプチャは動いているがパケットが表示されない

フィルタが厳しすぎる場合や、トラフィックがない場合に起こります。まずフィルタなしで確認してみましょう。

# フィルタなしでキャプチャ(まず動作確認) $ tshark -i eth0 -c 5 # 別ターミナルからpingを打ってパケットが見えるか確認 $ ping -c 3 192.168.10.1

本記事のまとめ

やりたいこと コマンド
インターフェース一覧を確認する tshark -D
基本キャプチャ(5パケット) tshark -i eth0 -c 5
Display Filterで絞り込む tshark -i eth0 -Y "tcp.flags.syn == 1"
フィールドをCSVで出力 tshark -i eth0 -T fields -e ip.src -e ip.dst -E separator=,
pcapファイルを保存する tshark -i eth0 -w capture.pcap -a duration:60
pcapファイルを解析する tshark -r capture.pcap -T fields -e ip.src
JSON形式で出力する tshark -r capture.pcap -T json
DNSクエリを監視する tshark -i eth0 -Y "dns.flags.response==0" -T fields -e dns.qry.name
tsharkはtcpdumpの「とりあえず見る」から一歩進んで、「特定のフィールドを抽出してスクリプトで処理する」用途に向いています。特にCSVやJSONへの出力はログ収集・可視化・アラート自動化との連携で力を発揮します。

Linuxサーバーのネットワーク診断をコマンドラインで完結させたい方は、ぜひtsharkをツールセットに加えてみてください。体系的なLinuxサーバー管理スキルはセミナー情報ページからご確認いただけます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の実務経験に基づいたLinux Master Pro Seminarを開催しています。ネットワーク診断からサーバー設計まで、実機ハンズオンで学べる2日間プログラムです。
>> Linux Master Pro Seminar 詳細はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。