ネットワークパケットキャプチャ入門 ─ WiresharkでHTTP通信の中身を見てみよう

この記事の内容

  • WiresharkでHTTPプロトコルのパケットをキャプチャし、通信の中身を確認する手順を解説します
  • TCPの3ウェイハンドシェイクからHTTP GETリクエスト・レスポンスまで、一連の通信フローを追います
  • HTTPストリーム追跡機能を使って、リクエストとレスポンスの内容を人間が読める形式で確認します
  • HTTPとHTTPSの違い(暗号化の有無)と、HTTPSトラフィックが直接見えない理由を説明します

概要

本記事はネットワークパケットキャプチャシリーズの第3弾です。今回はHTTPプロトコルに焦点を当て、Webサイトを閲覧したときに裏側でどのような通信が行われているかをWiresharkで実際に確認していきます。

対象のWebページには、以下のような非常にシンプルなHTMLで構成されたテストページを使用します。

<html>
  <head><title>テストページ</title></head>
  <body>
    <p>テストページです</p>
  </body>
</html>

キャプチャの準備とフィルタリング

Wiresharkを起動してキャプチャを開始した状態で、ブラウザからテストページにアクセスします。アクセスすると大量のパケットが表示されますが、今回はHTTPプロトコルに絞って観察したいため、表示フィルターに以下を入力します。

http

これにより、HTTPプロトコルのパケットのみが表示されるようになります。


パケットの中身を確認する

フィルタリングされたパケット一覧から、テストページへのGETリクエストを確認できます。パケットの情報には以下のような内容が含まれています。

  • Source(送信元):自分のPC(例:192.168.1.xxx)
  • Destination(宛先):テストページのサーバーIPアドレス
  • プロトコル:HTTP
  • 内容:GETリクエスト(ページの取得)

TCPストリームで通信全体を追跡する

HTTPパケットを右クリックし、「追跡」→「TCPストリーム」を選択すると、その通信セッション全体の流れを一覧で確認できます。

TCPストリームでは以下の流れが確認できます。

  1. 3ウェイハンドシェイク(SYN → SYN-ACK → ACK)による通信確立
  2. クライアントのポート番号(例:60321)からサーバーの80番ポートへの接続
  3. HTTPによるGETリクエストの送信
  4. サーバーからの200 OKレスポンスとコンテンツの返却
  5. FINパケットなどによる接続の切断

クライアント側のポート番号は接続のたびに変わりますが、サーバー側(80番ポート)は常に同じです。


HTTPストリームで内容を読み取る

TCPストリームではTCPレベルの通信が見えますが、HTTPに特化した内容を確認したい場合は「HTTPストリーム」を使います。

HTTPパケットを右クリックし、「追跡」→「HTTPストリーム」を選択します。

リクエスト(赤色部分)

クライアントからサーバーへ送信した内容が赤色で表示されます。

GHUEosTsetr/:-HtATeegTsbePtin/sttu:edsat..chotmmlHTTP/1.1
  • GET:ページを取得するコマンド
  • Hostヘッダー:接続先のホスト名
  • User-Agent:ブラウザの種類やバージョンなどの情報

レスポンス(青色部分)

サーバーからクライアントへ返ってきた内容が青色で表示されます。

H<THh/TTt<<hPTmhb/t/Pleo<bm1>adpol.dy>d>1>>y<>2t0i0tlOeK></p></title></head>

レスポンスのステータスコード 200 OK は「問題なくリクエストを処理できた」ことを意味します。ヘッダーの後に空行を挟み、その後にHTMLコンテンツが続く構造になっています。

このレスポンスボディの内容が、ブラウザがレンダリングしてページとして表示しているものと全く同じであることが確認できます。


HTTPとHTTPSの違い(注意点)

HTTPSへのリダイレクト

現在、多くのWebサイトではHTTPでアクセスすると自動的にHTTPSへリダイレクトする実装が一般的です。この場合、WiresharkにはHTTPのリダイレクトレスポンスとして 301 Moved Permanently(または 301)が表示され、続けてHTTPS(443番ポート)への接続が行われます。

HTTPSは暗号化されているため中身が見えない

HTTPは暗号化されていない通信のため、今回のように通信内容をそのまま確認できます。一方、HTTPSは暗号化された通信のため、WiresharkでキャプチャしてもHTMLの中身を平文で見ることはできません。

現在はHTTPSを使うサイトが非常に多いため、本記事の手法で内容を直接確認できるのはHTTPの場合に限られます。

HTTPSの内容を確認するには、Fiddlerのようなプロキシツールを使って通信を中継・復号するといった、別の仕組みが必要になります。ただしこれはセキュリティ的に別次元の話になりますので、本記事では割愛します。


まとめ

WiresharkのHTTPフィルターとHTTPストリーム追跡機能を組み合わせることで、ブラウザがWebサイトを表示する際の通信の仕組みを可視化できます。

  • HTTPフィルターでHTTPパケットのみを絞り込める
  • TCPストリームで3ウェイハンドシェイクから接続切断まで全体の流れを確認できる
  • HTTPストリームでリクエスト・レスポンスの内容を人間が読める形式で確認できる
  • HTTPSは暗号化されているため、この方法では通信内容を直接確認できない

さまざまなWebサイトにHTTPでアクセスしながら、httpフィルターとHTTPストリーム追跡を活用して、通信の中身を観察してみてください。新しい発見があるはずです。