Wiresharkによるパケットトレースの収集と解析
ネットワークの問題解析ではパケットトレースの収集と解析が必須スキルである。もちろんプロトコル仕様を頭に入れておいたり、RFCなどの仕様書のありかを把握しておいたりしなればならない。この記事では、それができているという前提で、Wiresharkを使った解析方法をまとめる。本記事はWireshark 1.2.1をもとにしている。また、CIFSプロトコルの解析に重点を置いている。
1. パケットトレースの収集
WindowsならWiresharkをインストールして収集する。Capture Optionsは次の点に注意する。
(1)「Limit each packet size」は指定しない。
(2)初回はフィルタを指定しないか、収集データ量を絞るためにフィルタするとしても、IPアドレス程度にしておく。
(3)Display Optionsの「Upadate list of packets in real time」「Automatic scrolling in live capture」「Hide capture info dialog」の3つのチェックボックスをオフにしておく。リアルタイムでパケットをスクロールさせる必要はない(どうせ目で追い切れない)。catture info dialogで取得パケット数が増加して、確実に取得できていることがわかれば十分である。
(4)パケットが取得できない場合は「Capture packets in promiscuous mode」をオンにしたりオフにしたりしてみる。
WiresharkのLinux版も存在するが、tcpdumpで十分である。
tcpdump -ni <interface> -s 0 -w <output file> host <ip address>
(1)-sは0を指定し、パケット全体を取得する。デフォルトでは先頭から68バイトのみを取得する。TCP/UDPレイヤまでの解析ならそれでももよいが、上位のプロトコルの解析には全く使えないトレースになってしまう。
(2)インタフェースやホストは必要に応じて指定する。
2. 最初のチェック箇所(TCPの異常シーケンス)
Wiresharkでトレースファイルを読み込み、最初から最後までざっとスクロールし、再送や欠落が大量に出ていないかどうかを確認する。デフォルトでは黒背景に赤系統の配色で表示されるはずだ。ここで着目するのは主に次の4種類である。
- TCP Out-Of-Order
- TCP Dup ACK
- TCP Previous segment lost
- TCP Retransmission
Analyze→Expert Infoを使うと、取得パケットの中でErrorやWarningが何個あるかを表示してくれるので便利である。
異常シーケンスが多い場合は、これをなくすことが最初のアクションである。例えば次のような対処がある。
- ケーブルを交換してみる。
- ネットワークスイッチの別のポートにつないでみる。
- 交換可能なものであればトランシーバ(SFP)を取り替えてみる。
- ネットワークスイッチのログを確認する。
- サーバのログを確認する。
3. エラーパケットの検索
プロトコルのやり取りの中で異常が起きた場合は、パケット一覧のInfo欄に「error」と表示されることが多い。文字列検索機能でこれを探す。Edit→Find packet(Ctrl + F)を実行し、次の条件で検索する。
- Stringsを選択
- Filterに「error」を入力
- Packet listを選択
- Case sensitiveを選択しない
念には念を入れて、Packet detailsも検索する。Packet bytesの検索は意味がない。
CIFSのNTLM認証では、必ず次の「エラー」パケットが送られるが、これは3ウェイハンドシェークの一部であり、正常である。
Session Setup AndX Response, NTLMSSP_CHALLENGE, Error: STATUS_MORE_PROCESSING_REQUIRED
4. 特定プロトコルの解析
特定のプロトコルのやり取りを解析するにはフィルタを使う。Filter欄に「DNS」「HTTP」「NFS」「SMB」などと入力してApplyをクリックすると、そのプロトコルに関わるパケットのみが表示される。
Wiresharkは各パケットのプロトコルを自動判定するが、誤認識することもある。誤判定したプロトコル「Analyze」→「Enabled Protocols」で無効にすれば、正しいプロトコルで認識するだろう。
5. 特定IPアドレス間のパケット抽出
特定のIPアドレス管でやり取りされたパケットだけに着目する場合のフィルタは以下の通り。
(ip.src == 192.168.1.1 && ip.dst == 172.16.7.46) || (ip.dst == 192.168.1.1 && ip.src == 172.16.7.46)
6. CIFSコマンドによるフィルタ
特定のCIFSコマンドに着目するときは、16進数2桁のコマンドコードでフィルタする。たとえばSession Setup AndXは0x73である。Packet DetailsのSMB Header欄にコマンドが出ている。目的のコマンドを見つけて右クリックし、「Apply as filter」→「Selected」を実行する。
7. CIFSのエラーレスポンス抽出
CIFSのエラーレスポンスを抽出するには、「smb.nt_status != 0」をフィルタとして使えばよい。
8. CIFSのファイル名
ASCII文字のファイル名はWiresharkのInfo欄やPacket Details欄に表示されるが、日本語はそういうわけにいかない。ちょっとしたテクニックが必要である。
CIFSプロトコルでファイル名はUnicodeで、かつリトルエンディアンである。0x0A0Bは1バイト目と2バイト目が逆転したビット列「0000101100001010 」で送られる。これに対してTCP/IPプロトコルはビッグエンディアン(ネットワークバイトオーダ)であり、0x0A0Bはビット列「0000101000001011」で送られる。
例えば「5C00 3100 3900 3200」がPacket bytes欄にあったとする。これは005C (\) 0031 (1)0039 (9) 0032 (2)、つまり「\192」を表す。
ファイル名が「b0 65 57 30 44 30 d5 30 a9 30 eb 30 c0 30 fc 30」だったら、エンディアン変換して「65b0 3057 3044 30d5 30a9 30eb 30c0 30fc」。Unicodeで文字を調べて「新しいフォルダー」となる。
エンディアン
http://en.wikipedia.org/wiki/Endianness
Unicodeのキャラクタコード
http://www.unicode.org/charts/
9. CIFSのファイル名とFID(File Identifier)
CIFSでファイルがオープンされたあとのやり取りでは、FIDを使ってそのファイルが指定される。オープン時はNT Create AndX Requestでファイル名が渡され、NT Create AndX ResponseでFIDが返る。以降のやり取りではこのFIDが使われる。
Wiresharkは前後のやり取りからFIDがどのファイル名に対応するかを自動判定する。そして、どのフレームでオープンされ、どのフレームでクローズされたかをPacket Details欄に表示する。ただし間違っていることもあるので、念には念を入れてオープン時のやり取りを必ず確認すること。
ファイル名のように、Packet Details欄にカギ括弧で囲まれて表示される値は、前後のパケットのやり取りからWiresharkがこうであろうと判断した値である。実際の値はPacket Bytes欄でハイライト表示される。
Wiresharkの自動判定は非常に重宝するが、過信は禁物である。様々な角度からチェックする必要がある。
最近のコメント