ENGINEER BLOG

ENGINEER BLOG

Wiresharkでパケットを見てみよう

はじめまして。インテグレーションサービス本部の後藤です。
今回はネットワークを取り上げます。基礎的なことですが、パケットキャプチャをやってみます。

ネットワークは繋がって当たり前?

IT業界にいるエンジニアにも担当する仕事によって普段おこなっていることは様々です。そして、それぞれに得手不得手があるものです。

大きく分けるとインフラエンジニアとアプリエンジニアに分かれていきます。
私はそのどちらもかじって仕事をしてきた (どちらも中途半端ともいう) ので、その双方の間にある壁と言うものも感じます。

かつてはインフラ構築からアプリの開発までを担当して実行していくスタイルが多かったと思います。
小規模なクライアントサーバーの仕組みの頃はそうでした。
が、今はそうもいかないのが現実。

image01

そして今ではクラウドさらにサーバーレスでの開発なども出てきて、ますます変化が起こっているわけです。
(そもそも「セットアップしない」という状況が出てきている)

そういった環境でアプリ開発をするとなると「インターネットには繋がっている」ことはもはや前提だったりします。
それを当たり前として、とりあえず繋がってるからOK! と言って
インターネットに繋がるその手前の部分(社内であればLANとか)を考えることがそもそも少なくなってきている。
けど、こういった基礎の部分をきちんと知っているかはエンジニアとして重要な部分。と思います。

ネットワークは勉強して知識はあっても実際にはわからないことが多い。と言う人も多いので、
パケットキャプチャをしてみることで目で見ながらネットワーク上を流れるデータを確認してみよう。
と言うのが今回の趣旨です。前置き長かった。

とはいえ、私もキャプチャソフトを実際にいじるのは7~8年ぶりなのですが・・・

Wiresharkのインストール

「Wireshark」とはフリーで利用できるパケットキャプチャソフトの定番です。
とても機能が豊富なアプリなのですが、まずは基本の機能のみ使います。

https://www.wireshark.org/

上記サイトからダウンロードが可能です。「Download」ボタンから、OSに合ったインストーラーをダウンロードしてください。

WS000

インストールは基本的にはデフォルト値でセットアップをしておけば良いのですが、注意が一点。
途中で出てくる「Winpcap」は必ずインストールしてください。
パケットキャプチャを行うのに必要なアプリケーションで、Wireshark本体とは別アプリケーションになっています。

WiresharkとWinpcapがインストールできればOKです。

とりあえず起動してキャプチャしてみる

とりあえず起動してみましょうか。

WS001

中央に「イーサネット」と「Wi-Fi」の文字が見えます。このPCには有線LANポートと無線LANが存在しています。
どのインターフェイスを通っているパケットをキャプチャしますか?と言うことです。試しに「Wi-Fi」をダブルクリックしてみます。

WS002

いきなりキャプチャが始まりました。何もしていないのにパケットのデータが流れていきます。

赤い■ボタンでキャプチャを停止できます。

PCの前でぼーっとしていただけなのですが、10秒程度の間に150を超えるパケットが送受信されました。
何も操作していなかったのに・・

このように、会社の中のLANをキャプチャすると実に多様なパケットが飛び交っていることがわかります。
ネットワークを便利にするための様々なプロトコルのデータが流れているのですが、
今回のキャプチャではパケットが多すぎて訳がわからないことになってしまいます。というわけで、もう少しわかりやすい環境に変えてみます。

整理をしてみる

PCをポケットWiFiルーターにアクセスポイント接続。ルーターからはLTEデータ回線を通じてインターネットに接続されている、
というシンプルな構成を作ります。この構成で発生するパケットを見ていくことにします。が、その前に・・・

ネットワークはレイヤーで考える

ネットワークの勉強をすると、プロトコルスタックという層構造になっているものが必ず出てきます。

理屈としては、「なぜ同じスマホでも、携帯キャリア経由やWiFi経由のどちらでもブラウザから同じようにWebページを開けるのか?」と言うことの答えになるものです。

情報処理試験の勉強などをすると「OSI参照モデル」が必ず出てきます。
「TCPと言ったらトランスポート層だ」なんてとりあえず覚えてみるけど、実際に何がどうなっているのかはいまいちよくわからない。と言う代物ではないでしょうか。

この階層型のモデル、TCP/IPでは4階層モデルになっています。OSIとは少し違います。
アプリケーション層 → トランスポート層 → インターネット層 → ネットワークインターフェイス層 です。

model00

ブラウザでWebページ参照する場合を考えます。

上位層であるアプリケーションが起点となってデータを作っていきます。
まずブラウザが取り扱うHTTPはアプリケーション層です。HTTPリクエストなどのアプリケーション層のデータをブラウザが作ります。
ブラウザはデータを作ると、下位層にそれを投げます。

受け取ったトランスポート層では、TCPヘッダを付加します。リクエストデータをくるむように外側にヘッダをつけてさらに下位層に渡します。
インターネット層ではIPヘッダ、ネットワークインターフェイス層ではイーサネットならイーサネットヘッダをつけます。

各層で必要な情報を作っていき、各層ごとにヘッダを付加していく。そして外に出て行きます。

受信側はその逆です。
受け取ったら下位層から順番に受け渡しをして、各層ごとにヘッダを外していきます。
最終的にブラウザがデータを受け取ったときには各層のヘッダは外されて、ブラウザが必要とするデータのみになって受け取ります。

model01

このように各層でデータを受け渡し、ヘッダ情報をつけたり外したりしていくことで、途中の層で使うプロトコルが違っても柔軟に対応出来るのです。

ブラウザでwww.techceed-inc.comのWebページ参照をするときに
http://www.techceed-inc.comの名前解決問合せをするだけでひとまずこの流れになります。

  • ブラウザがHTTPリクエストをWebサーバーに投げたい 【アプリケーション層】
  • HTTPリクエストはどこに渡せば良いですか? 【アプリケーション層】
  • http://www.techceed-inc.comはどこにありますか? 【アプリケーション層】
    • IPアドレスに名前解決しないとわかりません
  • じゃあ、DNSに問い合わせます。DNSははどこにありますか? 【アプリケーション層】
    • DNSサーバーのIPアドレスを設定値から参照
  • DNSサーバーのIPアドレスにたどり着くにはどうすればいいですか?【インターネット層】
    • ルーティングを参照。直接たどり着けるのか、いったんどこかに送るのか(ルーターの宛先)を見つける
  • その第1宛先はどこにありますか?MACアドレスが知りたいです(イーサネットの場合)【ネットワークインターフェイス層】
    • 同一LANの中にいるはず。ARPでMACアドレスを問い合わせる
  • 見つけたMACアドレスに向かってDNSの問合せを送信!

では、キャプチャしてみる

ポケットWiFiルーターと接続したPCでキャプチャします。キャプチャをスタートさせ、ブラウザで https://techceed-inc.com にアクセスしたところで停止させます。

WS003

242行目にwww.techceed-inc.comのアドレスを問い合わせるDNSパケットが見られます。
「Source」フィールドが送信元IPアドレス、「Destination」が送信先アドレスです。
ここでは192.168.1.100がPCのIPアドレス、192.168.1.1がPCに設定されたDNSサーバのアドレスです。

Wiresharkの画面は大きく3分割されています。
一番上の画面にパケットの一覧が表示されています。
行選択をすると、真ん中の段にパケット詳細が表示されます。
下の段にはパケットバイト列(生データ)が表示されます。これがパケットの中身です。

このDNS問合せパケットの「パケット詳細」を見ると、

  • Frame
  • Ethernet Ⅱ
  • Internet Protocol version 4
  • User Datagram Protocol
  • Domain Name System

と分かれています。
「Frame」はデータの全体を表しています。
「Ethernet Ⅱ」 は、イーサネットヘッダの部分を表しています。
上記の画像では「Ethernet Ⅱ」の部分を選択しています。すると、パケットバイト列表示部分の一部が反転表示されています。
これは、生データのうちイーサネットヘッダに相当するのはこの部分だよ、と言うことを表しています。

Wiresharkでは、TCP/IP 4階層モデルを上位から下位まで全て通り、各層のヘッダが付加されたデータをキャプチャしています。

  • DNS(Domain Name System)で作られたデータに、トランスポート層であるUDP(User Datagram Protocol)ヘッダがつきます。

  • 次はUDPヘッダまでをデータと見なし、インターネット層のIP(Internet Protocol)ヘッダがつきます。

  • さらにIPヘッダまでをデータと見なし、Ethernetヘッダがつきます。

    ・・と言う結果をこのキャプチャから見ることが出来るのです。

ちなみに、そんな特定のパケットを目で追って探せないよ!ということで、フィルタ表示が出来ます。

WS004

画面上部の入力欄に「dns」と入れるとDNSのパケットのみに絞られて表示されます。
その他の表示フィルタの絞り込みの表記についてはここでは省略しますが、Wiresharkの解説サイトなどで調べてみてください。

おわりに

今回は実質的にWiresharkの起動と画面の見方ぐらいでしたが、こういうことをきっかけに普段インフラをいじらないような人も
興味を持って手を動かすことをしてもらうといいのではないでしょうか。