PowerShellでパケットキャプチャを行う

概要


Windowsでパケットキャプチャを行う場合、Wiresharkを使用することが多いと思います。ただ、企業ポリシーや稼働環境によっては、インストールが制限される場合があると思います。
Powershellには、NetEventPacketCaptureとよばれるコマンドレットが用意されており、これらを用いてパケットキャプチャを行うことが可能です。
本稿では、Powershellにネイティブに用意されているコマンドレットを使用した、パケットキャプチャの方法を紹介します。




ネットワークイベントセッションの作成

最初に、New-NetEventSession コマンドレットでネットワークイベントセッションを作成します。
主なオプションは、以下になります。

オプション 説明
Name セッション名の指定
LocalFilePath パケットキャプチャを保存するファイル名を指定
MaxFileSize パケットキャプチャを保存するファイルサイズを指定(単位:MB)
1PS C:\> New-NetEventSession -Name "Session01" -LocalFilePath D:\Capture\Session01.etl
2
3Name               : Session01
4CaptureMode        : SaveToFile
5LocalFilePath      : D:\Capture\Session01.etl
6MaxFileSize        : 250 MB
7TraceBufferSize    : 0 KB
8MaxNumberOfBuffers : 0
9SessionStatus      : NotRunning

ネットワークイベントプロバイダーの追加

次に、Add-NetEventPacketCaptureProvider コマンドレットでネットワークイベントプロバイダーをセッションに追加します。 ネットワークイベントプロバイダーは、イベントとネットワークトラフィックをEvent Tracing for Windows (ETW) イベントとしてログに記録します。
主なオプションは、以下になります。

オプション 説明
SessionName セッション名の指定
IpAddresses パケットキャプチャを行うIPアドレスを指定
IpProtocols パケットキャプチャを行うIPプロトコルを指定。TCPは6。UDPは17
 1PS C:\> Add-NetEventPacketCaptureProvider -SessionName "Session01"
 2
 3Name               : Microsoft-Windows-NDIS-PacketCapture
 4SessionName        : Session01
 5Level              : 4
 6MatchAnyKeyword    : 0xFFFFFFFFFFFFFFFF
 7MatchAllKeyword    : 0x0
 8CaptureType        : BothPhysicalAndSwitch
 9VmCaptureDirection : IngressAndEgress
10MultiLayer         : False
11LinkLayerAddress   : {}
12EtherType          : {}
13IpAddresses        : {}
14IpProtocols        : {}
15TruncationLength   : 128

ネットワークインターフェースの指定(オプション)

パケットキャプチャを行うネットワークインターフェースを特定したい場合は、Add-NetEventPacketCaptureProvider コマンドレットを実行します。
主なオプションは、以下になります。

オプション 説明
Name ネットワークインターフェースの指定。Get-NetAdapter コマンドレットで確認可能
1PS C:\> Add-NetEventNetworkAdapter -Name "Ethernet"
2
3Name                 : Ethernet
4InterfaceDescription : Intel(R) Ethernet Connection (2) I219-V
5ProviderName         : Microsoft-Windows-NDIS-PacketCapture
6CaptureStatus        :

パケットキャプチャ開始

準備が整ったので、Start-NetEventSession コマンドレットでパケットキャプチャを開始します。
主なオプションは、以下になります。

オプション 説明
Name セッション名の指定
1PS C:\> Start-NetEventSession -Name "Session01"

パケットキャプチャ停止

パケットキャプチャを停止するには、Stop-NetEventSession コマンドレットを実行します。
New-NetEventSession コマンドレットで指定したファイルに、ログが保存されます。 主なオプションは、以下になります。

オプション 説明
Name セッション名の指定
1PS C:\> Stop-NetEventSession -Name "Session01"

ネットワークイベントセッションの削除

パケットキャプチャを実行後、Remove-NetEventSession コマンドレットでネットワークイベントセッションを削除します。コマンドレットで削除しないと、セッションは残り続けます(端末を再起動しても残ります)。 また、セッションは複数作成することはできません。

1PS C:\> Remove-NetEventSession

etlからpcapngへの変換

パケットキャプチャのログであるetlファイルは、Network Monitorなどで参照することが可能です。 Wiresharkで参照したい場合は、Network Monitorでpcap形式で保存するか、githubで公開されているコマンドでpcapngに変換することが可能です。

1PS C:\> D:\Capture\etl2pcapng.exe D:\Capture\Session01.etl D:\Capture\Session01.pcapng
2IF: medium=eth                  ID=0    IfIndex=13      VlanID=0
3Converted 8875 frames

参考


翻訳: