パケットキャプチャーはWiresharkを良く使っていますが、Windowsでサクッとできないかな?という趣旨の会話があったので、何気に調べてみましたよ。
実は少し前からWindows10にはパケット モニター が使えるようになっており、その名もPktmonインボックスのクロスコンポーネント ネットワーク診断ツールです。パケット キャプチャ、パケット ドロップ検出、パケット フィルタリング、カウントが使えたりします。ネットワーク スタック内の可視性を提供するコンテナー ネットワークや 仮想化状況の確認で便利との事。どうしても外部ツールが使えない環境で役立つのか早速触ってみます。
さくっとpktmon を使う
pktmon を使うためには管理者権限が必要です。コマンドプロンプトを管理者権限で起動します。Windowsキー+Rで「ファイル名を指定して実行」を表示させ、”cmd”と打ち込み出てきたら管理者で実行か、Ctrl+Shift+Enter で起動します。
そのまま、pktmon start –capture を押せばキャプチャーが始まり今いるカレントディレクトリにPktMon.etlというファイルが作られます。
終了したい場合は、 pktmon stopを押します。
取得した.etlはこのままでは読めませんので、pktmon formatで可読性のあるテキストファイルに変換することで、エディタなどを使って内容の確認が可能になります。
1 2 3 4 5 6 7 |
テキスト形式への変換 pktmon etl2txt [ETLファイル] pktmon etl2txt [ETLファイル] --component-id [コンポーネントID] Wireshark形式(pcapeng)への変換 pktmon etl2pcap [ETLファイル] pktmon etl2pcap [ETLファイル] --component-id [コンポーネントID] |
参考:https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/pktmon-etl2txt
しかし見づらい
実際には見づらいので、
- Microsoft Network MonitorやWireshakを使う。
- pktmonコマンドに引数を付けてごにょごにょする。
上記になろうかと思います。
pktmon start [–capture [–counters-only] [–comp <selector>] [–type <type>] [–pkt-size <bytes>] [–flags <mask>]] [–trace –provider <name> [–keywords <k>] [–level <n>] …] [–file-name <name>] [–file-size <size>] [–log-mode <mode>] パケットのキャプチャとイベントの収集を開始します。
パケットのキャプチャ
-c, –capture
パケットのキャプチャとパケット カウンターを有効にします。-o, –counters-only
パケット カウンターのみを収集します。パケットのログは記録されません。–comp { all | nics | id1 id2 … }
パケットをキャプチャするコンポーネントを選びます。すべてのコンポーネント (ALL)、
NIC のみ、またはコンポーネント ID のリストを指定できます。既定値は ALL です。–type { all | flow | drop }
キャプチャするパケットを選びます。既定値は ALL です。–pkt-size<bytes>
各パケットからログに記録するバイト数。常にパケット全体をログに記録するには、
これを 0 に設定します。既定値は 128 バイトです。–flags<mask>
パケットのキャプチャ中にログに記録される情報を制御する 16 進数のビットマスク。
既定値は 0x012 です。0x001 – 内部パケット モニター エラー。
0x002 – コンポーネント、カウンター、フィルターに関する情報。
0x004 – NET_BUFFER_LIST グループのソースと宛先の情報。
0x008 – NDIS_NET_BUFFER_LIST_INFO からパケット メタデータを選択します。
0x010 – Raw パケット、[–pkt-size] のサイズに切り捨てます。イベント プロバイダー
-t, –trace
イベントの収集を有効にします。-p, –provider<name>
イベント プロバイダーの名前または GUID。複数のプロバイダーの場合は、この
パラメーターを複数回使用します。-k, –keywords<k>
対応するプロバイダー用にログに記録されるイベントを
制御する 16 進数のビットマスク。既定値は 0xFFFFFFFF です。-l, –level<n>
対応するプロバイダーのログ記録レベルです。
既定値は 4 (情報レベル) です。ログ記録のパラメーター
-f, –file-name<name>
ログ ファイルの名前。既定値は PktMon.etl です。-s, –file-size<size>
ログ ファイルの最大サイズ (MB 単位)。既定値は 512 MB です。-m, –log-mode { circular | multi-file | memory | real-time }
ログ記録のモード。既定値は circular です。circular ログがいっぱいになっている場合は、新しいイベントによって最も古いものが上書きされます。
multi-file キャプチャ対象のイベント数に制限はありませんが、ログがいっぱいになるたびに
新しいログ ファイルが作成されます。memory circular と似ていますが、ログ全体がメモリに格納されます。
pktmon が停止するとファイルに書き込まれます。real-time イベントとパケットがリアルタイムで画面に表示されます。ログ
ファイルは作成されません。Ctrl キーを押しながら C キーを押して、監視を停止します。例 1: パケットのキャプチャ
pktmon start –capture例 2: パケット カウンターのみ
pktmon start –capture –counters-only例 3: イベントのログ記録
pktmon start –trace -p Microsoft-Windows-TCPIP -p Microsoft-Windows-NDIS例 4: パケットのキャプチャとイベントのログ記録
pktmon start –capture –trace -p Microsoft-Windows-TCPIP -k 0xFF -l 4
参考:https://docs.microsoft.com/ja-jp/windows-server/networking/technologies/pktmon/pktmon
まとめ
確かにパケットを取れるといえば取れるのですが……どうしても外部ツールが使えない状況でないとなかなか難しいですね。グラフ付きで見やすいWiresharkや他のアナライザーと比べると無骨感が出ています。しかし専門ページでいずれtcpdumpの近いかたちになるのかと思われます。