netshでパケットキャプチャ

# 1回目

開始

```
c:\tmp>netsh trace start capture=yes traceFile=C:\tmp\NetTrace.etl

トレース構成:
-------------------------------------------------------------------
ステータス:           実行中
トレース ファイル:    C:\tmp\NetTrace.etl
追加:                 オフ
循環:                 オン
最大サイズ:           512 MB
レポート:             オフ
```

実行するとすぐプロンプトが戻ってくる
終了してみる

＞ 終了されない
＞ 「データ収集を生成しています ... 完了」の出力のままフリーズ
＞ CPU使用率が80%前後で高止まり
＞ ウィルス対策ソフト終了してみたが変化なし
＞ Ctrl+C効かない (Windowsだけど念のためCtrl+Z打ってみたけどそれも効かない)
＞ CPU使用率が高いWmiPrvSE.exeプロセスをタスクマネージャで終了
＞ プロンプト戻らないあああああ
＞ CPU使用率もまだ高い
＞ なんのプロセスがまだ高いのか? を見ようとしたところでCPU使用率が突然落ち着き、プロンプトが戻る
＞ そのときの出力が以下

```
c:\tmp>netsh trace stop
トレースの結合中... 完了
データ収集を生成しています ... 完了
トレース ファイルと追加のトラブルシューティング情報は、"C:\tmp\NetTrace.cab" としてコンパイルされました。
ファイルの場所 = C:\tmp\NetTrace.etl
トレース セッションは正常に停止しました。
```

停止中は存在しなかったcabファイルが生成された
C:\tmp\NetTrace.etl 2.5MB
C:\tmp\NetTrace.cab 730KB

~~Wiresharkで見れるかのテスト~~
~~cab > フォーマットが違うエラー ()~~
~~etl > 以下ダイアログが表示された~~

```
The capture file appears to be damaged or corrupt.
(packetlogger: File has 4294967287-byte packet, bigger than maximum of 262144)
```

~~キャプチャ内容は全然出力されないのでだめ~~
etlをWireSharkで解析するにはpcapngへの変換が必要
別記事で書いた

cabは中身にOS情報やイベントログやDNSなどいろんな情報がテキスト形式で含まれてる
report.etlがサイズや拡張子的にキャプチャログっぽい
WireSharkで開いてみると、上記と同じエラーメッセージが表示される
今回うまく出力できなかったetlのただのコピーだ

# 2回目
もう一度やってみる
最大サイズを小さくしてトライ
1回目のファイルと同じファイル名を指定したら怒られた

```
c:\tmp>netsh trace start capture=yes traceFile=C:\tmp\NetTrace.etl maxsize=1MB
ファイル "C:\tmp\NetTrace.etl" は既に存在しています。
コマンドのパラメーターが正しくないか不足しています。
詳細については、トレース start ヘルプを参照してください。
```

ファイルを消して同じファイル名でリトライ

```
c:\tmp>netsh trace start capture=yes traceFile=C:\tmp\NetTrace.etl maxsize=1MB

トレース構成:
-------------------------------------------------------------------
ステータス:           実行中
トレース ファイル:    C:\tmp\NetTrace.etl
追加:                 オフ
循環:                 オン
最大サイズ:           1 MB
レポート:             オフ
```

数分待ってもetlファイルのサイズは増えないしcabも生成されない
終了コマンドは必要な様子

間違って終了しないまま再実行したらエラーで弾いてくれた

```
c:\tmp>netsh trace start capture=yes traceFile=C:\tmp\NetTrace.etl maxsize=1MB
トレース セッションは既に進行しています。
```

終了する

```
c:\tmp>netsh trace stop
トレースの結合中... 完了
データ収集を生成しています ...
```

またここでフリーズ
etlのサイズは1MBになってる
cabは生成されてない
cabの生成に時間がかかるんだなこれ

1分くらいたったところでCPU使用率100%
またWmiPrvSE.exeがCPU食ってる

しばらく待ってみるか..

ってか終了時にこの負荷、本番で使えなくね??
Windows10で試してるけど、Windows Serverだとマシだったりするかな..

Windows、コマンドの開始時刻とか実行時間を簡単に出す仕組み欲しいな..
終了コマンド打ったのを18:25とする

データ収集を無効にすればいいのか

5分くらい待ったらプロンプト戻ってきた。CPU使用率が高騰してたのは3分くらい

```
c:\tmp>netsh trace stop
トレースの結合中... 完了
データ収集を生成しています ... 完了
トレース ファイルと追加のトラブルシューティング情報は、"C:\tmp\NetTrace.cab" としてコンパイルされました。
ファイルの場所 = C:\tmp\NetTrace.etl
トレース セッションは正常に停止しました。
```

NetTrace.cab 920KB
NetTrace.etl 1MB

~~etlをWireSharkにかけてみる~~

~~1回目と同じエラーダイアログが..~~

```
The capture file appears to be damaged or corrupt.
(packetlogger: File has 4294967287-byte packet, bigger than maximum of 262144)
```

~~パケット情報も全然表示されない~~
~~だめじゃんこれ!~~

etlをWireSharkで解析するにはpcapngへの変換が必要
つづきの記事に書いた

# 3回目

レポートオプションがあるので無効にしてやる
キャプチャ終了後のレポート生成の負荷が高いと思われるため

ヘルプ全文

```
c:\tmp>netsh trace start /?

start
  トレースを開始します。

  使用法: trace start [sessionname=<セッション名>]
        [[scenario=]<シナリオ 1,シナリオ 2>]
        [[globalKeywords=]keywords] [[globalLevel=]level]
        [[capture=]yes|no] [[capturetype=]physical|vmswitch|both]
        [[report=]yes|no|disabled] [[persistent=]yes|no]
        [[traceFile=]path\filename] [[maxSize=]filemaxsize]
        [[fileMode=]single|circular|append] [[overwrite=]yes|no]
        [[correlation=]yes|no|disabled] [capturefilters]
        [[provider=]providerIdOrName] [[keywords=]keywordMaskOrSet]
        [[level=]level] [bufferSize=<バッファー サイズ>]
        [[[provider=]provider2IdOrName] [[providerFilter=]yes|no]]
        [[keywords=]keyword2MaskOrSet] [[perfMerge=]yes|no]
        [[level=]level2] ...

既定値:
        capture=no (トレース イベントに加え、パケット キャプチャを
                有効にするかどうかを指定します)
        capturetype=physical (パケット キャプチャを有効にする必要がある
                対象として、物理ネットワーク アダプターのみ、仮想スイッチのみ、
                または物理ネットワーク アダプターと仮想スイッチの両方を指定します)
        report=no (トレース ファイルと共に、補足レポートを
                生成するかどうかを指定します)
        persistent=no (再起動後に、netsh trace stop を発行するまで
                トレース セッションを続行するかどうかを指定します)
        maxSize=250 MB (最大トレース ファイル サイズを指定します。0 = 最大値なし)
        bufferSize=512 (トレース バッファー サイズを KB 単位で指定します。最小値 4、最大値 16384)
        fileMode=circular
        overwrite=yes (既存のトレース出力ファイルを上書きするかどうかを
                指定します)
        correlation=disabled (関連するイベントを相互に関連付け、グループ化
                するかどうかを指定します)
        perfMerge=yes (パフォーマンス メタデータをトレースに結合するか
                どうかを指定します)
        traceFile=%LOCALAPPDATA%\Temp\NetTraces\[sessionname]NetTrace.etl
                (出力ファイルの場所を指定します)
        providerFilter=no (プロバイダー フィルターを有効にするかどうかを指定します)
        sessionname='' (同時トレースを収集できるように、トレース セッションの名前を
                指定します)

プロバイダー キーワードの既定値は all で、レベルは 255 になります (キーワードとレベルが指定されていない場合)。

例:

netsh trace start scenario=InternetClient capture=yes

        パケット キャプチャを物理ネットワーク アダプターに対してのみ有効にして
                InternetClient シナリオと依存プロバイダーのトレースを開始します。
        "netsh trace stop" コマンドが発行されるか、システムが再起動すると、
                トレースは停止します。
        出力ファイルには、既定の場所と名前が使用されます。古いファイルが
                存在する場合、それらは上書きされます。

netsh trace start provider=microsoft-windows-wlan-autoconfig
        keywords=state,ut:authentication

        microsoft-windows-wlan-autoconfig プロバイダーのトレースを開始します。
        "netsh trace stop" コマンドが発行されるか、システムが再起動すると、
                トレースは停止します。
        出力ファイルには、既定の場所と名前が使用されます。古いファイルが
                存在する場合、それらは上書きされます。
        キーワード 'state' または 'ut:authentication' が含まれるイベントのみのログが記録されます。

        netsh trace show provider コマンドを使用すると、サポートされたキー
                ワードとレベルを表示できます。

キャプチャ フィルター:
        キャプチャ フィルターは、capture=yes を指定してキャプチャが明示的に
        有効になっているときにだけサポートされます。サポートされるキャプチャ
        フィルターとその使用法の一覧を表示するには、'netsh trace show CaptureFilterHelp' を使用します。

プロバイダー フィルター:
        プロバイダー フィルターは、複数のプロバイダーでサポートされます。有効に
        するには、各プロバイダーの後に providerFilter=Yes を指定します。
        各プロバイダーでサポートされるプロバイダー フィルターとその使用法の
        一覧を表示するには、'netsh trace show ProviderFilterHelp' を使用します。
```

report=noをつけて再実行
ちがう、report=noはデフォルトだった
開始時の出力にもレポートなしってでてる
こっちか? デフォルトyesになってるし

```
        perfMerge=yes (パフォーマンス メタデータをトレースに結合するか
                どうかを指定します)
```

1回実行しちゃうと5分くらい待つしかないのがつらい
強制終了コマンドないものか..

タスクマネージャでWmiPrvSE.exe切ってもまたすぐ復活するな..
待つしかない

5分くらいたって終わったので、perfMerge=noをつけて実行

```
c:\tmp>netsh trace start capture=yes traceFile=C:\tmp\NetTrace.etl maxsize=1MB report=no perfMerge=no

トレース構成:
-------------------------------------------------------------------
ステータス:           実行中
トレース ファイル:    C:\tmp\NetTrace.etl
追加:                 オフ
循環:                 オン
最大サイズ:           1 MB
レポート:             オフ
```

実行して20秒くらいですぐ終了を実行

```
c:\tmp>netsh trace stop
データ収集を生成しています ...
```

ここの出力は出なくなった
＞トレースを関連付けています... 完了
＞トレースの結合中... 完了

が、
うーん、プロンプト戻らないしCPU張り付くし変わらん
ありえないだろnetsh
これなんとかならんかな

ネット上だと負荷は全然かからんって書いてある記事2個くらいみたけど
たしかに、実行中は負荷かかってないけど
終了時のcab生成? が高負荷すぎるやろ..

5分くらいたって終わって、NetTrace.cabは結局生成されてる
perfMerge=noの違いがわからん
cabの中身が違うんだろうが..
cab自体を作らないということはできなかった
cabの中身みると、色々あるけど、イベントログ複数と、システム情報複数出してる当たりが重いんだろうなあ..
ファイアウォールルールとかレジストリ情報とか色々あるけどそっちはすぐ出力できるやつかなと

一旦中断

4回目以降は以下を予定
キャプチャするNICを限定する (physical指定など)
＞デフォルトでphysical指定だった
＞NICは有線無線がついてるが無線しかつかってないので
＞それだけでこの負荷なのか

Windows Server機で動作検証する (キャプチャ終了時に高負荷かかるの一緒かどうか)