Windowsのパケットキャプチャ3道具の知識マップ(知識グラフ)
顧客サーバーにソフトを入れられなくても、pktmonとnetsh traceはWindows標準で使えます。だから「採るのは標準ツール、読むのはWireshark」が現場の基本形になります。どちらの出力もETL形式なので、pktmonならetl2pcap、netsh traceならMicrosoft製のetl2pcapngでpcapngへ変換してから解析します。pktmonの独自価値は、NICの1地点ではなくネットワークスタック内の複数地点で捕捉し、どこで何の理由でパケットが破棄されたかまで報告できることです。ただし既定では先頭128バイトしか記録しないので、中身まで読むなら--pkt-size 0が要ります。localhost宛の通信は物理NICを通らないため通常のキャプチャには映らず、Npcapのループバックアダプタかpktmonのスタック内採取を使います。TLSで中身が見えなくても、どちらがいつ黙ったかは残ります。
Packet Monitor(pktmon)
Windows標準でパケットキャプチャができるツールで、取得したETLはpcapngに変換してWiresharkで開ける。
Wireshark
キャプチャしたパケットをパケット詳細ペインとバイト列ペインで対応づけて表示できる、パケット解析ツール。
管理者権限
コンピューター全体の設定を変更できる権限。
昇格
ETLログ
pktmonやnetsh traceが出力するイベントトレースのログ形式。そのままではWiresharkで開けない。
netsh trace
シナリオとしてETWプロバイダー群を束ね、パケットとWindowsコンポーネント内部のイベントをまとめて採取するWindows標準のコマンド。
etl2pcapng
netsh trace等で採取したETLファイル内のパケットをpcapng形式へ変換するMicrosoft製のオープンソースツール。インターフェイス情報を保持する。
pcapng形式
Wiresharkなどが読めるパケットキャプチャのファイル形式。
pktmonのドロップ理由
ネットワークスタック内のどのコンポーネントでパケットが破棄されたかと、その理由を示す情報。
Windowsファイアウォール
全エディションで既定有効の、Windows標準のホスト型ファイアウォール。
pktmonの--pkt-size
1パケットあたり記録するバイト数の指定。既定は128バイトで、0を指定するとパケット全体を記録する。
netsh traceのシナリオ
トラブルシューティング用に事前定義されたETWプロバイダーの集合。
リングバッファ採取
上限に達したら古いデータから捨て、最新のデータだけを保持し続けるキャプチャの出力モード。
Wiresharkの表示フィルタ
ip.addrやtcp.portなどのフィールドと比較演算子、and/or/notで表示するパケットを絞り込む式。
WiresharkのTCP解析フラグ
tcp.analysis.retransmission・duplicate_ack・out_of_order・zero_windowなど、TCPの異常をWiresharkが判定して付ける印。
ループバック通信
localhost(127.0.0.1 / ::1)宛や自分自身の実IP宛のように、物理NICを通らずOS内部で折り返される通信。
物理NICを対象にしたキャプチャ
パケットキャプチャで物理ネットワークアダプターをキャプチャ対象に選ぶ構成。マシン内で完結するループバック通信はNICを通らないため映らない。
Npcapのループバックアダプタ
Wiresharkでループバック通信を採取するためにNpcapが提供する仮想キャプチャ対象。
SSLKEYLOGFILE
TLSのセッション鍵をファイルへ書き出し、Wiresharkでの復号を可能にする環境変数。
SChannel
WinHTTPやWinINETを使うアプリが利用するWindows標準のTLS実装。
複数マシンのログの突合
複数のコンピューターのイベントログを時刻順に並べ、前後関係から事象の流れを追う調査手法。
w32tmコマンド
w32timeの同期状態確認・診断・構成をコマンドラインから行うツール。
pktmonはフィルタ登録→開始→再現→カウンター確認→停止→変換という流れを、管理者権限のターミナルで実行する。Windows 10およびWindows Server 2019(バージョン1809)以降で利用できる。
pktmonの採取結果はETL形式で出力され、そのままではWiresharkで開けない。
netsh traceもETL(と.cab)で出力するため、解析にはpcapngへの変換が要る。
pktmonのETLログはpktmon etl2pcapでWireshark等が解析できるpcapng形式へ変換できる。ただしpcapng形式では破棄情報やスタック内の捕捉地点の情報が失われる。
etl2pcapngはnetsh trace start capture=yes等で採取したETLファイル内のパケットをpcapng形式へ変換するMicrosoft製オープンソースツールで、インターフェイス情報を保持する。
Wiresharkは表示フィルタ・TCP解析・統計・GUIを備えた読む側の道具で、標準ツールで採ったログはpcapngへ変換してから手元のWiresharkで読む。
pktmonはNICの1地点ではなくネットワークスタック内の複数地点でパケットを捕捉し、破棄された場所と理由を報告できる。pktmon counters --drop-reasonでコンポーネントごとの通過・破棄カウンターと直近のドロップ理由を一覧できる。
pcapng形式には破棄情報やスタック内の捕捉地点の情報が引き継がれないため、同じパケットが重複して見えることがある。Wiresharkで読む目的なら--component-idで地点を絞るか、--drop-onlyでドロップだけを別ファイルにする。
アプリに届く前にOSのどこかで捨てられているという疑いは、受信規則の不備でファイアウォールに落とされているケースの切り分けに効く。
--pkt-sizeの既定は128バイトで、0を指定するとパケット全体を記録できる。Wiresharkで中身まで読むつもりなら開始時に指定しておく必要がある。
シナリオはトラブルシューティング用に事前定義されたプロバイダーの集合で、netsh trace show scenarios / show scenarioで確認できる。パケットに加えてWindowsコンポーネント内部のイベントも残る。
netsh trace startのfileModeにcircularを指定するとリングバッファとして動作し、persistent=yesなら再起動をまたいでセッションを維持できる。
Wiresharkのキャプチャファイル出力モードにも単一ファイル・複数ファイル・リングバッファがあり、リングバッファは最新のデータだけを保持し続ける。
ip.addrやtcp.portなどのフィールド指定と比較演算子、and/or/notの組み合わせで表示するパケットを絞り込む。
tcp.analysis.retransmission・duplicate_ack・out_of_order・zero_windowなどのTCP解析フラグで、再送やゼロウィンドウといった異常を絞り込める。
127.0.0.1宛のループバック通信はNICを通らないため、物理NICを対象にした通常のキャプチャでは採取できない。WiresharkでもNpcapのループバックアダプタを選べば採れる。localhostがIPv6の::1に解決されることもあるため、表示フィルタは両方張るかアプリの接続先をアドレスで明示する。
Npcapの「Adapter for loopback traffic capture」をキャプチャ対象に選べばループバック通信を採取できる。Windows版Wireshark 3.0以降のインストーラーにはNpcapが同梱されている。
pktmonはNICの外側ではなくネットワークスタック内部の複数地点で採取するため、ループバック通信の観測にも使える。
SSLKEYLOGFILEで書き出したセッション鍵によるWiresharkの復号に対応するのはFirefox・Chrome・Chromium系EdgeやOpenSSL系ライブラリなど一部の実装で、Windows標準のSChannelはこの仕組みに対応していない。
両側で採ったキャプチャやアプリログを同じ時間軸へ並べるには時計が合っていることが前提で、W32Timeの構成・監視・トラブルシューティングにはw32tmを使う。
マイクロソフトのパケットロス調査ガイドは、まずpktmonでトレースを採取してローカルの破棄理由と統計を確認し、足りなければコンポーネントレベルのトレースへ進み、プロトコルの振る舞いはWiresharkで解析するという順序を示している。