PowerShell を使用して Azure Network Watcher で仮想マシンのパケット キャプチャを管理する

Network Watcher パケット キャプチャ ツールを使用すると、Azure 仮想マシン (VM) との間のネットワーク トラフィックを記録するキャプチャ セッションを作成できます。 必要なトラフィックのみを確実にキャプチャするためにキャプチャ セッション用のフィルターが用意されています。 パケット キャプチャは、事後対応的および事前対応的な両方の方法でネットワークの異常を診断するのに役立ちます。 その適用範囲は、異常検出だけでなく、ネットワーク統計情報の収集、ネットワーク侵入に関する分析情報の取得、クライアントとサーバー間の通信のデバッグ、その他のさまざまなネットワークの課題への対処を含みます。 Network Watcher パケット キャプチャを使用すると、パケット キャプチャをリモートで開始できるため、特定の仮想マシン上で手動で実行する必要が軽減されます。

この記事では、Azure PowerShell を使用して、仮想マシンのパケット キャプチャをリモートで構成、開始、停止、ダウンロード、削除する方法について説明します。 Azure portal または Azure CLI を使用してパケット キャプチャを管理する方法については、「Azure portal を使用して仮想マシンのパケット キャプチャを管理する」および「Azure CLI を使用して仮想マシンのパケット キャプチャを管理する」を参照してください。

前提条件

  • アクティブなサブスクリプションが含まれる Azure アカウント。 無料でアカウントを作成できます

  • Azure Cloud Shell または Azure PowerShell。

    この記事の手順では、Azure Cloud Shell で Azure PowerShell コマンドレットを対話型で実行します。 Cloud Shell でコマンドを実行するには、コード ブロックの右上隅にある [Cloud Shell を開く] を選択します。 [コピー] を選択してコードをコピーし、続いて Cloud Shell に貼り付けて実行します。 Azure portal 内から Cloud Shell を実行することもできます。

    また、Azure PowerShell をローカルにインストールしてコマンドレットを実行することもできます。 この記事では、Az PowerShell モジュールが必要です。 詳細については、「Azure PowerShell のインストール方法」を参照してください。 インストールされているバージョンを確認するには、Get-InstalledModule -Name Az を実行します。 PowerShell をローカルで実行している場合は、Connect-AzAccount コマンドレットを使用して Azure にサインインします。

  • 次の送信 TCP 接続を持つ仮想マシン:

    • ポート 443 を経由するストレージ アカウントへ
    • ポート 80 を経由する 169.254.169.254 への接続
    • ポート 8037 を経由する 168.63.129.16 への接続

Note

  • 仮想マシンのリージョンで Network Watcher が有効になっていない場合、Azure ではそのリージョンに Network Watcher インスタンスを作成します。 詳細については、「Azure Network Watcher を有効または無効にする」を参照してください。
  • Network Watcher パケット キャプチャでは、対象となる仮想マシンに Network Watcher エージェント VM 拡張機能をインストールする必要があります。 詳細については、「Network Watcher エージェントをインストールする」を参照してください。
  • 前提条件」に記載されている最後の 2 つの IP アドレスとポートは、Network Watcher エージェントを使用するすべての Network Watcher ツールで共通であり、変更されることがあります。

ネットワーク セキュリティ グループが、ネットワーク インターフェイス、またはネットワーク インターフェイスが含まれるサブネットに関連付けられている場合は、前述のポート経由の送信接続を許可するルールが存在することを確認します。 同様に、ユーザー定義ルートをネットワークに追加するときに、前述のポート経由の送信接続を確保します。

Network Watcher エージェントをインストールする

パケット キャプチャを使用するには、Network Watcher エージェントの仮想マシン拡張機能を仮想マシンにインストールする必要があります。

Get-AzVMExtension コマンドレットを使用して、拡張機能が仮想マシンにインストールされているかどうかを確認します。

# List the installed extensions on the virtual machine.
Get-AzVMExtension -VMName 'myVM' -ResourceGroupName 'myResourceGroup' | format-table Name, Publisher, ExtensionType, EnableAutomaticUpgrade 

拡張機能が仮想マシンにインストールされている場合は、前のコマンドの出力に表示されます。

Name                         Publisher                      ExtensionType            EnableAutomaticUpgrade
----                         ---------                      -------------            ----------------------
AzureNetworkWatcherExtension Microsoft.Azure.NetworkWatcher NetworkWatcherAgentLinux                   True

拡張機能がインストールされていない場合は、Set-AzVMExtension コマンドレットを使用してインストールします。

# Install Network Watcher agent on a Linux virtual machine.
Set-AzVMExtension -Publisher 'Microsoft.Azure.NetworkWatcher' -ExtensionType 'NetworkWatcherAgentLinux' -Name 'AzureNetworkWatcherExtension' -VMName 'myVM' -ResourceGroupName 'myResourceGroup' -TypeHandlerVersion '1.4' -EnableAutomaticUpgrade 1 
# Install Network Watcher agent on a Windows virtual machine.
Set-AzVMExtension -Publisher 'Microsoft.Azure.NetworkWatcher' -ExtensionType 'NetworkWatcherAgentWindows' -Name 'AzureNetworkWatcherExtension' -VMName 'myVM' -ResourceGroupName 'myResourceGroup' -TypeHandlerVersion '1.4' -EnableAutomaticUpgrade 1 

拡張機能のインストールが正常に完了すると、次の出力が表示されます。

RequestId IsSuccessStatusCode StatusCode ReasonPhrase
--------- ------------------- ---------- ------------
                         True         OK 

パケット キャプチャを開始する

キャプチャ セッションを開始するには、New-AzNetworkWatcherPacketCapture コマンドレットを使用します。

# Place the virtual machine configuration into a variable.
$vm = Get-AzVM -ResourceGroupName 'myResourceGroup' -Name 'myVM'

# Place the storage account configuration into a variable.
$storageAccount = Get-AzStorageAccount -ResourceGroupName 'myResourceGroup' -Name 'mystorageaccount'

# Start the Network Watcher capture session.
New-AzNetworkWatcherPacketCapture -Location 'eastus' -PacketCaptureName 'myVM_1' -TargetVirtualMachineId $vm.Id  -StorageAccountId $storageAccount.Id 

キャプチャ セッションが開始されると、次の出力が表示されます。

ProvisioningState Name   BytesToCapturePerPacket TotalBytesPerSession TimeLimitInSeconds
----------------- ----   ----------------------- -------------------- ------------------
Succeeded         myVM_1 0                       1073741824           18000

次の表では、New-AzNetworkWatcherPacketCapture コマンドレットで使用できる省略可能なパラメーターについて説明します。

パラメーター description
-Filter 必要なトラフィックのみをキャプチャするフィルターを追加します。 たとえば、特定の IP アドレスから特定のポートへの TCP トラフィックのみをキャプチャできます。
-TimeLimitInSeconds キャプチャ セッションの最長期間を設定します。 既定値は 18,000 秒 (5 時間) です。
-BytesToCapturePerPacket 各パケットごとにキャプチャする最大バイト数を設定します。 使用されていない場合、または 0 が入力されている場合は、すべてのバイトがキャプチャされます。
-TotalBytesPerSession キャプチャする合計バイト数を設定します。 この値に達するとパケット キャプチャは停止します。 使用しない場合、最大 1 GB (1,073,741,824 バイト) がキャプチャされます。
-LocalFilePath キャプチャを対象の仮想マシンに保存する場合、有効なローカル ファイル パス (C:\Capture\myVM_1.cap など) を入力します。 Linux マシンを使用している場合、パスは /var/captures で始まる必要があります。

パケット キャプチャを停止する

実行中のパケット キャプチャ セッションを手動で停止するには Stop-AzNetworkWatcherPacketCapture コマンドレットを使用します。

# Manually stop a packet capture session.
Stop-AzNetworkWatcherPacketCapture -Location 'eastus' -PacketCaptureName 'myVM_1'

Note

このコマンドレットは、実行されたのが、現在実行中のキャプチャ セッションであるか、既に停止しているセッションであるかについて応答を返しません。

パケット キャプチャを取得する

パケット キャプチャ (実行中または完了) の状態を取得するには Get-AzNetworkWatcherPacketCapture コマンドレットを使用します。

# Get information, properties, and status of a packet capture.
Get-AzNetworkWatcherPacketCapture -Location 'eastus' -PacketCaptureName 'myVM_1'

次の出力は、Get-AzNetworkWatcherPacketCapture コマンドレットから出力の例です。 次の例はキャプチャ完了後です。 PacketCaptureStatus 値は Stopped で、StopReason は TimeExceeded です。 この値は、パケット キャプチャが成功し、所定の時間実行されたことを示します。

ProvisioningState Name   Target                                                                                                                              BytesToCapturePerPacket TotalBytesPerSession TimeLimitInSeconds
----------------- ----   ------                                                                                                                              ----------------------- -------------------- ------------------
Succeeded         myVM_1 /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM 0                       1073741824           18000

Note

出力でさらなる詳細を取得するには、コマンドの末尾に | Format-List を追加します。

パケット キャプチャをダウンロードする

パケット キャプチャ セッションを終了すると、結果のキャプチャ ファイルは Azure Storage、ターゲット仮想マシン上のローカル ファイル、またはその両方に保存されます。 パケット キャプチャの保存先は、作成時に指定します。 詳細については、「パケット キャプチャを開始する」を参照してください。

ストレージ アカウントが指定されている場合、パケット キャプチャ ファイルは、次のパスにあるストレージ アカウントに保存されます。

https://{storageAccountName}.blob.core.windows.net/network-watcher-logs/subscriptions/{subscriptionId}/resourcegroups/{storageAccountResourceGroup}/providers/microsoft.compute/virtualmachines/{virtualMachineName}/{year}/{month}/{day}/packetcapture_{UTCcreationTime}.cap

Azure Storage に保存されたパケット キャプチャ ファイルをダウンロードするには、Get-AzStorageBlobContent コマンドレットを使用します。

# Download the packet capture file from Azure storage container.
Get-AzStorageBlobContent -Container 'network-watcher-logs' -Blob 'subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/myresourcegroup/providers/microsoft.compute/virtualmachines/myvm/2024/01/25/packetcapture_22_44_54_342.cap' -Destination 'C:\Capture\myVM_1.cap'

Note

Azure Storage Explorer を使用して、ストレージ アカウント コンテナーからキャプチャ ファイルをダウンロードすることもできます。 Storage Explorer は、Azure Storage データにアクセスして操作するために便利に使用できるスタンドアロン アプリです。 詳細については、「Storage Explorer の概要」を参照してください。

パケット キャプチャを削除する

# Remove a packet capture resource.
Remove-AzNetworkWatcherPacketCapture -Location 'eastus' -PacketCaptureName 'myVM_1'

重要

Network Watcher でパケット キャプチャを削除しても、ストレージ アカウントや仮想マシンからキャプチャ ファイルは削除されません。 キャプチャ ファイルが不要になった場合は、ストレージ コストが発生しないように、ストレージ アカウントから手動で削除する必要があります。