インフラエンジニアのためのパケット解析入門

パケット解析は奥が深く書き出すと膨大な量になってしまうので、取っかかりの入門として解析ツールの使い方と簡単な解析事例をご紹介します。

スポンサーリンク
スポンサーリンク

パケット解析するためのツール

BSD、Macを使っているならば最初からtcpdumpがインストールされているはずです。ネットワーク機器ではBIG-IPやCheckPoint社のFWがLinuxベースなので、これもtcpdumpが使えます。WindowsはWindow7以降でパケットキャプチャが可能です(後述)。

RedHat Enterprise LinuxやCentOSはデフォルトではtcpdumpがインストールされていないので、別途インストールする必要があります。次のようにしてインストールします。

# yum -y install tcpdump

どうしてもGUIでなきゃ嫌だっていう人もいるかも知れません。まぁそれも良いでしょう。そういう人はWireSharkを使いましょう。WireSharkはWindowsでもLinuxでもMacでも使えます。WireSharkの良いところは統計やtcp flowを視覚化できるところです。WireSharkをインストールするとコマンドライン版のtsharkも一緒にインストールされます。

WireSharkを使うにしても、ネットワークに携わるならばtcpdumpを使えるようにしておく必要があります。

Windowsでパケットキャプチャ

WireSharkやWindumpなどサードパーティー製のソフトウェアがインストールされていない場合、netshコマンドでパケットキャプチャをおこなうことができます。

netshコマンドでキャプチャ

管理者権限でコマンドプロンプトを立ち上げてnetshコマンドを実行します。
以下は出力ファイルを「D:\net.etl」、サイズをデフォルトの250MBから1MBへ変更、IPアドレスが8.8.8.8のパケットをキャプチャする様子です。停止は「netsh trace stop」を実行します。

C:\WINDOWS\system32>netsh trace start capture=yes tracefile=D:\net.etl overwrite=yes MaxSize=1 IPv4.Address=8.8.8.8

トレース構成:
——————————————————————-
ステータス: 実行中
トレース ファイル: D:\net.etl
追加: オフ
循環: オン
最大サイズ: 1 MB
レポート: オフ

C:\WINDOWS\system32>ping 8.8.8.8

8.8.8.8 に ping を送信しています 32 バイトのデータ:
8.8.8.8 からの応答: バイト数 =32 時間 =17ms TTL=57
8.8.8.8 からの応答: バイト数 =32 時間 =20ms TTL=57
8.8.8.8 からの応答: バイト数 =32 時間 =16ms TTL=57
8.8.8.8 からの応答: バイト数 =32 時間 =9ms TTL=57

8.8.8.8 の ping 統計:
パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
最小 = 9ms、最大 = 20ms、平均 = 15ms

C:\WINDOWS\system32>netsh trace stop
トレースを関連付けています… 完了
トレースの結合中… 完了
データ収集を生成しています … 完了
トレース ファイルと追加のトラブルシューティング情報は、”D:\net.cab” としてコンパイルされました。
ファイルの場所 = D:\net.etl
トレース セッションは正常に停止しました。

C:\WINDOWS\system32>

パケットキャプチャに指定できるフィルターは「netsh trace show capturefilterhelp」で確認することができます。

キャプチャファイルを解析する

etlファイルはMicrosoft Message Analyzerで解析できます。以下のURLからダウンロードしてインストールします。

https://www.microsoft.com/en-us/download/details.aspx?id=44226

WireSharkやtcpdumpで解析するためにはcap形式に変換する必要があります。cap形式へ変換するためにはMicrosoft Message Analyzerでetlファイルを開いた後、[File]-[Save As]からStep 1でAll Messages、Step 2でExportをクリックしてcap形式で書き出します。

tcpdump

パケットフィルターコマンド

ネットワークには膨大な量のパケットが流れているので、パケットフィルターコマンドを適切に使用する必要があります。パケットフィルターコマンドは、パケット受信時でも保存したキャプチャーファイルを読み込む時のどちらでも使用できます。

プロトコルを指定する

tcpやudp、icmpやarpなどを指定できます。複数のプロトコルを指定したい場合は「or」を使います。

  • tcp or udp
  • tcp

ホストを指定する

hostコマンドを使用すると、送信元や送信先のホストを指定できます。

  • host 192.168.2.1
  • host 192.168.2.1 or 192.168.2.100

ネットワークを指定する

netコマンドを使用すると、送信元や送信先のネットワークを指定できます。

  • net 192.168.2.0/24

ポート番号を指定する

portコマンドを使用すると、送信元や送信先のポート番号を指定できます。

  • port 80

方向を指定する

今まで列挙したコマンドは送信元や送信先に関わらずマッチします。src/dstコマンドを使用すると、方向を指定できます。andやorを組み合わせると、より詳細にマッチさせる事ができます。

  • src host 192.168.2.1
  • dst host 192.168.2.200 and port 80
  • src net 192.168.2.0/24 and dst host 172.16.31.1 and “(port 80 or 8080)”

TCPセッションフラグを指定する

SYNやFIN、RSTなどTCPセッションフラグの値を指定できます。

ビット演算子の&(アンド)で特定のビットが立っているか調べます。次の例はRSTフラグが立っているパケットにマッチします。

  • “tcp[tcpflags] & tcp-rst != 0”

次の例はRSTもしくはFINフラグが立っているパケットにマッチします。

  • “tcp[tcpflags] & (tcp-rst|tcp-fin) != 0”

特定の範囲の値を指定する

IPヘッダーのnバイト目が○である、とかTCPヘッダーのnバイト目が○以上である、といった指定ができます。

次の例は、TCPヘッダーの先頭から14バイト目から2バイトの値(TCP WINDOW)が40(0x28)であるパケットにマッチします。

  • “tcp[14:2] == 40”
  • “tcp[14:2] == 0x28”

次の例はTCPヘッダーの先頭から14バイト目から2バイトの値が40未満のパケットにマッチします。

  • “tcp[14:2] < 40”

コマンドオプション

よく使うオプションを紹介します。

-n ホスト名を解決させない

-nn プロトコル名やポート番号を解決させない

-i <インタフェース名> 受信するインタフェースを指定する

-w <ファイル名> 受信パケットをpcap形式で保存するファイル名を指定する

-s <受信サイズ> 受信サイズを指定する

-S シーケンス番号を絶対値で表示する

-t タイムスタンプを表示しない

-tt タイムスタンプを整形せずに表示する

-ttt 直前に受信した時刻からの経過時間を表示する

-tttt 現在の日付と時刻を整形して表示する

-ttttt パケット受信を開始した時刻からの経過時間を表示する

-x パケットを16進数でダンプする

-X パケットを16進数でダンプし、併せてパケットの内容をアスキー表示させる

-v 詳細表示モードにする

-vv 更に詳細な表示モードにする

-vvv 最も詳細な表示モードにする

-e イーサネットヘッダーも表示する

-r <ファイル名> pcap形式で保存したファイルを読み込む

TCPの解析例

パケット解析するためには、パケットの構造を熟知している必要があります。不安な方は次の記事を参考にしてください。

参考記事:TCP/IPヘッダ構造

3ステップハンドシェーク(3ウェイハンドシェーク)

TCPは次の手順で3ステップハンドシェークによる接続を確立させます。

  1. クライアントからサーバーへSYNを送信する
  2. サーバーがクライアントへSYN+ACKを送信する
  3. クライアントがサーバーへACKを送信する

次の例は、yahoo.co.jpへHTTP接続する様子をtcpdumpで受信した時の結果です。

マーキングしている1〜3行目が3ステップハンドシェークを行っている箇所です。

  1. クライアントからサーバーへSYNを送信(初期シーケンス番号 3917004649)
  2. サーバーがクライアントへSYN+ACKを送信(初期シーケンス番号 3111149831/確認応答番号 3917004650)
  3. クライアントがサーバーへACKを送信して接続完了(確認応答番号 3111149832)

コネクション切断

トラブルシューティングを行う場合は、TCPコネクションがどのように遷移するのか知っている必要があります。とても重要なことなので、rfc793から抜粋したTCPの遷移図を掲載します。

それでは、先ほど掲載したtcpdumpの結果を再掲載します。マーキングした箇所がTCPコネクションの切断を行っている箇所です。

順に追ってみましょう。

  • 8行目:クライアントがFINを送信して「FIN-WAIT-1」へ遷移する。
  • 9行目:FINを受信したサーバーはACK送信して「CLOSE WAIT」へ遷移する。クライアントはサーバーからACKを受信して「FIN WAIT-2」へ遷移する。
  • 10行目:サーバーがFINを送信して「LAST ACK」へ遷移する。
  • 11行目:FINを受信したクライアントはFIN+ACKを送信して「TIME WAIT」へ遷移する。
  • 12行目:サーバーはFIN+ACKを受信して「CLOSED」へ遷移する。クライアントはタイムアウトして「CLOSED」へ遷移する。

選択確認応答(sack)

従来の累積確認応答はパケットを受信するごとに確認応答を返す、というやり取りを行っていました。この方法は信頼性があるのですが、やり取りが多くなるため効率が悪くなってしまいます。そこで、スライディングウィンドウというものを利用することになりました。これは簡単にいうと受信バッファが空いている間は確認応答を待たなくても連続して送信して良い、というものです。ここでいう受信バッファというのはTCP Windowサイズのことです。スライディングウィンドウは高速通信環境ではスループットを高めてくれますが、途中でパケットを喪失すると最後に確認応答したところからやり直す必要があります。また、高遅延な通信環境ではスループットの低下が顕著になります。

そこで、喪失したパケットだけ再送信して効率化を高めましょう、という発想から生まれたのが選択確認応答(sack)です。

それでは実際に再送している様子をtcpdumpで観察してみましょう。ちょっと長いので、スマートフォンでは見づらいかも知れません。

順を追ってsackによる再送の様子を説明します。少し長くなりますがパケットキャプチャの結果と併せて見てください。

5行目でクライアントは確認応答番号として3717860718を送信しています。そのため次に受信するべきシーケンス番号は3717860718のはずですが、6行目で受信したシーケンス番号は3717989590です。これによりクライアントは5行目と6行目の間でパケットを喪失した事を検知します。そして、7行目でsackを送信します。

sack 1 {3717989590:3717992486}

このsackにより、サーバーは最後にクライアントから受信したシーケンス番号3717860718からsackで通知された3717989590までの128,872バイトを再送する必要があるとわかります。

8行目から、サーバーは最初に喪失したシーケンス番号3717860718のパケットを再送します。tcpdumpの出力では次のようにシーケンス番号が表示されています。

seq 3717860718:3717863614

このとき、サーバーは2,896バイト送信しているので、シーケンス番号は3717860718〜3717863614となっています。しかし喪失した128,872バイトには足りないため、9行目でクライアントは再びsackを送信しています。

sack 1 {3717989590:3717992486}

その後再送とsackの送信を繰り返し、36行目でようやく喪失したすべてのパケットの再送を終えます。tcpdumpの出力では次のようにシーケンス番号が表示されています。

seq 3717979454:3717989590

シーケンス番号3717989590まで送信していることがわかります。すべての再送を終えたため、37行目からは再び続きの通信を開始しています。

これがsackによる再送のやり取りです。

まとめ

パケット解析をするためにはツールの使い方はもちろんの事、TCP/IPや解析しようとしているプロトコルの知識も必要となってきます。一番の勉強方法は良質な書籍を熟読する事です。もっともオススメなTCP/IP関連の書籍を紹介します。

更に上を目指すならば応用編にチャレンジしてみて下さい。

TCP/IPの基礎は年月を経ても変わる物ではないので、基礎から固めておけば必ず役に立ちます。

オススメのパケットキャプチャ関連書籍

解析ツールの使い方や、パケットキャプチャ手法について学びたければ、次の書籍がオススメです。

スポンサーリンク
スポンサーリンク

フォローする

スポンサーリンク
スポンサーリンク