このサイトは、ほんの入り口です

ここにあるのは、だれかが実際に調べ、考え、作ってきたことを集めたメモです。気になったら、ページの下の「参考にした情報源」から、もとの本や記事、それを生み出した人たちに、直接ふれてみてください。このメモには書ききれないおもしろさが、そこにあります。

ぱけっとを つかまえると、なにが 見えるの?

見えない通信を「捕まえて」読む ── Wiresharkとパケットの話

パケットキャプチャの仕組みと限界 ── Wireshark・libpcap・ヘッダ解析

分野:技術

ふだん スマホや パソコンで つかう 通信つうしんは、目に 見えません。けれど、その 通信つうしんを 小さな つぶに わけて、1つずつ 見られる どうぐが あります。

どうして、目に 見えない ものが 見えるのでしょうか。つかまえ方と、読み方と、つかまえられない ときの ことが 分かります。

ふだん使っている通信は、小さな「パケット」に分かれて流れています。そのパケットを1つずつ捕まえて、中の欄を読める道具があります。名前はWireshark(ワイヤシャーク)です。

ふつう、ネットワークの部品は自分宛てでないものを捨てています。それなのに、どうして他の通信まで見られるのでしょうか。捕まえ方、読み方、捕まえられない場面が分かります。

Wiresharkは、ネットワーク上を流れるパケットを集め、できるだけ詳しく表示する解析器だ[1]。ヘッダの各欄をふつうのパソコンの画面で読めるのは、パケットの並びにも欄の定義にも、公開された取り決めがあるからだ。

では、パケットはどの段階で、どこから拾われるのか。スイッチや無線ではなぜうまく拾えないことがあるのか。このメモを読むと、キャプチャの仕組みと、暗号化された中身は読めないという限界が分かる。

読み方を切り替えられます。画面の上にある「よみかた」のボタンで、小学校低学年むけ・小学校高学年むけ・中学生むけの3つの書き方に切り替わります。むずかしいと思ったら、いつでもやさしい方に戻ってください。選んだ読み方はブラウザが覚えているので、次に別の記事を開いたときも同じ読み方で始まります。

1. つうしんは、にふだの ついた にもつ

1. 通信は「荷札つきの小包」に分かれている

1. パケットとヘッダ ── 通信を分割する取り決め

ネットで しゃしんを おくる とき、しゃしんは ひとかたまりでは ながれません。小さく わけられて、1つずつ おくられます。この 小さな つぶを「パケット」と いいます。

たくはいびんの にもつを おもいだして ください。にもつには、あて先や おくり主を かいた にふだが ついて います。パケットにも、にふだに あたる ぶぶんが あります。これを「ヘッダ」と いいます。

ただし ほんとうは、ヘッダには あて先だけでなく、いろいろな ことが かかれて います。くわしくは、あとで 見て いきます。

パケットは、荷札と中身でできている

写真や動画を送るとき、データはまとめて1つで流れるわけではありません。小さく区切られて、1つずつ送られます。この1つ分がパケットで、荷札にあたる「ヘッダ」と、運びたい「中身」からできています。

宅配便の荷物に、宛先と差出人を書いた送り状が付くのと似ています。ただし、パケットのヘッダには、宛先のほかにも、長さや次に使う決まりの種類など、細かい欄が決まった順番で並びます[6]。

この「欄が決まった順に並ぶ」ことが、あとで大事になります。並びが決まっているから、捕まえたパケットを機械が読み分けられるのです。

ネットワークの通信は、ヘッダとデータからなるパケットに分割されて運ばれる。IPv4のヘッダは、バージョン、ヘッダ長、全体の長さ、TTL、次に使うプロトコルの種類、送信元アドレス(32ビット)、宛先アドレス(32ビット)などの欄が、RFC 791で決められた順に並ぶ[6]。

欄の位置と幅が仕様で固定されているため、解析器は捕まえたビット列を、どこからどこまでが何の欄かに機械的に切り分けられる。このメモでは、その読み分けが捕獲の後段にあたると位置づけて進める。

2. どうして つくられたの?

2. 「不具合を調べたい」から始まった道具

2. Etherealの誕生と改名 ── 1997年から2006年

この どうぐを つくりはじめた 人は、ジェラルド・コムズさんです。1997ねんの おわりごろ、ネットの ふぐあいを さがす どうぐが ほしく、ネットの ことも もっと まなびたかった から だと いいます[2]。

はじめの なまえは「イーサリアル」でした。1998ねんの 7がつに、さいしょの ばんが ひろく 出されました[2]。

2006ねんに、なまえが「ワイヤシャーク」に かわりました[2]。

作り始めたのは、ジェラルド・コムズ(Gerald Combs)さんです。公式ガイドの「短い歴史」によると、1997年の後半、ネットワークの問題を突き止める道具が必要で、ネットワークをもっと学びたい気持ちもあって、Ethereal(イーサリアル)という名前のソフトを書き始めました[2]。

最初の版は、1998年7月に0.2.0として公開されました[2]。

名前は、2006年にWiresharkに変わりました[2]。理由については、Wikipediaに、コムズさんが移った会社の事情で、Etherealの商標を自分が持っていなかったため、という説明があります[3]。公式ガイドは理由を書いていないので、ここでは二次資料の説明として紹介するにとどめます。

Wiresharkはフリーソフトウェアで、GNU General Public Licenseというルールのもとで配られているといいます[3]。

公式ガイドの沿革によれば、1997年後半にGerald Combsが、ネットワークの問題追跡のための道具が必要で、ネットワークの学習も兼ねてEtherealを書き始めた。0.2.0が1998年7月に最初に公開された[2]。2006年に、新しい名前のWiresharkとして再出発している[2]。

改名の理由は、Wikipediaが、CombsがCACE Technologiesに移った際、Etherealの商標を本人が所有していなかったためと記す[3]。公式ガイドは理由を明記していないため、二次資料にもとづく説明として扱う。

Wiresharkは、GNU General Public License v2以降のもとで配布されるフリーソフトウェアである[3]。

捕獲の仕組みの源流のひとつであるtcpdumpは、LBL(ローレンス・バークレー研究所)で、Van Jacobson(ジェイコブソン)らが、TCPとインターネットゲートウェイの性能を調べて改善する研究の一部として作ったと、READMEにある[11]。READMEに年の記載はなく、作られた時期は書かない。

3. どうやって つかまえるの?

3. 「自分宛てではないもの」をどう捕まえるのか

3. libpcapとpromiscuousモード ── 宛先に関係なく受け取る

パソコンの つうしんの ぶひんは、ふだん じぶんに とどいた ものだけを うけとります。ほかの 人あての ものは、すてて います。

そこで「むさべつモード」に します。すると、あて先に かんけいなく、まわりの ぱけっとを ひろいます。まるで、ほかの 人の おしゃべりにも みみを すます ように なる のです。ただし ほんとうは、みみを すます だけで、こえを かけたり しません。

この ひろう しくみは、「リブピーキャップ」と いう ぶひんが ささえて います[4]。

ふつうは捨てる、を切り替える

イーサネットのようなネットワークでは、パソコンの通信アダプタは、自分宛てでないパケットをふつう捨てています。そこで「無差別モード(promiscuous mode)」に切り替えると、宛先に関係なく、その通信アダプタに届くパケットを受け取れます[4]。捨てる、をやめて、聞き耳を立てるイメージです。ただし「届く範囲」に限られることは、次の章で見ます。

この拾う仕組みは、libpcap(リブピーキャップ)という部品が土台になっています。libpcapの説明書には、捕獲できるインターフェースに届いたパケットは、他の機器宛てのものも含めて、この仕組みで手に入る、と書かれています[4]。Windowsでは互換のNpcapなどが使われます。

測るだけで、手は加えない

Wireshark自身は、ネットワークに手を加えず、パケットを送り出したりもしません。流れているものを「測る」だけです[1]。

イーサネット系では、アダプタはふつう自分宛てでないパケットを破棄する。promiscuousモードにすると、宛先を問わず、そのインターフェースに届くパケットを受け取る[4]。届く範囲の制約は次節で扱う。なお、anyデバイスなどではこのモードが無視されることがあるという。

捕獲の土台はlibpcap(Windowsでは互換のNpcap)で、マニュアルは、捕獲できるインターフェースに届いたパケットは、他のホスト宛てのものを含めてこの仕組みでアクセスできると説明する[4]。

Wireshark自身は侵入検知システムではなく、ネットワークを操作せず、パケットを送出しない。あくまで測定する側にとどまる[1]。

4. つかまえられない ときも ある

4. どこでも捕まえられるわけではない

4. スイッチと無線LANの制約 ── ポート複製とモニタモード

どこでも なんでも つかまえられる わけでは ありません。いまの 家や 学校の ネットには、「スイッチ」と いう ぶひんが あります。スイッチは、あて先の ある ばしょに だけ、ぱけっとを とどけます。

だから、そこに ぱそこんを つなぐだけでは、ほかの ふたりの つうしんは 見えないことが あります[5]。

おおぜいに いっぺんに とどく ものは、べつです。それは みんなの ところへ ながれます[5]。

ぶひんによっては、ぜんぶの つうしんを ひとつの さしこみ口に コピーして くれる ものも あります。そこに どうぐを つなぎます[5]。

スイッチが仕分けてしまう

現在のネットワークでは、スイッチが、宛先のある口にだけパケットを送ります。そのため、2台の間の通信が、他の口に現れるとは限りません。全部の口に流れるのは、みんな宛てのブロードキャストなどに限られます[5]。

そこで、一部のスイッチには、全部の口の通信を1つの口へ複製する機能があります。その口に解析器をつなげば、見たい通信を捕まえられます[5]。

無線LANは、つなぎ方が変わる

無線LANでは、モニタモードという状態にする方法があります。ただし、その状態のインターフェースは、ふつうのネットワーク接続としては使えなくなり、パソコンは元のネットワークから外れたような状態になります[5]。

Wireshark FAQによれば、スイッチ環境では、2つのポート間のユニキャスト通信が他のポートに現れるとは限らず、全ポートに流れるのはブロードキャストとマルチキャストだけである[5]。対策として、一部のスイッチは全ポートの通信を1つのポートへ複製でき、そこに解析器を接続する[5]。

無線LANでは、モニタモードのインターフェースは通常のネットワーク接続として使えず、実質的にそのマシンは元のネットワークから外れる[5]。つまり、「捕まえたい場所に、捕まえられる形で接続する」ことが前提条件になる。

6. たくさんの なかから、ほしい ものを えらぶ

6. 大量のパケットから、見たいものだけを絞る

6. 表示フィルタ・捕獲フィルタとFollow TCP Stream

つかまえた ぱけっとは、すぐに たくさんに なります。そこで「フィルタ」を つかい、ほしい ものだけを のこします。

フィルタには 2しゅるい あります。1つめは、つかまえた あとで、見せる ものを えらぶ もの。2つめは、つかまえる ときに、あう ものだけを とる もの[8]。

もう 1つ、べんりな はたらきが あります。ひとつの つうしんの ぱけっとを、ながれた じゅんに ならべて 見せる はたらきです[9]。

2種類のフィルタ

表示フィルタは、捕まえたあとで、見せるパケットを絞ります。例えば ip.addr == 192.168.0.1 と書けば、そのアドレスに関係するものだけが残ります[8]。

捕獲フィルタは、捕まえる段階で、条件に合うものだけを取ります。例は tcp port 23 and host 10.0.0.5 です[8]。使い分けとして、絞りすぎると後から見直せなくなる点には注意が要ります。

流れを1本にまとめて読む

「Follow TCP Stream」という機能は、選んだ接続のパケットだけを取り出し、データを流れた順に並べて見せます。クライアントからサーバへの向きは赤、サーバからクライアントへは青で表されます。印字できない文字は点で表示されます[9]。

表示フィルタは、捕獲後にどのパケットを表示するかを制御する。例:ip.addr == 192.168.0.1、tcp.port in {80, 443, 8080}[8]。捕獲フィルタは、捕獲の段階で条件に合うものだけを取り込む。例:tcp port 23 and host 10.0.0.5[8]。捕獲フィルタは、取りこぼしたものを後から見直せない点が、表示フィルタとの実用上の違いだ。

Follow TCP Streamは、選んだ接続のパケットを抽出し、データを送られた順に並べる。クライアント→サーバは赤、サーバ→クライアントは青で、印字不能の文字はドットで示される[9]。

7. あんごうが かかった つうしん

7. 暗号がかかった通信は、鍵なしでは読めない

7. TLSの復号条件と、この技術の使い道

ぱけっとを つかまえても、なかみが ぜんぶ 読める わけでは ありません。あんごうが かかった つうしんは、かぎが ないと、なかみが 読めません[10]。

だから、じぶんの つうしんは、かぎに まもられて います。ぱけっとの ながれかたを 見る ことは できても、なかみを のぞく ことは できません。

この どうぐは、ネットの こまりごとの げんいんを さがす 人や、しくみを まなぶ 人が つかいます[1]。

鍵がなければ、中身は読めない

暗号化(TLS)された通信は、復号に必要な鍵の情報がなければ、中身を読むことができません。Wiresharkは、ブラウザが出力する鍵の情報などが与えられると、復号して表示できます[10]。

つまり、通信を捕まえられることと、中身を読めることは別です。暗号化された通信は、ヘッダの欄は見えても、中身は鍵に守られています。

点検にも、学びにも

公式ガイドは、この道具の使い道として、管理者の接続トラブルの調査、セキュリティ担当者の調査、品質の確認、開発者による通信の決まりの実装の確認、そして学生の学習を挙げています[1]。

不具合を調べたい、ネットワークを学びたい、という作者の出発点が、そのまま使い道になっています。

TLSで暗号化された通信は、復号に必要な鍵情報(ブラウザが出力するキーログファイルなど)が与えられなければ、ペイロードを読めない。適切な鍵が与えられればWiresharkは復号できる[10]。ここから、捕獲の成否と内容の可読性は別問題だと分かる。

公式ガイドは用途として、管理者の接続障害の調査、セキュリティ担当者の調査、品質保証、開発者のプロトコル実装の検証、学生の学習を挙げる[1]。管理と調査、学習に同じ仕組みが使われるのは、パケットを記録して欄を読み分けるという技術自体が、目的を選ばないからだと読める。ただし、他人の通信を無断で取得することの可否は法や規約が定める領域であり、このメモは手順を扱わない。

8. にふだを よんで みよう

8. 送り状の欄を読んでみよう

8. 出口 ── 身近な「ヘッダ」を読む体験と、資料の案内

おうちに とどいた たくはいびんの 「おくりじょう」を 1まい、おうちの 人に もらいます。

どんな ことが かいて あるか、1つずつ ゆびで さしながら 数えて みましょう。あて先、おくり主、…。きまった じゅんに ならべて ある ところは、ぱけっとの ヘッダと、にて いますか。

ただし、ほかの 人の 手紙や おくりじょうは、かってに 見ては いけません。おうちの 人の 「いいよ」を もらって ください。

家に届いた宅配便の送り状を、家の人にもらって、書いてある欄を1つずつ数えてみましょう。宛先、差出人など、いくつの欄があるでしょうか。IPv4ヘッダの欄と見比べると、決まった順に情報を並べる考え方が似ていると感じられるはずです。

他の人宛ての郵便物は、勝手に見ないでください。通信の捕獲も同じで、自分が管理している機器で、持ち主の許可を得たものにとどめましょう。

送り状の欄を数え終えたら、いくつの欄が、どんな順に並んでいたかをメモして、IPv4ヘッダの欄の並びと見比べてみてください。

身近なヘッダの体験として、家の人の許可を得て宅配便の送り状の欄を数え、IPv4ヘッダの欄と対応づけて眺める方法がある。対応は類推にとどまる。通信の捕獲も、自分が管理する機器で許可を得た範囲に限るべきだ。

資料としては、Wireshark User's Guide[1][2][8][9]、RFC 791[6]とRFC 9293[7]、libpcapのマニュアル[4]が、いずれも英語で公開されている。まず、送り状の欄の並びとIPv4ヘッダの欄の並びで、何が似ていて何が違うかを自分で確かめてみるとよい。

しらべた もとの じょうほう

参考にした情報源

参考にした情報源と、その使い方

出典について:Wireshark公式ガイドとFAQ、libpcapのマニュアル、RFC、tcpdumpのREADME、Wikipediaを使った。何に使ったかは、それぞれの項目の最後に書いている。

  1. Wireshark User's Guide, Introduction。https://www.wireshark.org/docs/wsug_html_chunked/ChapterIntroduction.html (道具の役割と、測るだけであることについて)
  2. Wireshark User's Guide, A Brief History。https://www.wireshark.org/docs/wsug_html_chunked/ChIntroHistory.html (作り始めた動機と、最初の公開について)
  3. Wireshark(Wikipedia)。https://en.wikipedia.org/wiki/Wireshark (改名の理由と配布の条件について。二次資料)
  4. libpcap man page pcap(3PCAP)。https://www.tcpdump.org/manpages/pcap.3pcap.html (パケットを拾う仕組みと無差別モードについて)
  5. Wireshark FAQ。https://www.wireshark.org/faq.html (スイッチ環境と無線のモニタモードについて)
  6. RFC 791 Internet Protocol。https://www.rfc-editor.org/rfc/rfc791.txt (IPv4ヘッダの欄について)
  7. RFC 9293 Transmission Control Protocol。https://www.rfc-editor.org/rfc/rfc9293.html (TCPの欄と3ウェイハンドシェイクについて)
  8. Wireshark User's Guide, Display Filters / Capture Filters。https://www.wireshark.org/docs/wsug_html_chunked/ChWorkBuildDisplayFilterSection.html (2種類のフィルタについて)
  9. Wireshark User's Guide, Following Protocol Streams。https://www.wireshark.org/docs/wsug_html_chunked/ChAdvFollowStreamSection.html (Follow TCP Streamの表示について)
  10. Wireshark Wiki, TLS。https://wiki.wireshark.org/TLS (暗号化された通信と復号の条件について)
  11. tcpdump README(LBL)。https://web.mit.edu/freebsd/head/contrib/tcpdump/README (tcpdumpの成り立ちについて)

なおした ところ

更新履歴

更新履歴(改版の記録)

  •  初版を公開。

このサイトでは、公開した記事の本文は原則として書き直しません。誤りが見つかったときや、内容が古くなったときだけ手を入れ、その理由をこの欄に残します。