ネットワークスペシャリスト - SE娘の剣 -

左門至峰によるネットワークスペシャリストの試験対策サイトです。勉強方法、合格体験談、合格のコツ、過去問解説、基礎知識などの紹介します。

パケットキャプチャ(Wireshark)のすすめ

1.パケットキャプチャのすすめ

少なくとも1回はやってみましょう。書籍などで、フレームの構造などを見ますが、心の底から納得することはできないと感じています。北海道の良さは、写真やテレビでもある程度は分かるでしょうが、本当の良さは現地に行かないとわからないと思います。
 例えがよかったかはさておき、生データをみることが、北海道でいうと現地に行くことになるでしょう。心の底から理解できるはずです。
 また、実務では確実に役立ちます。トラブルシュートには大活躍です。例えば、以下のNATの記事で書いた構成の場合、最初はPCからのPingが通りませんでした。


FWでブロックされているかと思いましたが、FWの前後でキャプチャをしてみると、pingはサーバまで届いているのです。でも、応答を返しません。ということは、サーバで破棄されていることが分かりました。
結果は、ウイルスソフトのIPS機能がpingを拒否していました。同一セグメントからのpingには応答するのですが、違うセグメントからのpingには応答しないとう仕様で、調査に少し時間がかりました。でも、キャプチャのおかげで効率的な調査が行えました。
キャプチャはWiresharkというフリーのソフトを入れるだけです。ぜひ、入れて、この目で通信を確認してください。

2.パケットキャプチャの方法

Q.ネットワーク上のパケットを取得するにはどうすればいいか?

2
パケットキャプチャは試験にてよく問われますね。
方法はわかりますよ。PCにWireshark(旧イーサリアル)やClearSightなどのキャプチャソフトを入れ、スイッチに接続すればキャプチャできますよ。

いや。それでは不十分だ。自分(キャプチャソフトが入ったPC)が送受信するネットワーク上のパケットは取得できるが、それ以外は取得できない。なぜなら、スイッチングHUBの仕組みにより、宛先MACアドレスをみて、該当ポートにのみパケットを転送するからだ。つまり、キャプチャするPCにはパケットは送信されないのだ。
ではどうするか?
▼方法1) バカHUBを入れる
なぜこれで取得できるかをイメージしてください。イーサネットの仕組みは、同一セグメントにパケットがながれ、宛先が自分でない場合に破棄するという仕組みをとっているから。キャプチャソフトでは、宛先が自分以外のパケットも取得するようになっている。
▼方法2) ミラーポートの設定
上位のスイッチ(L2、L3を問わず)では、ミラーポートの設定というのが行える。
Catalystの設定例:Fa0/1ポートをFa0/2ポートにミラーする場合。

monitor session 1 source interface fastethernet0/1
monitor session 1 destination interface fastethernet0/2

・過去問では、ミラーポートを使ったフレーム解析の例が記載されている。(※一部改変)

過去問(平成21年午後1問1)
L2SWの未使用ポートを、Xポートのミラーポートとして設定して、トラフィックモニタを接続し、通信されているフレームを解析してみた。

・過去問での穴埋め問題

過去問(H21年午後Ⅱ問2)
情報を収集するためにトラフィックモニタを利用して調査しようと考えた。しかし,サーバαを接続するL2SW-2には,[ ク ]機能がなかったので,サーバのソフトを利用して調査した。






正解は「ミラーリング」。ミラーリングとは,あるポートで送受信されているトラフィックを別のポートに鏡(ミラー)のように出力する機能。

■加えて、パケットを取り込むPC側の設定も必要
Wiresharkでパケットキャプチャをするときは、「プロミスキャスモード(promiscuous mode)」を設定する。プロミスキャス(無差別)モードを設定しないと、自分宛ではないフレームを廃棄してしまう。
(※この点は、H26NW午後Ⅱ問2設問3(1)にて、関連する出題あり)

3.Wiresharkの使い方

ネットワークの学習をするのに、Wiresharkは是非とも活用していただきたいツールです。
Wiresharkのインストールは、以下にファイルやインストール方法が分かりやすく記載されています。
(旧リンク)https://ja.osdn.net/projects/wireshark/howto/install
簡単に概要を紹介します。

その前に、以下のダウンロードとインストールを済ませておいてください。

 ①Wiresharkのダウンロード
 ②  〃 のインストール+WinPcap
 ③Interface ListからキャプチャするIFを選択した「Start」

(1)基本動作 開始、停止、保存

・キャプチャのスタート
上記にも書いたが、起動後、キャプチャするIFをダブルクリックすればいい
・キャプチャの停止 →赤い■のボタン
参考までに、先に書いたプロミスキャスモードは、デフォルトでONになっている。確認方法は、メニューの「キャプチャ」「オプション」を開く。すると、「すべてのインターフェースにおいて、プロミスキャスモードを有効にします」にチェックが入っている。


・設定を変更するには、停止をしたあと、その2つ右の歯車のようなボタンを押す
・もう一度キャプチャ→一番左の青いボタン
・キャプチャファイルの保存:停止後、左上の「ファイル」から「...として保存」。ファイルの拡張子は昔は.pcapだったが、今はng(next generation)をつけてpcapng

・時刻設定
好みではあるが、デフォルトは、「キャプチャ開始からの秒数」になっている。時刻表示に変えるには、「表示」>「時刻表示形式」>「日時」を選択する。まあ、こちらの方がわかりやすいが、変えなくてもいい気もする。

(2)画面構成

・キャプチャ画面 3つの層に分かれている。上から以下の3つである。
 ①パケット一覧
 ②個別パケットの詳細
 ③生データ(左が16進数表記、右がそれをASCII文字にしたもの)
補足:①に関して、「time」は、パケットキャプチャを開始してからの秒数。※小数点かなり細かくまで表示されますね。見づらいと思った人は、「表示」>「時刻表示形式」で西暦の時刻表示などにも変更可能。
・色付け
「表示」>「色付けルール」がある。デフォルトで色付けのルールが指定されている。変更も可能。

(3)フィルタ

パケットは大量にあるので、フィルタが有効である。
①フィルタ欄から
Filter欄をうまく使う。例えば、icmpなどのプロトコルを入れると、該当するプロトコルのみにフィルターされる。
以下は、icmpでフィルタした例


その他のフィルタ例は

項目 設定例
プロトコルを指定 HTTP http
除外する(例)ICMPを除外 !icmp
IPアドレスを指定する ip.addr==192.168.1.1
条件をandやorでつなげる icmp and ip.addr == 192.168.0.7
ポート番号でフィルタ tcp.port == 80
・AND条件
(tcp.dstport == 64148) && (tcp.srcport == 443)
・OR条件
(tcp.dstport == 64148)|| (tcp.srcport == 64148)

②パケットを選択して、右クリックで
「フィルタとして適用」>「適用済」としても、フィルタができる。フィルタしたい項目(たとえば、宛先IPなのか、送信元IPなのか。プロトコルではできなかった)で右クリックするとよい。
・フィルタに関しては、フィルタしたい項目を右クリックで「フィルタに適用」をすると、構文が出てくるので参考にするといいと思う。
・また、右クリックで「フィルタに適用」するときに、「and selected」や「or selected」があるので、ANDやOR構文を忘れたときにはこれを参考にするといい。
・正規表現というか、文字列を含む検索もできる。その場合はcontainsを使う
 http.authbasic contains abc

③tcp.port==80とHTTPはどう違うのか
HTTPを検索したいのに、うまく出てこない場合がある。それは、たとえば、3wayハンドシエークはTCPだが、実際の通信はHTTPで表示されるからである。なので、この場合は送信元IPで検索したり、TCPのポート80で検索した方がいい場合もある。(例は以下)
 tcp.port == 80 || udp.port == 80
まあ、tcp.port==80の方が、より多くのパケットを取得できると考えよう。
以下、同じパケットを比較した結果。tcp.port == 80の方が、表示される項目が明らかに多い。




③その他
・フィルタの右にある×でフィルタの解除ができる。

④事前にフィルタ
・この画面でフィルタするのではなく、事前にフィルタの設定ができる。ただし、構文が変わるので注意。たとえば、192.168.0.7のIPからの通信だけをフィルタするには、以下とする。
 host 192.168.0.7
※このとき、該当のIFをクリックしてスタートすることを忘れないように。

(4)検索

❶フィルタの活用
上記のフィルタでも検索みたいなことができる。

❷すでに述べたが、以下をフィルタのところに入れれば、http.authbasicにおいて、abcが含まれるかを検索できる。

http.authbasic contains abc


❸Ctrl+Fで検索
または、虫眼鏡のマークから検索するのが王道であろう。ちょっと使い方が難しい。
ア)パケットの種類
これは、すでに説明した内容と合致する
 ・パケット一覧 → ①パケット一覧
 ・パケット詳細 → ②個別パケットの詳細 ★パケット内の文字列を探すなら、この「パケット詳細」を選択する必要がある。
 ・パケットバイト列 → ③生データ(左が16進数表記、右がそれをASCII文字にしたもの)
イ)文字コード
以下の3つがあるが、すべてをカバーするナローとワイドを選ぶ。
 ・ナローとワイド
 ・ナロー(UTF-8/ASCII)
 ・ワイド(UTF-16)
ウ)検索方法
以下がある。
 ・表示フィルタ → Wiresharkのフィルタの方法なので、 ip.addr==192.168.1.1
 ・16進数値 →16進数で検索 
 ・文字列 →これが一般的だろう   ★パケット内の文字列を探す場合、うまく検索できなかった気がする。下の正規表現を選び、*などを使わずに検索したい文字列を入れて検索できた。
 ・正規表現 →たとえば*などを使う
 →検索結果の一覧が表示されるのではなく、「検索」ボタンを押すごとに、該当の検索結果の項目に飛ぶ。

❹文字をフィルタで検索
 ・データ部分に helloの文字があるかの検索は、フィルタの欄に、以下を入れれば可能。 注意点は、全文を検査するので、少し時間がかかる。データ量にもよるが、数秒は待とう。

フィルタ方法 補足
frame matches "hello" helloで検索
frame matches "(?i)hello" 大文字小文字を区別しない
frame matches hello 古いバージョンはこれかも
(5)追跡(TCPストリーム)

TCPの通信は、3wayハンドシエークから始まり、一つのコネクションを確立する。その一連の通信を確認する方法だ。これであれば、パケットがあちこち行かずにまとめて見えるので、見やすい。→たしか、ポート番号を含むTCPコネクション情報でひとまとまりにしているはずだ。
方法は、パケットを選択して右クリック、「追跡」>「TCPストリーム」である。
これがすごいのは、普通のHTTPは難しいが、FTPで通信した様子などは、きれいに表示してくれる。
このとき、右下にストリーム番号が表示され、一つ一つ順番にHTMLファイルなどを表示してくれる。これで、データをじっくり見るといいだろう。
・また、添付ファイルがある通信をまとめて、RAW形式(生データ)で保存すれば、ファイルを復元も可能だ。
以下のページにあるが、2.zipというファイルを復元している様子が書かれてある。すごい!
book.mynavi.jp

(6)ファイルの出力

ファイル>オブジェクトをエクスポート から行える
HTTPなどで実施すると、ファイルがそのまま取得できるからすごい。 あくまでも、画像やファイルなど、HTTPを通じてダウンロードしたファイルであり、.htmlファイルは含まれなかった気がする。
imfだとメールの復元が可能。→先にimfでフィルタして、メールの復元も可能である。

(7)その他

・IPアドレスの一覧
「統計(Statistics)」>「Conversions」で、イーサネットヘッダおよびIPアドレスの一覧が見える。
・プロトコルの一覧
「統計(Statistics)」>「プロトコル階層(Protocol Hierarchy)」

4.生データを確認する

では、実際の内容をWiresharkのキャプチャ画面で見てみましょう。
次のARPパケットは、192.168.1.1は誰かを聞いています。
一番上が概要で、2つ目が詳細データです。一番下の欄が生データです。どれも大事ですが、一番下まで見ておくと、すっきり分かると思います。
❶一番上の概要

❷詳細

こちらを見ると、フレームの中を全て確認できます。
以下を参照に、ARPのフレームフォーマットと照らし合わせながら確認いただくといいでしょう。
https://nw.seeeko.com/archives/50559138.html
そして、上記に書いたフレーム構造と合致していることも理解いただけるでしょう。

❸一番下の生データ(16進数データ)

生データを見ましょう。
例えば、このARPのイーサネットヘッダとして、宛先MACアドレスFFFFFFFFFFFがセットされています。生データでも0行目(0000)にfffffffffffがセットされ、次は送ったMACアドレスがそのままセットされています。
そのあと、TypeはARPの0806が入っています。実際のデータは16進数だけでなく、2進数なので01データですが、なんとなく実際の通信がイメージできたのではないでしょうか。