Wiresharkを使って名前解決からHTTPレスポンスまでを分析してみた

## はじめに

Wiresharkを使用してパケット分析する機会があったので、使い方と基本的な通信の動きについてまとめます。
本記事では、以下書籍参考に作成しています。

https://www.amazon.co.jp/%E3%83%91%E3%82%B1%E3%83%83%E3%83%88%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3%E5%85%A5%E9%96%80-%E7%AC%AC4%E7%89%88%EF%BD%9E-LAN%E3%82%A2%E3%83%8A%E3%83%A9%E3%82%A4%E3%82%B6Wireshark%E6%B4%BB%E7%94%A8%E8%A1%93%EF%BD%9E-%E7%AB%B9%E4%B8%8B%E6%81%B5-ebook/dp/B07F9PYTCK

## 概要
こちらのサンプルキャプチャを使用して、分析を進めていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/f9364e5c-bd37-ad40-9463-3186e6fd3e93.png)

ARP→DNS→TCP→HTTPというきれいな流れができていますので、順番に深堀します。
またそれぞれのIPアドレスとMACアドレスは以下のようになっています。

###### IPアドレス
クライアントPC：192.168.1.219
デフォルトゲートウェイ:192.168.1.1
DNSサーバ:8.8.8.8
Webサーバ:180.235.36.115

###### MACアドレス
クライアントPC：8c:ae:4c:f4:78:63(aeがなぜか隠れる）
デフォルトゲートウェイ:10:4b:46:b8:48:70
DNSサーバ:外部NW
Webサーバ:外部NW

では以降からそれぞれのパケットについて分析をしていきます。




#### NO1~2
クライアントPC⇔デフォルトゲートウェイのARPリクエストですね。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/c64ef39d-5ffc-dc72-40ac-47f27f818f4f.png)

 ちなみに48ビット（6バイト）のMACアドレスのうち最初の24ビット（3バイト）はOUI（Organizationally Unique Identifier）と呼ばれてベンダーごとに固定されています。

https://ascii.jp/elem/000/000/417/417556/

https://uic.jp/mac/vendor/plugable_technologies/

そのため、PCのMACアドレスはPlugable Technologiesのf4:78:63ということになります。
Ethernetの中身ですが、クライアント→デフォルトゲートウェイへの通信を拡大すると以下になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/fe74187d-282a-1b2a-afa7-11242680c169.png)

Destination がBroadcastになっておりSourceにはクライアントPCのMACアドレスが記載されています。
またその下のTYPEには、続くカプセル化の形式を指定しています。0x0806なのでARPということがわかります。

https://www.infraexpert.com/study/tea13.htm

以下ARPの中身です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/acc446de-ff9a-f793-8077-1e05c06ab6ed.png)
ARP Requestでは、TPYEで次のレイヤーのプロトコルが指定され。またTargetのMACアドレスが空の状態で実施されます。

では返りに通信についてみていきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/2933b735-0f00-4a87-5e82-a453b2e6ce7e.png)

これはMACアドレスと次のプロトコルが記載されているだけですね。
次はARPリプライを見ていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/6e30327e-3ecb-6d84-88e1-ff072e8d838d.png)

しっかりSenderのMACアドレスが埋まっていますね。


#### NO3~4
デフォルトゲートウェイ⇔DNSサーバの通信で、インターネット層～アプリケーション層（IP→UDP→DNS）の通信です。
まずはインターネット層から見てみましょう
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/8c3fe42b-380e-8d6e-6774-c4cebddf7acb.png)

Ethernet ⅡやARPに比べて大きなヘッダです。
項目が多すぎるますが、ざっくり理解すると
・バージョン（version)
・優先順位の設定（DSCP）
・パケットの分割について（Flag）
・パケット破棄までに経由するルータの数（TTL)
・次のプロトコル(Protocol)
・ヘッダの内容に問題がないかの確認(Header Checksum)
・送信元と送信先のIP

が含まれてます。
次はUDPです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/224ef8be-a453-0f2b-7d04-5b7e77d4255c.png)



かなりシンプルですね。
ここでポート番号が割り振られていることに注目です。
送信元ポート番号が63861となっていますが、この番号はクライアントのWindowsが利用していないUDPポート番号を動的に割り当てたものです。宛先ポートは53となっており、DNSのアプリケーションを阿波らしていることがわかります。

以下ポート番号についての参考記事です。
53はwell knownポートなので、後に続くプロトコルはDNSであるとわかるんですね。

https://www.nic.ad.jp/ja/basics/terms/port-number.html

返りの通信では宛先ポートと送信元ポートが逆になります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/fc8d5c44-e008-b2a8-7d6f-826195df21ee.png)

ではいよいよDNSについてみていきましょう。
以下はDNSqueryですね。

その前にDNSについて整理します。
「www.ikeriri.ne.jp」というWebサイトの名前解決は以下の図のように実施されます。
それぞれのネームサーバーのNSレコードを参照して、該当するドメインを下位のネームサーバに聞きに行きます。
注意点として、「www.ikeriri.ne.jp」というFQDNのホスト名の「www」は本当にこのような名前がついているわけではなく、実際にはasashinaというホスト名が紐づけられています。ikeririドメインのウエブサーバであることがわかるようにこのような名前が付けられてています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/0b8a307e-a9cb-872d-6e3b-3a3834bfc412.png)


https://www.nic.ad.jp/ja/newsletter/No51/0800.html#:~:text=%E5%90%8D%E5%89%8D%E8%A7%A3%E6%B1%BA%E3%81%AF%E3%80%81%E3%81%BE%E3%81%9A%E3%83%AB%E3%83%BC%E3%83%88,%E5%BE%97%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

では早速ダンプ分析していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/54bfefe0-7a55-8a8d-1781-af1f3af031bb.png)

といっても割とシンプルで
識別子(transaction ID)
DNSの制御(Flag)
問い合わせ内容(Queries)

といった感じです。
応答には、AレコードとCNAMEレコードの詳細が記載されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/d323e2b3-6330-77e5-53d5-910f5e7d301c.png)


#### NO5~7
次はいよいよクライアントPCとWebサーバの通信ですね。
ポイントが多すぎるので、今回は3ウェイハンドシェイクに絞って、分析します。

①クライアントPC→Webサーバ（SYN:0 ACK:0)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/664fcc1d-9b90-b153-6202-35c3597dd66f.png)

今回は、クライアント側のポートが2367で動的に割り当てられています。送信先はWebサーバなので、Wellknownポートの80番となります。
TCP通信の開始時は、SYNフラグを付けてセグメントを送信しています。

➁Webサーバ→クライアントPC（SYN:0 ACK:1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/f97ff526-ca72-1a21-04be-b769589ad2ee.png)

返りの通信では、送信開始側が送信したシークエンス番号に1を足した値を確認応答番号してセットしています。

③クライアントPC→Webサーバ(SYN:1 ACK:1)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/5217782d-1953-1fb9-362e-073cc70eeff0.png)
最後に、接続開始側がセグメントを返します。
シークエンス番号は、確認応答番号をそのまま流用します。一方受け取ったシークエンス番号を確認する意味で、応答側から送られたシークエンス番号に1を足した値を確認応答番号にセットします。



#### NO5~6
ではいよいよ最後のHTTP通信についてみていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/f9ec15bf-19c7-7ff0-f18b-0c616efc6f05.png)
重要なところとしては、所定のURLにgetメソッドで情報を取得しに行っているところかと思います。

次に応答メッセージをみていきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/f309da8c-2235-c1ed-c981-1e7a6925bb7a.png)
まずstatus codeに注目です。
200と記載されているので、正常応答であることがわかります。
異常応答の場合は、404をはじめとして、さまざまなエラー応答コードが表示されます。
後に続くのが、キャッシュの有無、コンテンツの種類、エンコード化の種類などです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2666121/2285449c-6b90-655c-ca75-57212e4a579e.png)
こちらが後半です。
こちらには実際のテキストが記載されていますね。この内容がWebブラウザに渡されます。


## おわりに
以上です。今後ともパケット分析をする機会はあると思います。
数をこなすにつれて、少しずつ細部まで理解できるように、学習を続けたいです。