「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グループ設定が必要
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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""
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
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 |
Linuxサーバーのネットワーク診断をコマンドラインで完結させたい方は、ぜひtsharkをツールセットに加えてみてください。体系的なLinuxサーバー管理スキルはセミナー情報ページからご確認いただけます。
>> Linux Master Pro Seminar 詳細はこちら
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:nmcliでLinuxブリッジを設定する方法|KVMや仮想化環境のブリッジネットワーク設計と動作確認
- この記事の属するカテゴリ:ネットワーク管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます