wiresharkを使わずWindows標準ツール pktmon でキャプチャし、pcap形式にする
Windows10 や Windows Server 2019 には pktmon というネットワークスニファ (パケットキャプチャ) ツールが標準インストールされています。
『Windows Server の切り分けのためにパケットキャプチャを取りたいけど Wireshark をインストールするのはちょっと怖い...』『本番端末だから Wireshark をインストールしたくない』『ポータブルさえだるい』なーんてこと、よくありますよね?!
そんなときは pktmon を使いましょう。
pktmon は .etl という独自形式で出力されますが、wireshark の .pcapng への変換も可能になっています。
pktmon の最短の使い方
pktmon を使うためには管理者権限が必要です。コマンドプロンプトを管理者権限で起動します。
Windowsキー+Rで「ファイル名を指定して実行」を表示させ、"cmd"と打ち込み、Ctrl+Shift+Enter ボタンを押下します。
UAC の画面が表示されるので、「はい」をクリックします。
以下を実行すればまずはすぐパケットキャプチャができます。
c:\> pktmon start --capture
ログ ファイル名: c:\PktMon.etl
ログ モード: 循環
最大ファイル サイズ: 512 MB
アクティブな測定を開始しました。
上記によりカレントディレクトリ (上記の例では c:\) の直下にデフォルト名 PktMon.etl が生成されます。
パケットキャプチャが開始されましたので、観測したい通信を発生させます。(トラブルシュートなら事象を再現など)
観測が終わったら以下のように stop でキャプチャを止めます。
c:\> pktmon stop
アクティブな測定を停止しました。
ログをフラッシュしています...
ログ ファイル: c:\PktMon.etl (イベントは失われていません)
pcapng 形式に変換します。※ただし、サーバ OS や古いクライアント OS では対応していないようですので、必要に応じて新しい Windows 10 (version 20h2) までファイルを持ち込んでお試し下さい。
c:\> pktmon etl2pcap PktMon.etl
処理しています...
パケットの合計: 302
パケットのドロップ カウント: 0
書式設定されたパケット: 302
書式設定されたファイル: PktMon.pcapng
以上が最短でキャプチャを行い、pcapng に変換する方法です。ただし、デフォルトだと以下の状態になります。
- 全てのインタフェース (論理インタフェース含む) での情報が入るため、非常に見づらい
- 全ての通信が含まれるため非常に見づらい
- ファイル名がデフォルトの PktMon.etl になる
- PktMon.etl は 512MB 以上に保存しないため、過去のキャプチャ情報が消える (循環する)
上記の問題を解消するためには以下のオプション指定が必要です。
インタフェースの指定
上述の通り、デフォルトでは全てのインタフェースのパケットが取得されます。サーバ内の通信も見れたりするので便利なときはありますが、非常に見づらくなります。
特定のインタフェースのみを取得したい場合は、まずインタフェースの ID を調べます。
c:\> pktmon list
ネットワーク アダプター:
ID MAC アドレス 名前
-- -------- --
11 80-FA-5B-86-C1-25 Realtek PCIe GbE Family Controller
13 0A-00-27-00-00-0F VirtualBox Host-Only Ethernet Adapter
10 DC-1B-A1-0A-D9-A7 Bluetooth Device (Personal Area Network)
12 DC-1B-A1-0A-D9-A3 Intel(R) Wi-Fi 6 AX201 160MHz
上記のケースでは有線 LAN の ID が 11 になっていますので、--comp 11 を指定します。
c:\> pktmon start --capture --comp 11 --pkt-size 0
ロガー パラメーター:
ロガー名: PktMon
ログ モード: 循環
ログ ファイル: C:\PktMon.etl
最大ファイル サイズ: 512 MB
使用されているメモリ: 384 MB
収集されたデータ:
パケット カウンター、パケット キャプチャ
キャプチャの種類:
すべてのパケット
監視対象コンポーネント:
ID ドライバー 名前
-- ----- --
11 rt640x64.sys Realtek PCIe GbE Family Controller
パケット フィルター:
なし
無線 (Wi-Fi) の場合のインタフェース指定
無線の場合は少しややこしいです。単純に --comp 12 ではうまくキャプチャできませんでした。ID 指定が間違っているのです。確認するためには pktmon list -i -a と打ちます。
c:\> pktmon list -i -a ~~~省略~~~ NIC: Intel(R) Wi-Fi 6 AX201 160MHz ID: 12 ドライバー: Netwtw08.sys MAC アドレス: DC-1B-A1-0A-D9-A3 ifIndex: 19 フィルター ドライバー: ID ドライバー 名前 -- ----- -- 35 wfplwfs.sys WFP Native Filter 34 vwififlt.sys Virtual WiFi Filter Driver 33 nwifi.sys Native WiFi Filter Driver 32 npcap.sys Npcap Packet Driver (NPCAP) 31 VBoxNetLwf.sys VirtualBox NDIS Light-Weight Filter 30 pacer.sys QoS Packet Scheduler 29 wfplwfs.sys WFP 802.3 Filter プロトコル: ID ドライバー 名前 EtherType -- ----- -- --------- 74 tcpip.sys TCPIP IPv4, ARP 74 tcpip.sys TCPIP IPv4, ARP 73 rspndr.sys RSPNDR VLAN, LLTD 72 lltdio.sys LLTDIO * (すべて) 68 ndisuio.sys NDISUIO VLAN, 802.1X, 802.11i ~~~省略~~~
ID=74 が TCPIP IPv4 のドライバだと分かります。なので --comp 74 とします。
>c:\> pktmon start --capture --comp 74 --pkt-size 0
フィルターの追加
プロトコル (ICMP, TCP, UDP 等) や IP アドレス、TCP ポート (Src か Dst のどちらかにマッチすれば OK) 等でフィルタリング可能です。
例えばクライアントセグメント [IP=192.168.0.0/24] の https (tcp/udp 443) の通信をキャプチャしたい場合は以下のようにします。
c:\> pktmon filter add MyFilter1 -i 192.168.0.0/24 -t TCP -p 443 フィルターが追加されました。 c:\> pktmon filter add MyFilter2 -i 192.168.0.0/24 -t UDP -p 443 フィルターが追加されました。
確認は以下のように可能です。
c:\> pktmon filter list
# 名前 プロトコル IP アドレス ポート
- -- ----- ------- ---
1 MyFilter1 TCP 192.168.0.0/24 443
2 MyFilter2 UDP 192.168.0.0/24 443
この状態でパケットキャプチャを開始すれば、フィルタが効き、192.168.0.0/24、tcp,udp 443 が含まれる通信のみがキャプチャされます。
ファイル名を付け、循環させず過去のキャプチャを保存したまま残す
-f でファイル名を指定し、-l で multi-file を指定することで、過去のログが ~1.etl ~2.etl と順番に番号付けられます。
c:\> pktmon start --etw -c 104 110 -f c:\nwwatch.etl -l multi-file
ログ ファイル名: c:\nwwatch%d.etl
ログ モード: マルチ
最大ファイル サイズ: 512 MB
アクティブな測定を開始しました。
ファイルサイズを変更する
ファイルサイズはデフォルトで 512 MB 毎に生成されますが、このサイズを変えたいときは -s (MB 単位) を使います。
例えば -s 100 とすれば 100 MB 単位で生成されます。
pktmon の ヘルプの見方
pktmon だけ打つと以下のように表示されます。
c:\> pktmon pktmon[オプション | ヘルプ] 高度なパケット キャプチャとイベント収集。 コマンド filter パケット フィルターを管理します。 list パケット処理コンポーネントを一覧表示します。 start パケット キャプチャとイベント収集を開始します。 stop データ収集を停止します。 status 現在の状態を照会します。 unload PktMon ドライバーをアンロードします。 counters 現在のパケット カウンターを表示します。 reset パケット カウンターをゼロにリセットします。 etl2txt ログ ファイルをテキスト形式に変換します。 etl2pcap ログ ファイルを pcapng 形式に変換します。 hex2pkt 16 進数形式のパケットをデコードします。 help 特定のコマンドのヘルプ テキストを表示します。 例: pktmon start help
次に、例えば pktmon の filter のヘルプを見たいときは、pktmon filter help と打ちます。
c:\> pktmon filter help pktmon filter[オプション | ヘルプ] コマンド add 報告対象のパケットを制御するフィルターを追加します。 list アクティブなパケット フィルターを表示します。 remove すべてのフィルターを削除します。 help 特定のコマンドのヘルプ テキストを表示します。 例: pktmon filter add help
このように、下の階層のヘルプも見ていくことができます。
ちなみに、ヘルプに限らず表示において more を使うとなぜか文字化けしてしまうのですが、chcp 65001 と打った後であれば文字化けしません。
c:\> chcp 65001 Active code page: 65001 c:\> pktmon start help | more pktmon start [--capture [--counters-only] [--comp] [--type ] [--pkt-size ] [--flags ]] [--trace --provider [--keywords ] [--level ] ...] [--file-name ] [--file-size ] [--log-mode ] -c, --capture -o, --counters-only --comp { all | nics | id1 id2 ... } --type { all | flow | drop } --pkt-size これを 0 に設定します。既定値は 128 バイトです。 --flags 既定値は 0x012 です。 0x001 - 内部パケット モニター エラー。 0x004 - NET_BUFFER_LIST グループのソースと宛先の情報。 0x008 - NDIS_NET_BUFFER_LIST_INFO からパケット メタデータを選択します。 0x010 - Raw パケット、[--pkt-size] のサイズに切り捨てます。 -t, --trace -p, --provider -k, --keywords -- More --
コメント