TShark徹底解説:コマンドラインでのパケットキャプチャと解析ガイド 🦈

セキュリティツールネットワーク

ネットワークのトラブルシューティングやセキュリティ分析において、パケットキャプチャは非常に重要な手法です。Wiresharkはその代表的なツールですが、GUIが使えない環境や自動化したい場合には、コマンドライン版のTSharkが強力な味方となります。 このブログ記事では、TSharkの基本的な使い方から、フィルタリング、フィールド抽出、統計情報の取得、ファイルの操作といった応用的なテクニックまで、網羅的に解説します。この記事を読めば、あなたもTSharkマスターになれるはずです!💪

1. TSharkとは? 🤔

TSharkは、広く使われているネットワークプロトコルアナライザWiresharkのコマンドライン版です。Wiresharkと同様に、ライブネットワークからパケットデータをキャプチャしたり、保存されたキャプチャファイルからパケットを読み込んだりすることができます。 デコードされたパケット情報を標準出力に表示したり、ファイルに書き出したりすることが可能です。

TSharkはWiresharkと同じパケットキャプチャライブラリ(libpcap/Npcap)と解析エンジンを使用しているため、Wiresharkが対応している多くのプロトコルを解析できます。 デフォルトのキャプチャファイル形式はpcapng形式で、これはWiresharkや他の多くのツールでも使用されています。

オプションを指定しない場合、TSharkは古典的なパケットキャプチャツールであるtcpdumpと似た動作をします。利用可能な最初のネットワークインターフェースからトラフィックをキャプチャし、受信した各パケットの要約行を標準出力に表示します。 しかし、TSharkの真価は、豊富なオプションによる高度なフィルタリング、フィールド抽出、統計情報生成にあります。

💡 TSharkの主な利点

  • CUI環境での利用: SSH接続したリモートサーバーなど、GUIが利用できない環境でパケットキャプチャ・解析が可能。
  • 自動化・スクリプティング: シェルスクリプトや他のプログラムと連携して、パケットキャプチャや解析処理を自動化できる。
  • リソース消費: GUIがない分、Wiresharkよりも少ないリソースで動作する可能性がある(特に大量のパケットを扱う場合)。
  • 強力な解析機能: Wiresharkと同等の強力な表示フィルタや解析機能を利用できる。

インストール方法

TSharkのインストール方法はOSによって異なります。

  • Windows: Wiresharkのインストーラに含まれています。Wiresharkをインストールすると、通常 C:\Program Files\Wireshark ディレクトリ内に tshark.exe が配置されます。
  • Debian/Ubuntu: tshark パッケージとして個別に提供されています。以下のコマンドでインストールできます。
    sudo apt update
    sudo apt install tshark
    インストール中に、一般ユーザーにキャプチャ権限を与えるかどうか尋ねられます。通常は「はい」を選択すると便利ですが、セキュリティリスクも考慮してください。
  • Red Hat/CentOS/Fedora: wireshark-cli パッケージ(古いバージョンでは wireshark パッケージ)に含まれています。
    # Fedora
    sudo dnf install wireshark-cli
    
    # RHEL/CentOS Stream
    sudo yum install wireshark-cli
  • macOS: Wiresharkを公式サイトからダウンロードしてインストールするか、Homebrewを使う場合は以下のコマンドでインストールできます。
    brew install wireshark

インストール後、ターミナル(コマンドプロンプト)で以下のコマンドを実行して、バージョン情報が表示されれば成功です。

tshark --version

2. 基本的な使い方 🚀

TSharkの基本的な使い方を見ていきましょう。

利用可能なインターフェースの表示

まず、どのネットワークインターフェースでキャプチャできるかを確認します。-D オプションを使用します。

tshark -D

実行すると、番号とインターフェース名のリストが表示されます。

1. eth0
2. wlan0
3. any (Pseudo-device that captures on all interfaces)
4. lo (Loopback)
5. docker0
...

⚠️ 注意: Linux環境などでroot権限なしで tshark -D やキャプチャを実行しようとすると、権限エラーになることがあります。その場合、sudo を先頭につけて実行するか、ユーザーを wireshark グループに追加するなどの設定が必要です(後述)。

パケットキャプチャの開始と停止

キャプチャしたいインターフェースが決まったら、-i オプションでそのインターフェースを指定してTSharkを実行します。インターフェースは名前(例: eth0, wlan0)または番号(例: 1, 2)で指定できます。

# インターフェース名で指定
sudo tshark -i eth0

# インターフェース番号で指定
sudo tshark -i 1

-i を省略した場合、TSharkは -D で表示されるリストの最初のインターフェース(通常は主要な有線または無線LANインターフェース)を選択します。

キャプチャが開始されると、パケット情報がリアルタイムでコンソールに表示されます。キャプチャを停止するには Ctrl + C を押します。停止すると、キャプチャされたパケットの総数などの統計情報が表示されます。

キャプチャするパケット数を指定する

特定の数のパケットをキャプチャしたら自動的に停止させたい場合は、-c オプションを使用します。

# 100パケットキャプチャしたら停止
sudo tshark -i eth0 -c 100

キャプチャ時間を指定する

特定の時間だけキャプチャを実行したい場合は、-a duration:<秒数> オプションを使用します。

# 60秒間キャプチャしたら停止
sudo tshark -i eth0 -a duration:60

-a オプションには他にも filesize:<kB>(指定したファイルサイズに達したら停止)や files:<数>(指定したファイル数を作成したら停止、後述のリングバッファと併用)といった条件を指定できます。

名前解決を無効にする

デフォルトでは、TSharkはIPアドレスやポート番号をホスト名やサービス名に解決しようとします(例: 8.8.8.8dns.google、ポート 80http)。これにより出力が見やすくなることがありますが、DNSクエリなどが発生するため、キャプチャ自体に影響を与えたり、処理が遅くなったりすることがあります。 名前解決を無効にして、IPアドレスとポート番号をそのまま表示するには -n オプションを使用します。

sudo tshark -i eth0 -n

一般的に、トラブルシューティングや解析時には -n オプションを付けて、生の情報を確認することが推奨されます。

3. パケットフィルタリング 🚦

ネットワーク上には膨大な量のパケットが流れています。目的のパケットだけを効率よく見つけるためには、フィルタリングが不可欠です。TSharkには大きく分けて2種類のフィルタがあります。

キャプチャフィルタ (-f オプション)

キャプチャフィルタは、パケットをキャプチャする段階で適用されるフィルタです。指定した条件に一致するパケットのみがキャプチャされ、保存されたり表示されたりします。これにより、不要なパケットを最初から除外できるため、キャプチャファイルのサイズを小さく抑えたり、処理の負荷を軽減したりする効果があります。

キャプチャフィルタは、libpcapライブラリで使用されるBPF (Berkeley Packet Filter) 構文で記述します。これはtcpdumpコマンドで使用される構文と同じです。

-f オプションに続けてフィルタ式を文字列で指定します。

コマンド例 説明
sudo tshark -i eth0 -f "host 192.168.1.1" IPアドレスが 192.168.1.1 のホストに関連するパケットのみをキャプチャ(送受信両方)
sudo tshark -i eth0 -f "src host 192.168.1.1" 送信元IPアドレスが 192.168.1.1 のパケットのみをキャプチャ
sudo tshark -i eth0 -f "dst host 8.8.8.8" 宛先IPアドレスが 8.8.8.8 のパケットのみをキャプチャ
sudo tshark -i eth0 -f "net 192.168.1.0/24" 192.168.1.0/24 のネットワークに関連するパケットのみをキャプチャ
sudo tshark -i eth0 -f "port 80" TCPまたはUDPのポート番号が 80 のパケットのみをキャプチャ(送受信両方)
sudo tshark -i eth0 -f "tcp port 80" TCPポート番号が 80 のパケットのみをキャプチャ
sudo tshark -i eth0 -f "udp port 53" UDPポート番号が 53 のパケットのみをキャプチャ
sudo tshark -i eth0 -f "host 192.168.1.1 and port 443" IPアドレスが 192.168.1.1 で、かつポート番号が 443 のパケットをキャプチャ
sudo tshark -i eth0 -f "port 80 or port 443" ポート番号が 80 または 443 のパケットをキャプチャ
sudo tshark -i eth0 -f "icmp" ICMPプロトコルのパケットのみをキャプチャ (pingなど)
sudo tshark -i eth0 -f "not host 192.168.1.254" IPアドレスが 192.168.1.254 ではないパケットをキャプチャ

キャプチャフィルタはカーネル空間で動作することが多く(OSやドライバによります)、非常に高速に動作します。大量のトラフィックの中から特定の通信だけを効率的に抜き出す場合に有効です。

表示フィルタ (-Y オプション)

表示フィルタは、キャプチャされた(またはファイルから読み込まれた)すべてのパケットの中から、表示するパケットを選択するためのフィルタです。キャプチャフィルタとは異なり、パケットのキャプチャ自体には影響を与えません。

表示フィルタはWiresharkのGUIで使われるものと同じ、より強力で詳細なフィルタ構文を使用します。プロトコルの詳細なフィールドに基づいた、複雑な条件を指定できます。

-Y オプションに続けてフィルタ式を文字列で指定します。(古いバージョンでは -R オプションが使われていましたが、現在は -Y が推奨されます)

コマンド例 説明
tshark -r capture.pcap -Y "ip.addr == 192.168.1.1" IPアドレスが 192.168.1.1 のパケットを表示(送受信両方)
tshark -r capture.pcap -Y "ip.src == 192.168.1.1" 送信元IPアドレスが 192.168.1.1 のパケットを表示
tshark -r capture.pcap -Y "ip.dst == 8.8.8.8" 宛先IPアドレスが 8.8.8.8 のパケットを表示
tshark -r capture.pcap -Y "tcp.port == 80" TCPポート番号が 80 のパケットを表示
tshark -r capture.pcap -Y "udp.port == 53" UDPポート番号が 53 のパケットを表示
tshark -r capture.pcap -Y "http" HTTPプロトコルのパケットを表示 (TCPポート80だけでなく、他のポートでやり取りされるHTTPも含む)
tshark -r capture.pcap -Y "dns" DNSプロトコルのパケットを表示 (通常 UDP/53 だが TCP/53 も含む)
tshark -r capture.pcap -Y "http.request" HTTPリクエストメソッドを含むパケットを表示
tshark -r capture.pcap -Y "http.response.code == 404" HTTPステータスコードが 404 (Not Found) のパケットを表示
tshark -r capture.pcap -Y "tcp.flags.syn == 1 && tcp.flags.ack == 0" TCP SYNパケット(接続開始要求)を表示
tshark -r capture.pcap -Y "ip.addr == 192.168.1.1 && tcp.port == 443" IPアドレスが 192.168.1.1 で、かつTCPポートが 443 のパケットを表示
tshark -r capture.pcap -Y "http || dns" HTTPまたはDNSのパケットを表示
tshark -r capture.pcap -Y "!(ip.addr == 192.168.1.254)" IPアドレスが 192.168.1.254 ではないパケットを表示
tshark -r capture.pcap -Y "frame contains \"Example String\"" パケットデータ内に “Example String” という文字列を含むパケットを表示 (検索対象が大きいと遅くなる可能性あり)

表示フィルタは非常に多くのフィールド(プロトコルヘッダの各フィールド、解析によって得られる情報など)を指定でき、複雑な条件式も記述可能です。WiresharkのGUI上部のフィルタ入力欄で利用できる全ての構文が使えます。

キャプチャフィルタと表示フィルタの使い分け ✨

🤔 どっちを使う?

  • キャプチャフィルタ (-f):
    • ライブキャプチャ時に、最初から不要なパケットを除外し、キャプチャ対象を絞り込みたい場合。
    • キャプチャファイルのサイズを抑えたい場合。
    • 高負荷なネットワーク環境で、キャプチャの取りこぼしを防ぎたい場合。
    • フィルタ条件が比較的単純(IPアドレス、ポート、プロトコルなど)な場合。
  • 表示フィルタ (-Y):
    • キャプチャ済みのファイル(.pcapなど)を解析する際に、特定の条件でパケットを表示したい場合。
    • プロトコルの詳細なフィールド(HTTPメソッド、TCPフラグ、DNSクエリ名など)に基づいてフィルタリングしたい場合。
    • 複数の条件を組み合わせて複雑なフィルタリングを行いたい場合。
    • ライブキャプチャ時でも、とりあえず全パケットをキャプチャしておき、後から表示を絞り込みたい場合(ただし、-w オプションでファイルに保存する場合は表示フィルタは適用されない点に注意)。

基本的には、ライブキャプチャ時には -f で大まかに絞り込み、ファイルに保存した後に -Y を使って詳細な解析を行う、という流れが一般的です。

4. 特定のフィールドの抽出 🎯

TSharkの強力な機能の一つが、パケットから特定のフィールド(情報)だけを抽出して表示する機能です。これにより、必要な情報だけを抜き出してCSV形式で保存したり、他のツールで処理したりすることが容易になります。

この機能は主に -T fields オプションと -e オプションを組み合わせて使用します。

  • -T fields: 出力形式をフィールド抽出モードに設定します。
  • -e <フィールド名>: 抽出したいフィールド名を指定します。このオプションは複数回指定することで、複数のフィールドを抽出できます。

フィールド名は、WiresharkのGUIでパケット詳細を表示した際に左下に表示される名前や、表示フィルタで使用する名前と同じものを使用します。

基本的なフィールド抽出

# キャプチャファイルから、フレーム番号、時刻、送信元/宛先IP、プロトコルを抽出
tshark -r capture.pcap -T fields -e frame.number -e frame.time -e ip.src -e ip.dst -e frame.protocols

デフォルトでは、フィールド間はタブ文字で区切られます。

区切り文字とヘッダーの指定

-E オプションを使うと、出力形式をさらにカスタマイズできます。

  • -E separator=<文字>: フィールド間の区切り文字を指定します。例えばCSV形式にしたい場合は separator=, を指定します。
  • -E header=y: 出力の先頭行にフィールド名のヘッダーを追加します。
  • -E quote=d: フィールド値をダブルクォーテーション(")で囲みます(CSVなどでカンマを含む値を扱う場合に便利)。quote=s でシングルクォーテーション、quote=n で囲みません(デフォルト)。
  • -E occurrence=f: 同じ名前のフィールドが複数存在する場合(例: HTTPヘッダー)、最初のものだけを表示します。occurrence=l で最後のもの、occurrence=a で全て(区切り文字で連結)を表示します。
# TCP通信の送信元/宛先IP、ポート、ペイロード長をCSV形式でヘッダー付きで出力
tshark -r capture.pcap -Y "tcp" -T fields -e ip.src -e tcp.srcport -e ip.dst -e tcp.dstport -e tcp.len -E header=y -E separator=, -E quote=d > tcp_data.csv

これにより、tcp_data.csv というファイルに以下のような内容が出力されます。

"ip.src","tcp.srcport","ip.dst","tcp.dstport","tcp.len"
"192.168.1.10","54321","192.168.1.1","443","0"
"192.168.1.1","443","192.168.1.10","54321","0"
"192.168.1.10","54321","192.168.1.1","443","128"
...

よく使われるフィールド名の例

抽出可能なフィールド名は非常に多く存在します。Wiresharkの Display Filter Reference で確認できます。以下によく使われる例を挙げます。

カテゴリフィールド名説明
フレームframe.numberフレーム番号
frame.timeフレームの到着時刻
frame.lenフレーム全体の長さ(バイト)
frame.protocolsフレームに含まれるプロトコルスタック (例: eth:ip:tcp:http)
イーサネットeth.src送信元MACアドレス
eth.dst宛先MACアドレス
eth.typeイーサタイプ (例: 0x0800 for IPv4)
IPip.src送信元IPv4アドレス
ip.dst宛先IPv4アドレス
ip.protoIPプロトコル番号 (例: 6 for TCP, 17 for UDP)
ip.lenIPヘッダ + データ長
IPv6ipv6.src送信元IPv6アドレス
ipv6.dst宛先IPv6アドレス
ipv6.nxt次ヘッダ (プロトコル番号)
ipv6.plenペイロード長
TCPtcp.srcport送信元TCPポート
tcp.dstport宛先TCPポート
tcp.lenTCPセグメントデータ長 (ペイロード長)
tcp.seqシーケンス番号
tcp.ack確認応答番号
tcp.flags.syn, .ack, .fin, .rst, .push, .urg各TCPフラグ (1 or 0)
UDPudp.srcport送信元UDPポート
udp.dstport宛先UDPポート
udp.lengthUDPヘッダ + データ長
HTTPhttp.request.methodリクエストメソッド (GET, POSTなど)
http.request.uriリクエストURI
http.hostHostヘッダーの値
http.user_agentUser-Agentヘッダーの値
http.response.codeレスポンスステータスコード
http.content_typeContent-Typeヘッダーの値
DNSdns.qry.name問い合わせドメイン名
dns.qry.type問い合わせタイプ (A, AAAA, MXなど)
dns.resp.name応答ドメイン名
dns.a, dns.aaaa, dns.cname応答レコードの内容 (IPv4, IPv6, CNAME)

他の出力形式 (-T オプション)

-T オプションでは fields 以外にも様々な出力形式を指定できます。

  • text: デフォルトのサマリー形式。
  • ps: PostScript形式。
  • json: JSON形式。各パケットがJSONオブジェクトとして出力されます。
  • jsonraw: 生のバイトデータを含むJSON形式。
  • ek: Elasticsearch Bulk APIに適したJSON形式 (改行区切り)。
  • pdml: Packet Details Markup Language (XML形式)。Wiresharkのパケット詳細表示に近い情報が含まれます。
  • psml: Packet Summary Markup Language (XML形式)。
# HTTPとTCPとIPの情報を含んだJSON形式で出力
tshark -r capture.pcap -Y "http" -T json -j "http tcp ip" -x > http_packets.json

# Elasticsearchに取り込むための形式で出力
tshark -r capture.pcap -T ek -j "http tcp ip" -P -V -x > capture.json
# curl -H "Content-Type: application/x-ndjson" -XPOST http://elasticsearch:9200/_bulk --data-binary "@capture.json"

これらの形式を利用することで、他のツールやシステムとの連携が容易になります。📈

5. 統計情報の取得 📊

TSharkは、キャプチャデータから様々な統計情報を計算し表示する機能を持っています。これは、ネットワークの全体像を把握したり、特定の問題を診断したりするのに非常に役立ちます。-z オプションを使用します。

利用可能な統計オプションは非常に多いです。tshark -z help コマンドで一覧を確認できます。

tshark -z help

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

キャプチャファイルに含まれるプロトコルの分布(どのプロトコルがどれくらいの割合で使われているか)を表示します。トラフィックの全体像を把握するのに役立ちます。

# capture.pcap 全体のプロトコル階層を表示 (-q オプションでパケットごとの出力を抑制)
tshark -r capture.pcap -q -z io,phs

出力例:

===================================================================
Protocol Hierarchy Statistics
Filter:

eth frames:10000 bytes:12345678
  ip frames:9900 bytes:12300000
    tcp frames:9000 bytes:12000000
      http frames:500 bytes:1000000
        data-text-lines frames:100 bytes:50000
      ssl frames:8000 bytes:10500000
    udp frames:900 bytes:300000
      dns frames:800 bytes:250000
  arp frames:100 bytes:45678
===================================================================

表示フィルタと組み合わせることも可能です。

# HTTP通信に限定したプロトコル階層
tshark -r capture.pcap -q -Y "http" -z io,phs,http

エンドポイント統計 (endpoints,<type>)

指定したタイプ(例: ip, ipv6, eth, tcp, udp)のエンドポイント(通信を行っている個々のアドレスやポート)とその通信量(パケット数、バイト数)の一覧を表示します。どのホストやポートが多くの通信を行っているかを特定するのに役立ちます。

# IPv4エンドポイントの統計
tshark -r capture.pcap -q -z endpoints,ip

# TCPエンドポイント(IPアドレスとポートの組み合わせ)の統計
tshark -r capture.pcap -q -z endpoints,tcp

出力例 (endpoints,ip):

================================================================================
IPv4 Endpoints
Filter:
                |  Packets  | |   Bytes   | | Tx Packets | |  Tx Bytes | | Rx Packets | |  Rx Bytes |
192.168.1.1     |      5000 | |   6000000 | |       2000 | |   2000000 | |       3000 | |   4000000 |
192.168.1.10    |      4500 | |   5500000 | |       2500 | |   3000000 | |       2000 | |   2500000 |
8.8.8.8         |       500 | |     80000 | |        250 | |     40000 | |        250 | |     40000 |
================================================================================

会話統計 (conv,<type>)

指定したタイプ(例: ip, ipv6, eth, tcp, udp)の会話(2つのエンドポイント間の通信)とその通信量(パケット数、バイト数、通信時間など)の一覧を表示します。どのホスト間で多くの通信が行われているかを特定するのに役立ちます。

# IP会話の統計
tshark -r capture.pcap -q -z conv,ip

# TCP会話の統計
tshark -r capture.pcap -q -z conv,tcp

出力例 (conv,tcp):

================================================================================
TCP Conversations
Filter:
                                                    |       <-      | |       ->      | |     Total     | | Rel Start | | Duration |
                                                    | Frames  Bytes | | Frames  Bytes | | Frames  Bytes | |           | |          |
192.168.1.10:54321  <-> 192.168.1.1:443             |    100   12000 | |    150  180000 | |    250  192000 | 0.123456    | 10.500000  |
192.168.1.15:60000  <-> 8.8.8.8:53                  |     10     800 | |     10    1200 | |     20    2000 | 1.234567    |  0.100000  |
...
================================================================================

conv 統計の結果は、デフォルトでは総フレーム数でソートされますが、cut, awk, sort などの標準的なUNIXコマンドと組み合わせることで、特定の列(例: 送信バイト数)でソートするなど、柔軟な処理が可能です。

I/Oグラフ統計 (io,stat,<interval>[,filter]...)

指定した時間間隔 (<interval> 秒) ごとのパケット数やバイト数を集計して表示します。WiresharkのI/Oグラフ機能のCUI版のようなものです。トラフィック量の時間変化を把握するのに役立ちます。

# 10秒間隔での全体のトラフィック量
tshark -r capture.pcap -q -z io,stat,10

# 1秒間隔でのTCPトラフィックとUDPトラフィックの量
tshark -r capture.pcap -q -z io,stat,1,tcp,udp

# 60秒間隔での特定のIPアドレス(192.168.1.1)に関連するトラフィック量
tshark -r capture.pcap -q -z io,stat,60,"ip.addr==192.168.1.1"

出力例 (io,stat,10):

===================================================================
IO Statistics
Interval size: 10 secs
Column #0: Frames and bytes
-------------------------------------------------------------------
|            |1                               |
| Interval   | Frames |     Bytes             |
|---------------------------------------------|
|  0.000 <> 10.000 |   1500 |      1800000        |
| 10.000 <> 20.000 |   1200 |      1500000        |
| 20.000 <> 30.000 |   1800 |      2200000        |
...
===================================================================

その他の統計情報

他にも、特定のプロトコルに特化した統計情報を取得するオプションが多数あります。

  • -z http,stat: HTTPの統計情報(リクエストメソッド別、ステータスコード別など)
  • -z http,tree: HTTPの負荷分散統計
  • -z dns,tree: DNSの統計情報
  • -z smb,srt: SMBのサービス応答時間統計
  • -z expert: エキスパート情報(プロトコルの異常や警告など)の統計
  • -z flow,tcp,network: TCPのネットワークフロー表示
  • -z follow,tcp,ascii,192.168.1.1:80,192.168.1.10:54321: 特定のTCPストリームの内容をASCIIで表示

これらの統計機能を活用することで、大量のパケットデータの中から問題点や特徴を効率的に見つけ出すことができます。🔍

TSharkはライブキャプチャだけでなく、キャプチャファイルを読み込んで解析したり、キャプチャ結果をファイルに保存したりすることも得意です。

キャプチャファイルの読み込み (-r <ファイル名>)

既存のキャプチャファイル(.pcap, .pcapngなど、Wiresharkが読み込める形式)を読み込んで、その内容を表示したり、フィルタリングや統計処理を行ったりするには -r オプションを使用します。

# capture.pcap ファイルの内容をデフォルト形式で表示
tshark -r capture.pcap

# capture.pcap からTCPポート80の通信を表示フィルタで抽出して表示
tshark -r capture.pcap -Y "tcp.port == 80"

# capture.pcap からIPエンドポイントの統計情報を表示
tshark -r capture.pcap -q -z endpoints,ip

TSharkは多くのキャプチャファイル形式を自動で認識します。ファイル拡張子は必ずしも必要ありません。また、gzip (.gz), Zstandard (.zst), LZ4 (.lz4) で圧縮されたファイルも自動で展開して読み込むことができます(対応するライブラリが必要)。

キャプチャ結果のファイルへの書き込み (-w <ファイル名>)

ライブキャプチャしたパケットをファイルに保存するには -w オプションを使用します。このオプションを指定すると、パケットのデコード結果は標準出力には表示されなくなり、代わりに生のパケットデータが指定されたファイルに書き込まれます。

# eth0インターフェースのキャプチャ結果を output.pcapng に保存
sudo tshark -i eth0 -w output.pcapng

キャプチャ中に Ctrl + C を押すと、ファイルへの書き込みが停止され、キャプチャされたパケット数が表示されます。

⚠️ 注意: -w オプションを使用している場合、表示フィルタ (-Y) は適用されません。キャプチャフィルタ (-f) は有効です。もし、フィルタリングされたデコード結果をテキストファイルとして保存したい場合は、-w を使わずに、標準出力をリダイレクトします。

# TCPポート80の通信のデコード結果を filtered_output.txt に保存
sudo tshark -i eth0 -Y "tcp.port == 80" > filtered_output.txt

リングバッファ (-b オプション)

長時間のキャプチャを行う場合や、問題発生時だけログが残っていれば良い場合など、ディスク容量を節約しながら継続的にキャプチャを行いたい場合にリングバッファ機能が便利です。これは、指定した条件(ファイルサイズ、ファイル数、時間)に達すると、古いファイルから上書きしていく機能です。-b オプションを複数組み合わせて使用します。

  • -b filesize:<kB>: 各ファイルの最大サイズをキロバイト単位で指定します。このサイズに達すると次のファイルに切り替わります。
  • -b files:<数>: 保存するファイルの最大数を指定します。この数に達すると、最も古いファイルが削除され、新しいファイルが作成されます。
  • -b duration:<秒>: 各ファイルのキャプチャ時間を秒単位で指定します。この時間が経過すると次のファイルに切り替わります。
  • -b interval:<秒>: 指定した秒数ごとに強制的にファイルを切り替えます。
# 1ファイルあたり100MB、最大20ファイルでリングバッファを作成
# ファイル名は capture_<連番>_<日時>.pcapng のようになる
sudo tshark -i eth0 -w capture.pcapng -b filesize:100000 -b files:20

# 1ファイルあたり1時間(3600秒)、最大24ファイルでリングバッファを作成
sudo tshark -i eth0 -w capture.pcapng -b duration:3600 -b files:24

この機能は、例えば「過去24時間分のログを常に保持したい」といった場合に非常に役立ちます。💾

出力ファイル形式の指定 (-F <形式>)

-w で保存するファイルの形式を指定したい場合は -F オプションを使います。ただし、ライブキャプチャ時に -w と共に使える形式は、基盤となるキャプチャライブラリ(dumpcap)がサポートするものに限られ、通常は pcapng (デフォルト) か pcap です。

# 古い形式であるpcap形式で保存
sudo tshark -i eth0 -w output.pcap -F pcap

-F オプションを値なしで実行すると、利用可能な(読み書き可能な)ファイル形式の一覧が表示されます。

tshark -F

ファイルの圧縮 (--compress <形式>)

Wireshark/TShark 4.4.0以降では、キャプチャファイルを圧縮しながら保存する機能が追加されました。LZ4形式での圧縮がサポートされており、特に大容量ファイルの扱いに有効です。

# LZ4形式で圧縮しながら保存
sudo tshark -i eth0 -w output.pcapng.lz4 --compress lz4

LZ4形式は圧縮・展開が高速で、ランダムアクセスもサポートされているため、圧縮された状態でもWireshark GUIでの操作が比較的軽快に行えます。

7. 応用的な使い方とTips ✨

TSharkの基本的な使い方に慣れてきたら、さらに便利な応用テクニックやTipsを活用してみましょう。

複数ファイルの処理

リングバッファなどで複数のキャプチャファイルが生成された場合、それらをまとめて処理したいことがあります。-r オプションには複数のファイルを指定できます。

# capture_001.pcapng と capture_002.pcapng を連結して読み込み、DNSクエリを抽出
tshark -r capture_001.pcapng -r capture_002.pcapng -Y "dns.flags.response == 0"

また、mergecap という関連ツールを使うと、複数のキャプチャファイルを物理的に一つのファイルに結合できます。

# 複数のファイルを merged.pcapng に結合
mergecap -w merged.pcapng capture_001.pcapng capture_002.pcapng capture_003.pcapng

詳細なパケット内容の表示 (-V, -x)

デフォルトのTShark出力は1行のサマリーですが、より詳細な情報を見たい場合があります。

  • -V: 各パケットについて、WiresharkのGUIのパケット詳細ペインに相当する、デコードされた全フィールドを表示します。非常に冗長な出力になります。
  • -x: パケットの生データ(ペイロード)を16進数とASCII形式で表示します。Wiresharkのパケットバイトペインに相当します。
# 特定のパケット(フレーム番号10)の詳細情報を表示
tshark -r capture.pcap -Y "frame.number == 10" -V

# HTTP POSTリクエストのペイロードを16進数とASCIIで表示
tshark -r capture.pcap -Y "http.request.method == POST" -x

特定のTCP/UDPストリームの追跡 (-z follow,...)

特定のTCPやUDPのセッション(ストリーム)の内容だけを追跡して表示したい場合、-z follow,... オプションが便利です。

# 特定のTCPストリームの内容をASCIIで表示 (フィルタでストリームを指定)
# 事前に conv,tcp などで対象ストリームの情報を確認しておく
tshark -r capture.pcap -q -z follow,tcp,ascii,"tcp.stream eq 5"

# 特定のUDPストリームの内容をHEXで表示
tshark -r capture.pcap -q -z follow,udp,hex,"udp.stream eq 10"

出力モードには ascii, hex, raw, yaml などがあります。HTTP/2やQUICのストリーム追跡もサポートされています。

ファイルの抽出 (-z export_objects,...)

Wireshark 2.3.0 / TShark 2.3.0 以降では、HTTP, SMB, TFTP, DICOM, IMF などのプロトコルで転送されたファイルをキャプチャデータから抽出する機能が追加されました。

# HTTPで転送されたオブジェクトを /tmp/http_files/ ディレクトリに抽出
tshark -r capture.pcap -q --export-objects http,/tmp/http_files/

# SMBで転送されたオブジェクトを /tmp/smb_files/ ディレクトリに抽出
tshark -r capture.pcap -q --export-objects smb,/tmp/smb_files/

これにより、マルウェアの検体や、Webページに含まれる画像などを簡単に取り出すことができます。📁➡️💻

Termshark: TSharkのTUIフロントエンド

もしCUI環境でもう少しWiresharkライクなインタフェースが欲しい場合、Termshark というツールがあります。これはTSharkをバックエンドとして利用し、ターミナル上で動作するユーザーインターフェースを提供します。パケットリスト、詳細表示、バイト表示などを備え、表示フィルタも利用可能です。

権限の問題について

Linux環境で一般ユーザーがTSharkでライブキャプチャを行うには、通常、特別な権限が必要です。いくつかの方法があります。

  1. sudoを使う: 最も簡単な方法ですが、常にroot権限で実行するのはセキュリティ上好ましくない場合があります。
  2. wiresharkグループに追加する: Debian/Ubuntuなどでは、インストール時に wireshark というグループが作成されることがあります。ユーザーをこのグループに追加すると、キャプチャ権限が付与されることがあります。
    sudo usermod -aG wireshark $USER
    # 再ログインが必要な場合があります
  3. ケーパビリティを設定する: より細かい権限管理として、dumpcap(TSharkが内部で使用するキャプチャプログラム)にケーパビリティ(cap_net_raw, cap_net_admin)を設定する方法があります。
    sudo setcap cap_net_raw,cap_net_admin=eip /usr/bin/dumpcap
    ただし、この設定はセキュリティリスクを伴う可能性があるため、慎重に行う必要があります。

どの方法が適切かは、システムのセキュリティポリシーや運用状況によって異なります。

8. まとめと参考情報 📚

TSharkは、コマンドライン環境で強力なネットワークパケット分析を実現するための非常に便利なツールです。基本的なキャプチャから、高度なフィルタリング、フィールド抽出、統計情報生成、ファイル操作まで、幅広い機能を備えています。

この記事で紹介した内容はTSharkの機能の一部にすぎません。ぜひ、tshark --help や公式ドキュメントを参照して、さらに多くのオプションや機能を試してみてください。

TSharkを使いこなせば、ネットワークの問題解決やセキュリティ分析の効率が格段に向上するでしょう。Let’s enjoy packet analysis! 🎉

参考情報

コメント

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