はじめに
ネットワークトラフィックは、送信される前に「パケット」と呼ばれる小さな断片に分割されることがよくあります。クライアントとサーバーが通信する際、これらのパケットが多数やり取りされます。「ストリーム」とは、単一の接続におけるこれらパケットの完全かつ順序立てられたシーケンスを指します。
このパケットとストリームの区別は、プロトコル分析において最も重要な考え方の転換の一つです。個々のパケットは特定の瞬間に何が起きたかを示しますが、ストリームは会話の全体像を示します。ログイン、フォーム送信、ファイル転送といったアプリケーション層のイベントの多くは、パケットを一つずつ眺めるよりも、会話全体を再構築する方がはるかに理解しやすくなります。
この実験では、tshark(Wireshark のコマンドライン版)を使用して、断片化されたネットワーク通信を再構築する方法を学びます。完全な TCP ストリームを追跡することで、個々のパケットを結合し、クライアントとサーバー間のやり取り全体を読み取り可能なテキストとして確認できるようになります。これは、ネットワークのトラブルシューティングやセキュリティ分析において不可欠なスキルです。
TCP ストリームの特定
このステップでは、ネットワークキャプチャファイル内に存在する異なる TCP ストリームを特定する方法を学びます。
tsharkはキャプチャファイルを読み込む際、同じ接続(送信元 IP、送信元ポート、宛先 IP、宛先ポートが同じ)に属するパケットを自動的にグループ化し、一意の整数インデックスを割り当てます。このインデックスは tcp.stream フィールドとして知られています。
tcp.stream は、アナライザーによって作成された「会話ラベル」のようなものだと考えてください。これはプロトコルフィールドとしてネットワーク自体から送られてくるものではありません。tsharkが、接続のエンドポイントとイベントの順序が同じであるという理由から、特定のパケット同士が関連していると推論した結果です。そのため、ストリーム分析はデータに対する非常に有用な「アナリスト視点」となります。
環境には、~/project ディレクトリ内に sample_traffic.pcap というサンプルキャプチャファイルが既に用意されています。このファイルには基本的な Web トラフィックが含まれています。
このキャプチャファイル内のすべての一意な TCP ストリームを確認するには、tsharkを使用して各パケットから tcp.stream フィールドを抽出し、結果をソートして一意の値のみを表示させます。
ターミナルで以下のコマンドを実行してください:
tshark -r sample_traffic.pcap -T fields -e tcp.stream | sort -n | uniq
コマンドの解説:
-r sample_traffic.pcap: 指定したキャプチャファイルを読み込むようtsharkに指示します。-T fields: デフォルトのパケット要約ではなく、特定のフィールドを出力するように指定します。-e tcp.stream: 各パケットの TCP ストリームインデックスを表示するようにtsharkに指示します。| sort -n | uniq: 出力を標準の Linux ユーティリティにパイプし、数値を昇順に並べ替えて重複を削除します。
以下のような出力が表示されるはずです:
0
1
この出力は、このキャプチャファイルに 2 つの異なる TCP 通信(ストリーム 0 とストリーム 1)が記録されていることを示しています。
TCP ストリームの再構築
TCP ストリームのインデックス番号がわかったので、会話全体を再構築できます。このプロセスは、Wireshark のグラフィカルインターフェースにおける「TCP ストリームの追跡(Follow TCP Stream)」機能と同じです。
再構築は、HTTP、SMTP、その他多くのレガシーアプリケーションプロトコルといったテキストベースのプロトコルにおいて特に価値があります。アナリストは、アプリケーションが経験した順序でリクエストとレスポンスを読み取ることができるからです。基盤となる通信が複数のパケットにまたがっている場合でも、再構築されたストリームは一連の流れを復元します。
このステップでは、ストリーム 0 を再構築します。このストリームには、クライアントがサーバーに Web ページを要求した HTTP GET リクエストが含まれています。
tsharkでストリームを追跡するには、統計や分析タスクに使用される -z オプションを使用します。ストリームを追跡するための特定の構文は -z follow,tcp,ascii,<stream_index> です。
以下のコマンドを実行して、ストリーム 0 を再構築してください:
tshark -r sample_traffic.pcap -z follow,tcp,ascii,0 -q
新しい引数の意味は以下の通りです:
-z follow,tcp,ascii,0: インデックス0の TCP ストリームを追跡し、ペイロードをascii(読み取り可能なテキスト)形式で表示するようtsharkに指示します。-q: 「quiet(静音)」モードです。デフォルトのパケットごとの出力を抑制し、再構築されたストリームデータのみを表示します。
完全な HTTP 通信が表示されます:
===================================================================
Follow: tcp,ascii
Filter: tcp.stream eq 0
Node 0: 127.0.0.1:58548
Node 1: 127.0.0.1:8080
GET / HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12
Date: Thu, 05 Mar 2026 02:00:48 GMT
Content-type: text/html
Content-Length: 40
Last-Modified: Thu, 05 Mar 2026 02:00:44 GMT
Welcome to the LabEx Network Stream Lab
===================================================================
この出力では、クライアントのリクエスト(GET / HTTP/1.1...)に続いて、サーバーのレスポンス(HTTP/1.0 200 OK... および HTML コンテンツ)が明確に確認できます。tsharkは、個々のパケットを結合して一貫したテキストブロックにすることに成功しました。
通信の分析
ネットワークトラフィックを分析する際、通信が非常に長くなることがあります。巨大なストリームを直接ターミナルに出力すると、読み取りや分析が困難になる場合があります。
再構築されたストリームをファイルに保存するのは小さなステップですが、これは「中間分析の成果物を保存する」というフォレンジックにおける重要な習慣を反映しています。調査担当者は、調査結果を後で確認したり、比較したり、あるいはコマンドを最初からやり直すことなく他人に共有したりできるよう、メモ、抽出した会話、デコードされたペイロード、フィルタリングされた証拠などを個別のファイルとして保持することがよくあります。
このステップでは、ストリーム 1 を再構築し、その出力をテキストファイルにリダイレクトします。これにより、標準のテキストエディタやコマンドラインツールを使用して、自分のペースで通信内容を精査できるようになります。
ストリーム 1 には HTTP POST リクエストが含まれています。これは通常、ログインフォームなどのデータを送信する際に使用されます。
以下のコマンドを実行してストリーム 1 を追跡し、出力を stream1_analysis.txt という名前のファイルに保存してください:
tshark -r sample_traffic.pcap -z follow,tcp,ascii,1 -q > stream1_analysis.txt
> 演算子は、通常画面に表示される出力を取得し、現在のディレクトリ(~/project)にある stream1_analysis.txt に書き込みます。
次に、cat コマンドを使用して、作成したファイルの内容を確認します:
cat stream1_analysis.txt
出力は以下のようになります:
===================================================================
Follow: tcp,ascii
Filter: tcp.stream eq 1
Node 0: 127.0.0.1:45138
Node 1: 127.0.0.1:8080
POST /login HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*
Content-Length: 23
Content-Type: application/x-www-form-urlencoded
user=labex&action=loginHTTP/1.0 501 Unsupported method ('POST')
Server: SimpleHTTP/0.6 Python/3.10.12
Date: Wed, 25 Oct 2026 10:00:05 GMT
Connection: close
Content-Type: text/html;charset=utf-8
Content-Length: 480
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd">
...
===================================================================
このファイルを分析することで、クライアントが POST リクエストのボディで送信した正確なデータ(user=labex&action=login)を観察できます。また、サーバーのレスポンスが 501 Unsupported method エラーであることも確認できます。これは、このトラフィックを生成するために使用されたシンプルな Python Web サーバーが POST リクエストをサポートしていないことを示しています。
ストリームをファイルに保存することは、ネットワークキャプチャからファイル、資格情報、詳細なログを抽出する必要がある場合に非常に効果的なテクニックです。
まとめ
おめでとうございます!「ネットワークストリームの追跡」の実験を無事に完了しました。
この実験では、以下の方法を学びました:
tcp.streamフィールドを使用して、パケットキャプチャファイル内の固有の TCP ストリームを特定する。tsharkのfollow機能を使用して、特定の TCP ストリームの完全なやり取りを再構築し、確認する。- 再構築されたストリームデータをテキストファイルにリダイレクトし、読み取りや詳細な分析を容易にする。
これらのテクニックは、ネットワーク管理者やセキュリティ専門家がネットワークの問題を調査したり、マルウェアの挙動を分析したり、アプリケーションの通信を検証したりする際に不可欠な基礎知識です。

