2020年2月2日パケット解析は奥が深く書き出すと膨大な量になってしまうので、取っかかりの入門として解析ツールの使い方と簡単な解析事例をご紹介します。選択確認応答(sack)まとめオススメのパケットキャプチャ関連書籍パケット解析するためのツール*BSDやMacを使っているならば最初からtcpdumpがインストールされているはずです。ネットワーク機器ではBIG-IPやCheckPoint社のFWがLinuxベースなので、これもtcpdumpが使えます。WindowsはWindow7以降でパケットキャプチャが可能です(後述)。LinuxやCentOSはデフォルトではtcpdumpがインストールされていないので、別途インストールする必要があります。次のようにしてインストールします。tcpdumpどうしてもGUIでなきゃ嫌だっていう人もいるかも知れません。いう人はWireSharkを使いましょう。WireSharkはWindowsでもLinuxでもMacでも使えます。flowを視覚化できるところです。WireSharkをインストールするとコマンドライン版のtsharkも一緒にインストールされます。WireSharkを使うにしても、ネットワークに携わるならばtcpdumpを使えるようにしておく必要があります。WindowsでパケットキャプチャWireSharkやWindumpなどサードパーティー製のソフトウェアがインストールされていない場合、netshコマンドでパケットキャプチャをおこなうことができます。netshコマンドでキャプチャ管理者権限でコマンドプロンプトを立ち上げてnetshコマンドを実行します。以下は出力ファイルを「D:\net.etl」、「D:\net.etl」のサイズをデフォルトの250MBから1MBへ変更、IPアドレスが8.8.8.8のパケットをキャプチャする様子です。stop」を実行します。プロンプトが戻ってきたらパケットキャプチャができる事を確認するために、8.8.8.8へpingを打ってみます。stopコマンドでパケットキャプチャを止めます。してコンパイルされました。セッションは正常に停止しました。してコンパイルされました。セッションは正常に停止しました。capturefilterhelp」で確認することができます。Analyzerで解析できます。以下のURLからダウンロードしてインストールします。AnalyzerWireSharkやtcpdumpで解析するためにはpcap形式に変換する必要があります。2でExportをクリックしてpcap形式で書き出します。tcpdumpパケットフィルターコマンドネットワークには膨大な量のパケットが流れているので、パケットフィルターコマンドを適切に使用する必要があります。パケットフィルターコマンドは、パケット受信時でも保存したキャプチャーファイルを読み込む時のどちらでも使用できます。プロトコルを指定するtcpやudp、icmpやarpなどを指定できます。複数のプロトコルを指定したい場合は「or」を使います。udptcpホストを指定するhostコマンドを使用すると、送信元や送信先のホストを指定できます。192.168.2.100ネットワークを指定するnetコマンドを使用すると、送信元や送信先のネットワークを指定できます。192.168.2.0/24ポート番号を指定するportコマンドを使用すると、送信元や送信先のポート番号を指定できます。80方向を指定する今まで列挙したコマンドは送信元や送信先に関わらずマッチします。src/dstコマンドを使用すると、方向を指定できます。andやorを組み合わせると、より詳細にマッチさせる事ができます。8080)”TCPセッションフラグを指定するSYNやFIN、RSTなどTCPセッションフラグの値を指定できます。ビット演算子の&(アンド)で特定のビットが立っているか調べます。次の例はRSTフラグが立っているパケットにマッチします。0”次の例はRSTもしくはFINフラグが立っているパケットにマッチします。0”特定の範囲の値を指定するIPヘッダーのnバイト目が○である、とかTCPヘッダーのnバイト目が○以上である、といった指定ができます。WINDOW)が40(0x28)であるパケットにマッチします。0x28”次の例はTCPヘッダーの先頭から14バイト目から2バイトの値が40未満のパケットにマッチします。40”コマンドオプションよく使うオプションを紹介します。ファイルをローテーションする個数を指定するキャプチャファイルのローテーションキャプチャファイルを保存する領域のサイズが限られている際、ローテーションするサイズと個数を指定する事によって解決できます。100こうすると、キャプチャファイルが100MBに達すると新たにファイルが作られる事なく同一ファイル名でローテーションします。稀にしか再現しない障害などを調査する目的で延々とキャプチャを続けなければならない場面で役に立ちます。TCPの解析例パケット解析するためには、パケットの構造を熟知している必要があります。不安な方は次の記事を参考にしてください。791からの抜粋です。この図をもとに説明します。...3ステップハンドシェーク(3ウェイハンドシェーク)TCPは次の手順で3ステップハンドシェークによる接続を確立させます。クライアントからサーバーへSYNを送信するサーバーがクライアントへSYN+ACKを送信するクライアントがサーバーへACKを送信する次の例は、yahoo.co.jpへHTTP接続する様子をtcpdumpで受信した時の結果です。0マーキングしている1〜3行目が3ステップハンドシェークを行っている箇所です。3111149832)コネクション切断トラブルシューティングを行う場合は、TCPコネクションがどのように遷移するのか知っている必要があります。重要なことなので、rfc793から抜粋したTCPの遷移図を掲載します。+---------+それでは、先ほど掲載したtcpdumpの結果を再掲載します。マーキングした箇所がTCPコネクションの切断を行っている箇所です。0順に追ってみましょう。8行目:クライアントがFINを送信して「FIN-WAIT-1」へ遷移する。WAIT」へ遷移する。WAIT-2」へ遷移する。WAIT」へ遷移する。12行目:サーバーはFIN+ACKを受信して「CLOSED」へ遷移する。クライアントはタイムアウトして「CLOSED」へ遷移する。選択確認応答(sack)従来の累積確認応答はパケットを受信するごとに確認応答を返す、というやり取りを行っていました。この方法は信頼性があるのですが、やり取りが多くなるため効率が悪くなってしまいます。そこで、スライディングウィンドウというものを利用することになりました。これは簡単にいうと受信バッファが空いている間は確認応答を待たなくても連続して送信して良い、というものです。Windowサイズのことです。スライディングウィンドウは高速通信環境ではスループットを高めてくれますが、途中でパケットを喪失すると最後に確認応答したところからやり直す必要があります。高遅延な通信環境ではスループットの低下が顕著になります。そこで、喪失したパケットだけ再送信して効率化を高めましょう、という発想から生まれたのが選択確認応答(sack)です。それでは実際に再送している様子をtcpdumpで観察してみましょう。長いので、スマートフォンでは見づらいかも知れません。8688順を追ってsackによる再送の様子を説明します。長くなりますがパケットキャプチャの結果と併せて見てください。5行目でクライアントは確認応答番号として3717860718を送信しています。0そのため次にクライアントが受信するべきシーケンス番号は3717860718のはずですが、6行目で受信したシーケンス番号は3717989590です。3717860718は128,872ですから、128,872バイトを5行目と6行目の間に喪失した事になります。クライアントはパケットの喪失をここで検知しました。喪失した部分を埋めるために、クライアントは7行目でsackを送信します。シーケンス番号3717989590以前のパケットを喪失したため再送する必要がある事をsackで伝えています。0このsackにより、サーバーはクライアントから受信した確認応答番号3717860718からsackで通知された3717989590までの128,872バイトを再送する必要があるとわかります。8行目からサーバーは最初に喪失したシーケンス番号3717860718のパケットを再送します。tcpdumpの出力では次のようにシーケンス番号が表示されています。2896このとき、サーバーは2,896バイト送信しているので、シーケンス番号は3717860718〜3717863614となっています。喪失した128,872バイトには足りないため、9行目でクライアントは再びsackを送信しています。0サーバはクライアントから受信した確認応答番号3717863614からsackで通知された3717989590まで再送する必要があるとわかります。その後再送とsackの送信を繰り返し、36行目でようやく喪失したすべてのパケットの再送を終えます。tcpdumpの出力では次のようにシーケンス番号が表示されています。10136シーケンス番号3717989590まで送信していることがわかります。すべての再送を終えたため、クライアントはパケット喪失から回復した直後に受信した6行目のパケットへの確認応答をする必要があります。以下は6行目でサーバから受信したパケットです。この直前までパケットを喪失していました。2896上記のパケットへの応答を37行目でクライアントがサーバへ送信しています。シーケンス番号3717992486に対して確認応答番号3717992486を返しています。038行目から通常のデータ転送を再開しています。これがsackによる再送のやり取りです。まとめパケット解析をするためにはツールの使い方はもちろんの事、TCP/IPや解析しようとしているプロトコルの知識も必要となってきます。勉強方法は良質な書籍を熟読する事です。オススメなTCP/IP関連の書籍を紹介します。上を目指すならば応用編にチャレンジしてみて下さい。応用編TCP/IPの基礎は年月を経ても変わる物ではないので、基礎から固めておけば必ず役に立ちます。解析ツールの使い方や、パケットキャプチャ手法について学びたければ、次の書籍がオススメです。コメントをキャンセルメールアドレスが公開されることはありません。date*日本語が含まれない投稿は無視されますのでご注意ください。