こんにちは、ネットワーク屋 ばにゃです。
本記事では Windows 環境における netsh コマンドを使用したパケットキャプチャ について解説します。
- Windows OS の netsh trace コマンドを使用してパケットキャプチャを行う方法
- 採取した etl ファイル を Network Monitor を使用して解析する方法
- 採取した etl ファイルを Wireshark で解析可能な形式に変換して解析する方法
netsh trace コマンドによるパケットキャプチャの採取に関しては、Wireshark 等のソフトをインストールしていない環境でも有効な方法となります。
Linux 環境でのパケットキャプチャに関しては以下の記事を参考にしてください。
前提となる環境
本記事では、以下のような環境を例として記載します。この環境で私自身が実機動作確認済みの手順となります。
- Windows Server 2019
- Windows Server 2016
- Windows Server 2012 R2
- Windows Server 2012
- Windows Server 2008 R2
- Windows 10
- Windows 8.1
- Windows 8
- Windows 7
パケットキャプチャの採取
基本的な採取手順と、使用頻度の高いオプションについて解説します。
パケットキャプチャ採取手順
- 採取する端末に管理者権限のユーザーでサインインします。
- 管理者権限でコマンドプロンプトを起動します。
- 以下のコマンドを実行し、キャプチャを開始します。
netsh trace start capture=yes
- コマンド実行後、以下のようなメッセージが表示されることを確認します。
トレース構成:
ステータス: 実行中
トレース ファイル: C:\Users\Administrator\AppData\Local\Temp\NetTraces\NetTrace.etl
追加: オフ
循環: オン
最大サイズ: 250 MB
レポート: オフ
- キャプチャを採取したい操作を実施します。
- 以下のコマンドを実行し、キャプチャを停止します。
netsh trace stop
- コマンド実行後、以下のようなメッセージが表示されることを確認します。
C:\Users\Administrator>netsh trace stop
トレースを関連付けています… 完了
トレースの結合中… 完了
データ収集を生成しています … 完了
トレース ファイルと追加のトラブルシューティング情報は、
"C:\Users\Administrator\AppData\Local\Temp\NetTraces\NetTrace.cab" としてコンパイルされました。
ファイルの場所 = C:\Users\Administrator\AppData\Local\Temp\NetTraces\NetTrace.etl
トレース セッションは正常に停止しました。
- “%TEMP%\NetTraces” 配下に以下のファイルが作成されることを確認します。
NetTrace.etl
NetTrace.cab
ファイルサイズの指定(maxsize)
netsh trace start capture=yes maxsize=300
既定では、出力されるパケットキャプチャの最大ファイルサイズは 250 MB です。このサイズに達した場合、トレースが上書きされます。ファイルサイズを変更する場合は、maxsize オプションを指定します。
上記は最大サイズを300MBに指定した場合の例となります。
出力先の指定(traceFile)
netsh trace start capture=yes traceFile="C:\test\NetTrace.etl"
既定では、”%TEMP%\NetTraces” 配下に NetTrace.etl ファイルが出力されます。出力先を変更する場合は、traceFileオプションを指定します。
上記は出力先を “C:\test\NetTrace.etl” に変更した場合の例となります。
フィルター設定
比較的使用頻度の高いフィルター設定、および全てのフィルター設定の確認方法について解説します。
IPアドレスを指定(IPv4.Address)
netsh trace start capture=yes IPv4.Address=192.168.10.10
IPアドレスでフィルターを行う場合、IPv4.Address を使用します。
上記は 192.168.10.10 でフィルターする場合の例となります。
複数のIPアドレス(例えば 192.168.10.10 と 192.168.10.20)でフィルターする場合は以下のようなコマンドとなります。
netsh trace start capture=yes IPv4.Address=(192.168.10.10,192.168.10.20)
ネットワークアダプタを指定(CaptureInterface)
netsh trace start capture=yes CaptureInterface="ローカルエリア接続"
netsh trace start capture=yes CaptureInterface={716A7812-4AEE-4545-9D00-C10EFD223551}
ネットワークアダプタでフィルターを行う場合、CaptureInterface を使用します。
上記は ローカルエリア接続、インターフェイス GUID: {716A7812-4AEE-4545-9D00-C10EFD223551} でフィルターする場合の例となります。(どちらの指定方法でも可)
インターフェースGUIDは以下のコマンドで確認することが可能です。
netsh trace show interfaces
capturefilterHelp で全フィルターを確認
netsh trace show capturefilterHelp
設定できるフィルターの内容は capturefilterHelp で確認可能です。
参考までに実行結果を以下に記載します。
キャプチャ フィルター:
キャプチャ フィルターは、capture=yes でキャプチャが明示的に
有効になっているときにだけサポートされます。サポートされる
キャプチャ フィルターは次のとおりです:
CaptureInterface=<インターフェイス名または GUID>
指定されたインターフェイス名または GUID のパケット キャプチャが有効に
なります。使用可能なインターフェイスを一覧表示するには、
'netsh trace show interfaces' を使用します。
例 CaptureInterface={716A7812-4AEE-4545-9D00-C10EFD223551}
例 CaptureInterface=!{716A7812-4AEE-4545-9D00-C10EFD223551}
例 CaptureInterface="ローカル エリア接続"
Ethernet.Address=<MAC アドレス>
指定されたフィルターを、ソースと適用先の両方の Mac アドレスと
一致させます。
例 Ethernet.Address=00-0D-56-1F-73-64
Ethernet.SourceAddress=<MAC アドレス>
指定されたフィルターをソースの MAC アドレスと一致させます。
例 Ethernet.SourceAddress=00-0D-56-1F-73-64
Ethernet.DestinationAddress=<MAC アドレス>
指定されたフィルターを、適用先の MAC アドレスと一致させます。
例 Ethernet.DestinationAddress=00-0D-56-1F-73-64
Ethernet.Type=<イーサネットの種類>
指定されたフィルターを、MAC イーサネットの種類と一致させます。
例 Ethernet.Type=IPv4
例 Ethernet.Type=NOT(0x86DD)
例 Ethernet.Type=(IPv4,IPv6)
Wifi.Type=<Management|Data>
指定されたフィルターを、Wifi の種類と一致させます。指定できる値は
Management と Data です。指定されなかった場合、Wifi.Type フィルターは
適用されません。
注意: このキャプチャ フィルターは範囲、リスト、否定をサポートしません。
例 Wifi.Type=Management
Protocol=<プロトコル>
指定されたフィルターを、IP プロトコルと一致させます。
例 Protocol=6
例 Protocol=!(TCP,UDP)
例 Protocol=(4-10)
IPv4.Address=<IPv4 アドレス>
指定されたフィルターを、ソースと適用先の両方の
IPv4 アドレスと一致させます。
例 IPv4.Address=157.59.136.1
例 IPv4.Address=!(157.59.136.1)
例 IPv4.Address=(157.59.136.1,157.59.136.11)
IPv4.SourceAddress=<IPv4 アドレス>
指定されたフィルターを、ソース IPv4 アドレスと一致させます。
例 IPv4.SourceAddress=157.59.136.1
IPv4.DestinationAddress=<IPv4 アドレス>
指定されたフィルターを、適用先の IPv4 アドレスと一致させます。
例 IPv4.DestinationAddress=157.59.136.1
IPv6.Address=<IPv6 アドレス>
指定されたフィルターを、ソースと適用先の両方の
IPv6 アドレスと一致させます。
例 IPv6.Address=fe80::5038:3c4:35de:f4c3\%8
例 IPv6.Address=!(fe80::5038:3c4:35de:f4c3\%8)
IPv6.SourceAddress=<IPv6 アドレス>
指定されたフィルターを、ソース IPv6 アドレスと一致させます。
例 IPv6.SourceAddress=fe80::5038:3c4:35de:f4c3\%8
IPv6.DestinationAddress=<IPv6 アドレス>
指定されたフィルターを、適用先 IPv6 アドレスと一致させます。
例 IPv6.DestinationAddress=fe80::5038:3c4:35de:f4c3\%8
CustomMac=<type(オフセット,値)>
指定されたフィルターを、MAC ヘッダーで始まる
指定されたオフセットの値と一致させます。
注意: このキャプチャ フィルターは範囲、リスト、否定をサポートしません。
例 CustomMac=UINT8(0x1,0x23)
例 CustomMac=ASCIISTRING(3,test)
例 CustomMac=UNICODESTRING(2,test)
CustomIp=<type(オフセット,値)>
指定されたフィルターを、IP ヘッダーで始まる
指定されたオフセットの値と一致させます。
注意: このキャプチャ フィルターは範囲、リスト、否定をサポートしません。
例 CustomIp=UINT16(4,0x3201)
例 CustomIp=UINT32(0x2,18932)
CaptureMultiLayer=<yes|no>
多層パケット キャプチャを有効にします。
注意: このキャプチャ フィルターは範囲、リスト、否定をサポートしません。
PacketTruncateBytes=<値>
各パケットの、指定されたバイト数だけをキャプチャします。
注意: このキャプチャ フィルターは範囲、リスト、否定をサポートしません。
例 PacketTruncateBytes=40
注意:
複数のフィルターを一緒に使用することはできますが、同じフィルターを
多重に使用することはできません。
例 'netsh trace start capture=yes Ethernet.Type=IPv4
IPv4.Address=157.59.136.1'
必要な場合は、フィルターを明示的に示す必要があります。フィルターが
指定されない場合は、"don't-care" として処理されます。
例 'netsh trace start capture=yes IPv4.SourceAddress=157.59.136.1'
IPv4 パケットを 157.59.136.1 からだけキャプチャし、
非 IPv4 イーサネット タイプもキャプチャします。これは、
Ethernet.Type フィルターが明示的に指定されていないためです。
例 'netsh trace start capture=yes IPv4.SourceAddress=157.59.136.1
Ethernet.Type=IPv4'
IPv4 パケットを 157.59.136.1 からだけキャプチャします。
他のイーサネット タイプのパケットは破棄されます。これは、
明示的なフィルターが指定されているためです。
キャプチャ フィルターは範囲、リスト、および否定をサポートします
(サポートしないことが示されている場合を除く)。
例 範囲: 'netsh trace start capture=yes Ethernet.Type=IPv4
Protocol=(4-10)'
プロトコルが 4 以上 10 以下の IPv4 パケットを
キャプチャします。
例 リスト: 'netsh trace start capture=yes Ethernet.Type=(IPv4,IPv6)'
IPv4 と IPv6 のパケットだけをキャプチャします。
例 否定: 'netsh trace start capture=yes Ethernet.Type=!IPv4'
すべての非 IPv4 パケットをキャプチャします。
否定とリストが組み合わされる場合もあります。
例 'netsh trace start capture=yes Ethernet.Type=!(IPv4,IPv6)'
すべての非 IPv4 パケットと非 IPv6 パケットをキャプチャします。
「!」の代わりに「NOT」を使用して否定を示すこともできます。その場合は、
否定する値をかっこで囲む必要があります。
例 'netsh trace start capture=yes Ethernet.Type=NOT(IPv4)'
etlファイルの解析方法
採取した etl ファイルですが、このままではパケットキャプチャの定番である Wireshark で開くことができません。
そこで別のツールを使用して etl ファイルを解析する方法について解説します。
Microsoft Message Analyzer(メッセージアナライザー)
以前は Microsoft Message Analyzer を使用して etl ファイルの解析が可能でしたが、2019年末時点でMicrosoftより公開停止となりダウンロード不可となりました。
そのため本記事では Microsoft Message Analyzer の使用方法については触れません。
詳細は以下を参考にしてください。
要約すると以下のような内容が記載されています。
- 2019年11月25日に廃止され、ダウンロードできなくなる
- ダウンロード済みの Message Analyzer を継続して使用するのはOK
- 代わりとなるマイクロソフト製のソフトはない
- Wireshark等のサードパーティ製の製品を検討してほしい
Microsoft Network Monitor(ネットワークモニター)
Microsoft Network Monitor は Microsoft Message Analyzer より以前に提供されていたマイクロソフト製のソフトですが、こちらは現時点でも公開されているため、こちらの方法について解説します。
- 以下より Network Monitor をダウンロードします。
Microsoft Network Monitor
https://www.microsoft.com/en-us/download/details.aspx?id=4865 - Network Monitor をインストールします
- Network Monitor を起動します。
- [Parser Profiles] – [NetworkMonitor Parsers] を開き、[Windows] を選択します。
- [File] – [Open] – [Capture] より、etl ファイルを選択します。
- etlファイルの中身が確認できます。
Wiresharkで解析可能な形式への変換方法
採取した etl ファイルを Wireshark を使用して解析したい場合、一旦ファイル形式を変更して Wireshark で開く必要があります。
Microsoft Network Monitor による変換
- Network Monitor を起動し [File] – [Open] – [Capture] より etl ファイルを開きます。
- [Save AS] をクリックします。
- 任意の名前でファイルを保存します。
- エクスプローラーより保存したファイルを確認し、ファイルの種類が「Wireshark capture file」となっていることを確認します。
- 保存したファイルを Wireshark から開き、正常に表示されることを確認します。
参考情報
Microsoft ドキュメント
- Microsoft Message Analyzer Blog
https://docs.microsoft.com/en-us/openspecs/blog/ms-winintbloglp/dd98b93c-0a75-4eb0-b92e-e760c502394f - Network Monitor
https://www.microsoft.com/en-us/download/details.aspx?id=4865
Wireshark
Windows 10 でパケットキャプチャの採取に失敗する
Windows 10 環境の場合、初回のパケットキャプチャに失敗することがあります。
その場合、事前に netsh trace start / netsh trace stop を実行し、初回実行を終了させておきます。
その後、本記事の手順通りにネットワークトレースの採取を実施してください。
2020/9/30 追記
本事象に関して、以前はMicrosoftの公開情報がありましたが、現在は削除されているようです。https://support.microsoft.com/ja-jp/help/3210215
ネットワークの瞬断が発生する
netsh trace コマンドでパケットキャプチャを採取する場合、ネットワークの瞬断が発生する場合があります。
この動作は netsh trace の仕様であるため、瞬断が発生する可能性がある、という前提で実行する必要があります。
netsh trace コマンドにて、パケット キャプチャを開始、停止する際は、トレース ログを採取する NDIS Capture LightWeight Filter ドライバー (NDISCap.sys) の動的なロード、アンロードが行われます。その際に、各インターフェースのネットワーク トラフィックを一時的に停止して、フィルター ドライバーの挿入や削除を行います。その結果、一時的に外部との通信が行えない状況が発生します。
https://support.microsoft.com/ja-jp/help/2914927
2020/9/3追記
本事象に関して、以前はMicrosoftの公開情報がありましたが、現在は削除されているようです。https://support.microsoft.com/ja-jp/help/2914927
参考書籍
ネットワーク関連の基礎知識を学ぶためにおすすめの書籍です。
初版が 2002年発売というかなり昔からあるネットワーク関連では定番の書籍です。
初心者でもある程度イメージしやすい内容(例えばブラウザからURLを入力してWebサイトにアクセスする際の流れ等)を例にして書かれており、比較的読みやすいものになっています。
コメント