Windows Server 2016標準コマンドでできる簡単パケットキャプチャ
今までは、WireShark等のパケットキャプチャーソフトウェアを 導入しないとキャプチャー出来ないと思っていましたが Windows Server 2008 R2(Windows 7) 以降(私が知らなかっただけかw)であれば、 OS標準機能の[netsh]コマンドでパケットキャプチャーを取ることができます。 ※ただし、要管理権限 (Linuxのtcpdump,AIXのiptrace,SolarisのSNOOP,HP-UXのnettlに相当) 他OSのパケットキャプチャー方法は、パケットキャプチャ あんちょこを参照。
簡単にソフトウェアとか追加できないような環境が多いので OS標準であると大変助かります。(多少手間はあっても)
ただし、[netsh trace]コマンドにてパケットキャプチャを開始、停止する際に NIC のリンクダウンが発生する場合があるので、それを理解した上で使用して下さい。 ちなみに、この動作は仕様です。詳細は以下を参照。 netsh trace コマンドにてパケット キャプチャを開始、停止する際に NIC のリンクダウンが発生する場合がある
サーバで[netsh trace]コマンドにてパケットキャプチャを開始しても 殆ど負荷はかかりませんでした。 (パフォーマンスモニタでは、CPU、メモリ共に変化を目視出来ませんでした) ただし、停止時にデータ収集にCPUを若干変化がありましたが瞬間的なので業務影響が出るほどではないと考えてます。 アンチウィルスソフトウェアを導入しているサーバなので、データ保管の際に負荷がかかったものと思われる。
パケットキャプチャーの採取方法
詳細なオプションは、後述するとして、まずはパケットキャプチャーの採取方法は以下コマンドで採取します。
C:\Users\Administrator>netsh trace start capture=yes
トレース構成:
-------------------------------------------------------------------
ステータス: 実行中
トレース ファイル: C:\Users\Administrator\AppData\Local\Temp\NetTraces\NetTrace.etl
追加: オフ
循環: オン
最大サイズ: 250 MB
レポート: オフ
C:\Users\Administrator>netsh trace stop
トレースを関連付けています... 完了
トレースの結合中... 完了
データ収集を生成しています ... 完了
トレース ファイルと追加のトラブルシューティング情報は、"C:\Users\Administrator\AppData\Local\Temp\NetTraces\NetTrace.cab" としてコンパイルされました。
ファイルの場所 = C:\Users\Administrator\AppData\Local\Temp\NetTraces\NetTrace.etl
トレース セッションは正常に停止しました。
C:\Users\Administrator>
netsh traceコマンド基本
・キャプチャ開始 netsh trace start capture=yes traceFile=<ファイル名>ファイル名>
・キャプチャ停止 netsh trace stop
・キャプチャの取得状態の確認 netsh trace show status
netsh traceコマンド オプション
【代表的なキャプチャフィルター】
CaptureInterface=<インターフェース名または GUID>
例えば、CaptureInterface="ローカル エリア接続"
Ethernet.Type=<イーサネットの種類>
例えば、Ethernet.Type=IPv4
Protocol=<プロトコル>
例えば、Protocol=TCP
IPv4.Address=<IPv4アドレス>
例えば、IPv4.Address=192.0.2.1
IPv4.SourceAddress=<送信元IPv4アドレス>
例えば、IPv4.SourceAddress=192.0.2.1
IPv4.DestinationAddress=<送信先IPv4アドレス>
例えば、IPv4.DestinationAddress=192.0.2.1
persistent=yes
traceFile=%LOCALAPPDATA%\Temp\NetTraces\NetTrace.etl
maxSize=500
合わせるとキャプチャを開始しインターフェース、イーサネットタイプ、 プロトコル、ファイルサイズ、ファイル名を指定すると以下のようになります。
netsh trace start capture=yes CaptureInterface="Team1" Ethernet.Type=IPv4 Protocol=UDP maxSize=500 traceFile=C:\Tmp\NetTrace.etl
ちなみにコマンドオプションの既定値は以下となります。 capture=no capturetype=physical report=no persistent=no maxSize=250 fileMode=circular overwrite=yes correlation=yes perfMerge=yes traceFile=%LOCALAPPDATA%\Temp\NetTraces\NetTrace.etl providerFilter=no
採取したパケットキャプチャーを見るには
採取したパケットキャプチャーを見るためには、 [Microsoft Message Analyzer]をダウンロードし端末に導入し、 Microsoft Message Analyzer
「file」-「open」-「from file explorer」を選択し、生成された*.etlを開く
なお、wiresharkで見れるように変換するには、 [Microsoft Message Analyzer]の 「file」-「save as」を選択し 「export」を選択するとcapファイルが選べるので「保存」 これでwiresharkで見れるようになります。
参考
Message Analyzerは、通信しているプロセス名がデフォルトだと分からないため、通信しているプロセス名を知りたいのであれば以下を参照。 Message Analyzer でのネットワークキャプチャーに、通信しているプロセス名情報を追加する方法
また、USB機器との通信も見ることが可能。 Microsoft Message AnalyzerでUSB解析
Message Analyzerでどのサーバにどんなプロトコルを投げているか、 他にはHTTPステータスを何を返しているか視覚的に把握できる [Gantt Viewer]というプラグインがありますので興味がある人は 以下を参考にしてみるといいでしょう。 Message Analyzer の Gantt Viewer
後述
Windows Serverでも、簡単にパケットキャプチャ出来るようになったのは 非常にありがたいですね。 Message Analyzerの見方は、WireSharkとはかなり違うので慣れるまで 時間がかかるでしょうが、そこは面倒でも変換したりせず慣れるしかないでしょうね。
あと、サーバ技術者で結構いるのが、パケットキャプチャする方法は知っている のにも関わらずTTLの意味を理解していない人が多すぎる・・・。 折角、パケットキャプチャしても、どこでパケットロスしているかなんて pingのTTLの値の差異で大体分かるし・・・。
なお、TTLについては、先人が詳しく分かり易く書いているので 参考にするといいでしょう。 リセットパケットを投げたのは誰だ?