Wireshark

【Wireshark install/portable不要】pktmonとfilterの使い方 ~Windows標準ツールでpcap形式パケットキャプチャ ~

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 --etw

ログ ファイル名:     c:\PktMon.etl
ログ モード:      循環
最大ファイル サイズ: 512 MB

アクティブな測定を開始しました。

上記によりカレントディレクトリ (上記の例では c:\) の直下にデフォルト名 PktMon.etl が生成されます。

「ETW セッションを開始できませんでした: 既に存在するファイルを作成することはできません。」や「アクセスが拒否されました」等が表示される場合はコマンドプロンプトが管理者権限になっていない可能性があります。確認しましょう。

パケットキャプチャが開始されましたので、観測したい通信を発生させます。(トラブルシュートなら事象を再現など)

観測が終わったら以下のように stop でキャプチャを止めます。

c:\> pktmon stop
アクティブな測定を停止しました。
ログをフラッシュしています...
ログ ファイル: c:\PktMon.etl (イベントは失われていません)

pcapng 形式に変換します。※ただし、サーバ OS や古いクライアント OS では対応していないようですので、必要に応じて新しい Windows 10 (version 20h2) までファイルを持ち込んでお試し下さい。

c:\> pktmon pcapng PktMon.etl
処理しています...

パケットの合計:     302
パケットのドロップ カウント: 0
書式設定されたパケット: 302
書式設定されたファイル:    PktMon.pcapng

以上が最短でキャプチャを行い、pcapng に変換する方法です。ただし、デフォルトだと以下の状態になります。

  • 全てのインタフェース (論理インタフェース含む) での情報が入るため、非常に見づらい
  • 全ての通信が含まれるため非常に見づらい
  • ファイル名がデフォルトの PktMon.etl になる
  • PktMon.etl は 512MB 以上に保存しないため、過去のキャプチャ情報が消える (循環する)

上記の問題を解消するためには以下のオプション指定が必要です。

インタフェースの指定

上述の通り、デフォルトでは全てのインタフェースのパケットが取得されます。サーバ内の通信も見れたりするので便利なときはありますが、非常に見づらくなります。

特定のインタフェースのみを取得したい場合は、まずインタフェースの ID を調べます。

c:\> pktmon comp list

~~~~~~~~

Intel(R) Wi-Fi 6 AX201 160MHz
    ID: 13
    ドライバー: Netwtw08.sys
    MAC アドレス: XX-XX-XX-XX-XX-XX
    ifIndex: 18

    フィルター ドライバー:
        ID ドライバー          名前
        -- -----          --
        42 wfplwfs.sys    WFP Native Filter
        41 vwififlt.sys   Virtual WiFi Filter Driver
        40 nwifi.sys      Native WiFi Filter Driver
        39 npcap.sys      Npcap Packet Driver (NPCAP)
        38 VBoxNetLwf.sys VirtualBox NDIS Light-Weight Filter
        37 pacer.sys      QoS Packet Scheduler
        36 wfplwfs.sys    WFP 802.3 Filter

    プロトコル:
         ID ドライバー       名前      EtherType
         -- -----       --      ---------
        110 tcpip.sys   TCPIP6  IPv6
        104 tcpip.sys   TCPIP   ARP, IPv4
         82 rspndr.sys  RSPNDR  VLAN, LLTD
         81 ndisuio.sys NDISUIO 88c7, VLAN, 802.1X
         80 lltdio.sys  LLTDIO  * (すべて)

    アプリケーション プロトコル:
         ID ドライバー    名前   IP アドレス
         -- -----    --   -------
        122 http.sys HTTP fe80::b574:4795:265:14b1
        115 http.sys HTTP 192.168.0.19

上記のケースでは WiFi の ID が 13 になっていますが、-c 13 ではうまく動作しませんでした。ドライバの ID を指定する必要があるようです。

ipv4 と ipv6 を取得したいときは 104 と 110 を指定します

c:\> pktmon start --etw -c 104 110

ログ ファイル名:     c:\nwwatch.etl
ログ モード:      循環
最大ファイル サイズ: 512 MB

アクティブな測定を開始しました。

フィルターの追加

プロトコル (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 | comp | reset | start | stop } [OPTIONS | help]
    内部パケット伝達レポートとパケット ドロップ レポートを監視します。

コマンド
    filter     パケット フィルターを管理します。
    comp     登録されたコンポーネントを管理します。

    reset     カウンターをゼロにリセットします。
    start     パケットの監視を開始します。
    stop     監視を停止します。
    format     ログ ファイルをテキストに変換します。
    pcapng     ログ ファイルを pcapng 形式に変換します。
    unload     PktMon ドライバーをアンロードします。

help
    コマンドのヘルプ テキストを表示します。

次に、例えば pktmon の filter のヘルプを見たいときは、pktmon filter help と打ちます。

c:\> pktmon filter help
pktmon filter { list | add | remove } [OPTIONS | help]

コマンド
    list      アクティブなパケット フィルターを表示します。
    add       報告対象のパケットを制御するフィルターを追加します。
    remove    すべてのフィルターを削除します。

help
    コマンドのヘルプ テキストを表示します。

このように、下の階層のヘルプも見ていくことができます。

ちなみに、ヘルプに限らず表示において more を使うとなぜか文字化けしてしまうのですが、chcp 65001 と打った後であれば文字化けしません。

c:\> chcp 65001
Active code page: 65001

c:\> pktmon comp list | more
Microsoft Wi-Fi Direct Virtual Adapter
    ID: 10
    ドライバー: vwifimp.sys
    MAC アドレス: DC-1B-A1-0A-D9-A4
    ifIndex: 3

        ID ドライバー          名前
        -- -----          --
        35 wfplwfs.sys    WFP Native Filter
        34 nwifi.sys      Native WiFi Filter Driver
        24 npcap.sys      Npcap Packet Driver (NPCAP)
        23 VBoxNetLwf.sys VirtualBox NDIS Light-Weight Filter
        22 pacer.sys      QoS Packet Scheduler
        21 wfplwfs.sys    WFP 802.3 Filter

    プロトコル:
         ID ドライバー       名前      EtherType
         -- -----       --      ---------
        109 tcpip.sys   TCPIP6  IPv6

コメント

タイトルとURLをコピーしました