Wireshark

Windows標準【pktmon】でパケットキャプチャ, filterの使い方

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 が生成されます。

「Error: Cannot obtain current state. アクセスが拒否されました。」等と表示される場合はコマンドプロンプトが管理者権限になっていない可能性があります。確認しましょう。

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

観測が終わったら以下のように 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  --

コメント

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