Pktmon コマンドの書式設定
パケット モニター (Pktmon) は、Windows 用インボックスのクロスコンポーネント ネットワーク診断ツールです。 パケット キャプチャ、パケット ドロップの検出、パケット フィルタリング、カウントに使用できます。 このツールは、ネットワーク スタック内の可視性を提供するため、コンテナー ネットワークや SDN などの仮想化シナリオで特に役立ちます。 パケット モニターは、Windows 10 および Windows Server 2019 (バージョン 1809 以降) で pktmon.exe コマンドを実行することで、インボックスで使用できます。 このトピックでは、pktmon の構文、コマンドの書式設定、および出力について理解できるように説明します。 すべてのコマンドの一覧については、pktmon の構文に関するページを参照してください。
クイック スタート
一般的なシナリオを開始するには、次の手順に従います。
特定の IP アドレス、ポート、パケットに関連付けられているプロトコルなど、キャプチャに必要なパケットの種類を特定します。
キャプチャ フィルターを適用するための構文を確認し、前の手順で特定したパケットのフィルターを適用します。
C:\Test> pktmon filter add help C:\Test> pktmon filter add <filters>
キャプチャを開始し、パケットのログ記録を有効にします。
C:\Test> pktmon start -c
診断中の問題を再現します。 予想されるトラフィックがあることを確認し、トラフィックがコンピューター内にどのように流れているかを大まかに把握するためにカウンターに対してクエリを実行します。
C:\Test> pktmon counters
キャプチャを停止し、分析のために txt 形式でログを取得します。
C:\Test> pktmon stop C:\Test> pktmon etl2txt <etl file>
txt 出力を分析する方法については、「パケット モニターの出力の分析」を参照してください。
キャプチャ フィルター
パケット キャプチャを開始する前にフィルターを適用することを強くお勧めします。これは、1 つのパケット ストリームに専念すると、特定の宛先への接続のトラブルシューティングが容易になるためです。 すべてのネットワーク トラフィックをキャプチャすると、出力のノイズが多すぎて分析できない可能性があります。 パケットが報告されるには、少なくとも 1 つのフィルターで指定されているすべての条件に一致している必要があります。 最大 32 のフィルターが同時にサポートされます。
たとえば、次の一連のフィルターでは、IP アドレス 10.0.0.10 との間で送受信される ICMP トラフィック、およびポート 53 上のすべてのトラフィックがキャプチャされます。
C:\Test> pktmon filter add -i 10.0.0.10 -t icmp
C:\Test> pktmon filter add -p 53
フィルター機能
パケット モニターは、MAC アドレス、IP アドレス、ポート、EtherType、トランスポート プロトコル、および VLAN ID によるフィルター処理をサポートしています。
パケット モニターは、MAC アドレス、IP アドレス、またはポート フィルターに関しては、送信元と送信先を区別しません。
TCP パケットをさらにフィルター処理するために、一致させる TCP フラグのオプションのリストを指定できます。 サポートされているフラグは、FIN、SYN、RST、PSH、ACK、URG、ECE、および CWR です。
- たとえば、次のフィルターは、IP アドレス10.0.0.10 によって送受信されたすべての SYN パケットをキャプチャします。
C:\Test> pktmon filter add -i 10.0.0.10 -t tcp syn
- いずれかのフィルターに [-e] フラグが追加された場合、パケット モニターは、外部パケットに加えて、カプセル化された内部パケットにフィルターを適用できます。 サポートされているカプセル化方法は、VXLAN、GRE、NVGRE、および IP-in-IP です。 カスタム VXLAN ポートはオプションであり、既定値は 4789 です。
詳細については、pktmon フィルターの構文に関するページを参照してください。
パケットと一般的なイベントのキャプチャ
パケット モニターでは、start コマンドで [-c] パラメーターを指定してパケットをキャプチャできます。 これにより、パケット カウンターだけでなくパケットのキャプチャとログ記録が使用可能になります。 パケットのログ記録を行わずにパケット カウンターのみを有効にするには、[-o] パラメーターを start コマンドに追加します。 パケット カウンターの詳細については、後述の「パケット カウンター」セクションを参照してください。
[--comp] パラメーターを使用して、監視するコンポーネントを選択できます。 NIC のみまたはコンポーネント ID の一覧を指定できます。既定ではすべてのコンポーネントになります。 [--Type] パラメーターを使用して、パケット伝達ステータス (パケットの破棄またはフロー) によってフィルター処理することもできます。
パケット モニターでは、パケットのキャプチャに加えて、ETW や WPP イベントなどの一般的なイベントもキャプチャできます。そのためには、[-t] パラメーターを宣言し、[-p] パラメーターを使用してプロバイダーを指定します。 すべてのデータ収集を停止するには、"pktmon stop" を使用します。
たとえば、次のコマンドは、ネットワーク アダプターのみのパケットをキャプチャします。
C:\Test> pktmon start -c --comp nics
次のコマンドでは、コンポーネント 4 と 5 を通過する破棄されたパケットだけをキャプチャし、ログに記録します。
C:\Test> pktmon start -c --comp 4,5 --type drop
このコマンドは、プロバイダー "Microsoft-Windows-TCPIP" からパケットをキャプチャし、イベントをログに記録します。
C:\Test> pktmon start --capture --trace -p Microsoft-Windows-TCPIP
パケットのログ記録機能
パケット モニターは、複数のログ記録モードをサポートしています。
- 循環: 最大ファイル サイズに達したときに、新しいパケットによって最も古いパケットが上書きされます。 これは既定のログ記録モードです。
- マルチファイル: 最大ファイル サイズに達したときに、新しいログ ファイルが作成されます。 ログ ファイルには、PktMon1.etl、PktMon2.etl などのように順番に番号が付けられます。このログ記録モードを適用すると、すべてのログが保持されますが、記憶域の使用率に注意する必要があります。 注: 各ログ ファイルのファイル作成タイムスタンプは、キャプチャの特定の期間を示す値として使用してください。
- リアルタイム: パケットは、リアルタイムで画面に表示されます。 ログ ファイルは作成されません。 監視を停止するには、Ctrl + C キーを使用します。
- メモリ: イベントは、循環メモリ バッファーに書き込まれます。 バッファー サイズは、[-s] パラメーターを使用して指定します。 キャプチャを停止した後に、バッファーの内容がログ ファイルに書き込まれます。 このログ モードは、非常にノイズの多いシナリオで、非常に短い時間だけ大量のトラフィックをメモリ バッファーにキャプチャする場合に使用します。 他のログ モードを使用すると、一部のトラフィックが失われる可能性があります。
ログに記録するパケットの量を指定するには、[-P] パラメーターを使用します。 そのパラメーターを 0 に設定すると、サイズに関係なくすべてのパケットのパケット全体がログに記録されます。 既定値は 128 バイトで、ほとんどのパケットのヘッダーが含まれます。
ログ ファイルのサイズを指定するには、[-S] パラメーターを使用します。 これは、循環ログ モードでのログ ファイルの最大サイズになります。このサイズになると、パケット モニターは古いパケットを新しいパケットで上書きし始めます。 これは、マルチファイル ログ モードでの各ログ ファイルの最大サイズにもなります。このサイズになると、パケット モニターは次のパケットをログ記録するために新しいファイルを作成します。 このパラメーターを使用して、メモリ ログ モードのバッファー サイズを設定することもできます。
詳細については、pktmon start の構文に関するページを参照してください。
パケット分析と書式設定
パケット モニターは、ETL 形式でログ ファイルを生成します。 分析用に ETL ファイルをフォーマットする場合、次のような複数の方法があります。
- ログをテキスト形式に変換し (既定のオプション)、TextAnalysisTool.NET などのテキスト エディター ツールを使用して分析します。 パケット データは TCPDump 形式で表示されます。 次のガイドに従って、テキスト ファイル内の出力を分析する方法を確認してください。
- ログを pcapng 形式に変換して、Wireshark* を使用してログを分析します。
- ネットワーク モニター*で msn.etl ファイルを開きます。
Note
* 上記のハイパーリンクを使用して、 Wireshark と ネットワーク モニターでパケット モニターのログを解析および分析する方法を確認してください。
詳細については、pktmon format の構文に関するページを参照してください。
パケット モニターの出力の分析
パケット モニターは、ネットワーク スタックのコンポーネントごとに、パケットのスナップショットをキャプチャします。 これにより、各パケットの複数のスナップショットが存在することになります (下の図では、青い四角形の線で示されています)。 これらの各パケットのスナップショットは、複数の行 (赤と緑の四角形) で表されます。 パケット インスタンスに関するデータを含む行が少なくとも 1 行あり、その行はタイムスタンプから始まります。 そのすぐ後に、解析された未加工パケットをテキスト形式 (タイムスタンプなし) で表示する少なくとも 1 つの行 (下の図で太字の部分) があります。緑色の四角形で囲まれたパケットのように、パケットがカプセル化されている場合は、複数の行が存在する可能性があります。
同じパケットのすべてのスナップショットを関連付けるには、PktGroupId と PktNumber の値 (黄色で強調表示されています) を監視します。同じパケットのすべてのスナップショットは、これらの 2 つの値が同じになっています。 Appearance の値 (青で強調表示されています) は、同じパケットの後続の各スナップショットのカウンターとして機能します。 たとえば、パケットの最初のスナップショット (ネットワーク スタックでパケットが最初に現れた場所) の値が 1 である場合、次のスナップショットの値は 2 になり、以下同様になります。
各パケット スナップショットには、スナップショットに関連付けられているコンポーネントを示すコンポーネント ID (上の図で下線付きの部分) があります。 コンポーネント名とパラメーターを解決するには、ログ ファイルの下部にあるコンポーネントの一覧でこのコンポーネント ID を探します。 次の図に示す、コンポーネント テーブルの一部では、"Component 1" が黄色で強調表示されています (これは、上の最後のスナップショットがキャプチャされたコンポーネントです)。 2 つのエッジを持つコンポーネントでは、各エッジで 2 つのスナップショット (たとえば上の図では、Appearance 3 と Appearance 4 があるスナップショット) がレポートされます。
次の図に示すように、各ログ ファイルの下部には、フィルター一覧が表示されます (青で強調表示されています)。 各フィルターには、指定されたパラメーター (下記の例の Protocol ICMP) が表示され、残りのパラメーターには 0 が表示されます。
破棄されたパケットの場合は、パケットがドロップされたスナップショットを表す行の前に "drop" という単語が表示されます。 破棄された各パケットは、dropReason 値も提供します。 dropReason パラメーターは、たとえば MTU Mismatch、Filtered VLAN などのように、パケットが破棄された理由の簡単な説明を示します。
パケット カウンター
ログを分析しなくとも、パケット モニター カウンターでは、ネットワーク スタック全体のネットワーク トラフィックの概要が提供されます。これは、コストのかかるプロセスになる可能性があります。 トラフィックのパターンを調べるには、パケット モニターでキャプチャを開始した後に、pktmon counters を使用してパケット カウンターのクエリを実行します。 カウンターを 0 にリセットするには、pktmon reset を使用し、すべての監視を停止するには、pktmon stop を使用します。
- カウンターは、上部のネットワーク アダプターと下部のプロトコルでスタックをバインドして配置されます。
- Tx/Rx: カウンターは、送信 (Tx) 方向と受信方向 (Rx) 方向の 2 つの列に分割されます。
- エッジ: コンポーネントは、パケットがコンポーネントの境界 (エッジ) を越えたときにパケット伝達を報告します。 各コンポーネントは、1 つまたは複数のエッジを持つ場合があります。 ミニポート ドライバーは通常 1 つの上部のエッジを持ち、プロトコルは 1 つの下部のエッジを持ち、フィルター ドライバーは上部と下部のエッジを持っています。
- 破棄: パケット破棄カウンターが同じテーブルで報告されます。
次の例では、新しいキャプチャが開始されてから、キャプチャが停止される前に、pktmon counters コマンドを使用してカウンターのクエリを実行しました。 カウンターは、ネットワーク スタックから出る 1 つのパケットを示しています。パケットは最初にプロトコル層から物理ネットワーク アダプターに送信され、その応答が反対方向に戻ります。 ping を実行できないか応答が見つからない場合は、カウンターを使用してそれを簡単に検出できます。
次の例では、"Counter" 列の下で Drops が報告されています。 pktmon counters --json を使用して JSON 形式のカウンター データを要求するか、出力ログを分析して詳細な情報を取得することで、各コンポーネントの最後の破棄の理由を確認します。
これらの例で示すように、カウンターは、少し見ただけで分析できるダイアグラムによって多くの情報を提供できます。
詳細については、pktmon counters の構文に関するページを参照してください。
ネットワーク スタック のレイアウト
コマンド pktmon list を使用して、ネットワーク スタックのレイアウトを確認します。
このコマンドは、アダプターのバインドによって配置されたネットワーク コンポーネント (ドライバー) を示します。
一般的なバインドは、次で構成されます。
- 1 つのネットワーク インターフェイス カード (NIC)
- いくつかの (場合によってはゼロの) フィルター ドライバー
- 1 つ以上のプロトコル ドライバー (TCP/IP など)
各コンポーネントは、監視対象の個々のコンポーネントを指定するために使用されるパケット モニター コンポーネント ID によって一意に識別されます。
Note
ID は永続的ではなく、再起動時、およびパケット モニターのドライバーの再起動時に変更される可能性があります。
パケット モニターの出力に表示される ID の中には、コンポーネントの一覧に表示されないものがあります。 これは、選択と表示を容易にするため、一部のコンポーネントが 1 つの ID に集約されているためです。 これらのコンポーネントの元の ID を検索するには、pktmon list --json を使い、出力で SecondaryId プロパティを見つけます。
詳細については、pktmon list の構文に関するページを参照してください。