使用 Powershell 通过 Azure 网络观察程序管理虚拟机的数据包捕获

使用网络观察程序数据包捕获工具,可以创建捕获会话以跟踪进出 Azure 虚拟机 (VM) 的流量。 为捕获会话提供了筛选器以确保仅捕获所需的流量。 数据包捕获有助于以主动和被动方式诊断网络异常。 其应用程序超出了异常情况检测的范围,包括收集网络统计信息、获取对网络入侵的见解、调试客户端服务器通信以及解决各种其他网络难题。 通过网络观察程序数据包捕获,可以远程启动数据包捕获,从而减少在特定虚拟机上手动执行的需要。

本文介绍如何使用 Azure PowerShell 远程配置、启动、停止、下载和删除虚拟机数据包捕获。 要了解如何使用 Azure 门户或 Azure CLI 管理数据包捕获,请参阅使用 Azure 门户管理虚拟机的数据包捕获使用 Azure CLI 管理虚拟机的数据包捕获

先决条件

  • 具有活动订阅的 Azure 帐户。 创建试用版订阅

  • Azure PowerShell。

    在本地安装 Azure PowerShell 来运行 cmdlet。 本文需要 Azure PowerShell Az 模块。 要查找已安装的版本,请运行 Get-Module -ListAvailable Az。 如果在本地运行 PowerShell,请使用 Connect-AzAccount -Environment AzureChinaCloud cmdlet 登录到 Azure。

  • 具有以下出站 TCP 连接的虚拟机:

    • 到存储帐户(通过端口 443)
    • 到 169.254.169.254(通过端口 80)
    • 到 168.63.129.16(通过端口 8037)

注意

  • 如果未为该区域启用网络观察程序,Azure 会在虚拟机区域中创建网络观察程序实例。 有关详细信息,请参阅启用或禁用 Azure 网络观察程序
  • 网络观察程序数据包捕获要求在目标虚拟机上安装网络观察程序代理 VM 扩展。 有关详细信息,请参阅安装网络观察程序代理
  • 先决条件中列出的最后两个 IP 地址和端口在使用网络观察程序代理的所有网络观察程序工具中都很常见,可能偶尔会改变

如果某个网络安全组已关联到网络接口或该网络接口所在的子网,请确保存在规则以允许基于上述端口的出站连接。 同样,在将用户定义的路由添加到网络时,请确保通过以前的端口进行出站连接。

安装网络观察程序代理

若要使用数据包捕获,必须在虚拟机上安装网络观察程序代理虚拟机扩展。

使用 Get-AzVMExtension cmdlet 检查虚拟机上是否已安装该扩展:

# 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 cmdlet 安装它:

# 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 cmdlet:

# 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 'chinaeast' -PacketCaptureName 'myVM_1' -TargetVirtualMachineId $vm.Id  -StorageAccountId $storageAccount.Id 

启动捕获会话后,会看到以下输出:

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

下表介绍了可用于 New-AzNetworkWatcherPacketCapture cmdlet 的可选参数:

参数 description
-Filter 添加筛选器以仅捕获所需的流量。 例如,可以只捕获从特定 IP 地址到特定端口的 TCP 流量。
-TimeLimitInSeconds 设置捕获会话的最长持续时间。 默认值为 18000 秒(5 小时)。
-BytesToCapturePerPacket 设置每个数据包要捕获的最大字节数。 如果未使用或输入了 0,则会捕获所有字节。
-TotalBytesPerSession 设置捕获的字节总数。 一旦达到此值,数据包捕获便停止。 如果未使用,则最多捕获 1 GB(1073741824 字节)。
-LocalFilePath 如果希望将捕获保存在目标虚拟机中(例如 C:\Capture\myVM_1.cap),请输入有效的本地文件路径。 如果你使用的是 Linux 计算机,则路径必须以 /var/captures 开头。

停止数据包捕获

使用 Stop-AzNetworkWatcherPacketCapture cmdlet 手动停止正在运行的数据包捕获会话。

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

注意

无论在当前正在运行的捕获会话还是已停止的会话上运行,该 cmdlet 都不会返回响应。

获取数据包捕获

使用 Get-AzNetworkWatcherPacketCapture cmdlet 检索数据包捕获的状态(正在运行或已完成)。

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

以下输出是 Get-AzNetworkWatcherPacketCapture cmdlet 的输出示例。 以下示例是捕获完成后的输出结果。 PacketCaptureStatus 值为“已停止”,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

注意

若要获取输出中的更多详细信息,请在命令末尾添加 | Format-List

下载数据包捕获

完成数据包捕获会话后,生成的捕获文件将保存到 Azure 存储、目标虚拟机中的本地文件或这两个位置。 数据包捕获的存储目的地在其创建期间指定。 有关详细信息,请参阅启动数据包捕获

如果指定了存储帐户,则捕获文件将保存到以下路径的存储帐户:

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

若要下载保存到 Azure 存储的数据包捕获文件,请使用 Get-AzStorageBlobContent cmdlet:

# 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'

注意

还可以使用 Azure 存储资源管理器从存储帐户容器下载捕获文件。 存储资源管理器是可用于访问和处理 Azure 存储数据的独立应用。 有关详细信息,请参阅存储资源管理器入门

删除数据包捕获

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

重要

删除网络观察程序中的数据包捕获不会删除存储帐户或虚拟机中的捕获文件。 如果不再需要捕获文件,则必须手动将其从存储帐户中删除,以避免产生存储成本。