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

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

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

先决条件

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

  • Azure CLI。

    可以在本地安装 Azure CLI 以运行命令。 如果在本地运行 Azure CLI,请使用 az login 命令登录到 Azure。

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

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

注意

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

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

安装网络观察程序代理

步骤 1

在来宾虚拟机上运行 az vm extension set 命令以安装数据包捕获代理。

对于 Windows 虚拟机:

az vm extension set --resource-group resourceGroupName --vm-name virtualMachineName --publisher Microsoft.Azure.NetworkWatcher --name NetworkWatcherAgentWindows --version 1.4

对于 Linux 虚拟机:

az vm extension set --resource-group resourceGroupName --vm-name virtualMachineName --publisher Microsoft.Azure.NetworkWatcher --name NetworkWatcherAgentLinux --version 1.4

步骤 2

若要确保已安装代理,请运行 vm extension show 命令并向其传递资源组和虚拟机的名称。 检查结果列表,以确保已安装代理。

对于 Windows 虚拟机:

az vm extension show --resource-group resourceGroupName --vm-name virtualMachineName --name NetworkWatcherAgentWindows

对于 Linux 虚拟机:

az vm extension show --resource-group resourceGroupName --vm-name virtualMachineName --name AzureNetworkWatcherExtension

以下示例是运行 az vm extension show 后的响应的实例

{
  "autoUpgradeMinorVersion": true,
  "forceUpdateTag": null,
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}/extensions/NetworkWatcherAgentWindows",
  "instanceView": null,
  "location": "chinaeast",
  "name": "NetworkWatcherAgentWindows",
  "protectedSettings": null,
  "provisioningState": "Succeeded",
  "publisher": "Microsoft.Azure.NetworkWatcher",
  "resourceGroup": "{resourceGroupName}",
  "settings": null,
  "tags": null,
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "typeHandlerVersion": "1.4",
  "virtualMachineExtensionType": "NetworkWatcherAgentWindows"
}

启动数据包捕获

完成前面的步骤后,数据包捕获代理将安装在虚拟机上。

步骤 1

检索存储帐户。 此存储帐户用于存储数据包捕获文件。

az storage account list

步骤 2

此时,你已准备好创建数据包捕获。 首先,让我们检查你可能想要配置的参数。 筛选器就是这样的参数,可用来限制数据包捕获所存储的数据。 以下示例为数据包捕获设置了多个筛选器。 前三个筛选器仅收集从本地 IP 10.0.0.3 发往目标端口 20、80 和 443 的传出 TCP 流量。 最后一个筛选器仅收集 UDP 流量。

az network watcher packet-capture create --resource-group {resourceGroupName} --vm {vmName} --name packetCaptureName --storage-account {storageAccountName} --filters "[{\"protocol\":\"TCP\", \"remoteIPAddress\":\"1.1.1.1-255.255.255.255\",\"localIPAddress\":\"10.0.0.3\", \"remotePort\":\"20\"},{\"protocol\":\"TCP\", \"remoteIPAddress\":\"1.1.1.1-255.255.255.255\",\"localIPAddress\":\"10.0.0.3\", \"remotePort\":\"80\"},{\"protocol\":\"TCP\", \"remoteIPAddress\":\"1.1.1.1-255.255.255.255\",\"localIPAddress\":\"10.0.0.3\", \"remotePort\":\"443\"},{\"protocol\":\"UDP\"}]"

以下示例是运行 az network watcher packet-capture create 命令后的预期输出。

{
  "bytesToCapturePerPacket": 0,
  "etag": "W/\"b8cf3528-2e14-45cb-a7f3-5712ffb687ac\"",
  "filters": [
    {
      "localIpAddress": "10.0.0.3",
      "localPort": "",
      "protocol": "TCP",
      "remoteIpAddress": "1.1.1.1-255.255.255.255",
      "remotePort": "20"
    },
    {
      "localIpAddress": "10.0.0.3",
      "localPort": "",
      "protocol": "TCP",
      "remoteIpAddress": "1.1.1.1-255.255.255.255",
      "remotePort": "80"
    },
    {
      "localIpAddress": "10.0.0.3",
      "localPort": "",
      "protocol": "TCP",
      "remoteIpAddress": "1.1.1.1-255.255.255.255",
      "remotePort": "443"
    },
    {
      "localIpAddress": "",
      "localPort": "",
      "protocol": "UDP",
      "remoteIpAddress": "",
      "remotePort": ""
    }
  ],
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/NetworkWatcherRG/providers/Microsoft.Network/networkWatchers/NetworkWatcher_chinaeast/pa
cketCaptures/packetCaptureName",
  "name": "packetCaptureName",
  "provisioningState": "Succeeded",
  "resourceGroup": "NetworkWatcherRG",
  "storageLocation": {
    "filePath": null,
    "storageId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/{resourceGroupName}/providers/Microsoft.Storage/storageAccounts/gwteststorage123abc",
    "storagePath": "https://gwteststorage123abc.blob.core.chinacloudapi.cn/network-watcher-logs/subscriptions/00000000-0000-0000-0000-000000000000/resourcegroups/{resourceGroupName}/p
roviders/microsoft.compute/virtualmachines/{vmName}/2017/05/25/packetcapture_16_22_34_630.cap"
  },
  "target": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/virtualMachines/{vmName}",
  "timeLimitInSeconds": 18000,
  "totalBytesPerSession": 1073741824
}

获取数据包捕获

运行 az network watcher packet-capture show-status 命令,检索当前正在运行的或已完成的数据包捕获的状态。

az network watcher packet-capture show-status --name packetCaptureName --location {networkWatcherLocation}

以下示例是 az network watcher packet-capture show-status 命令的输出。 以下是捕获停止的示例,其中 StopReason 为 TimeExceeded。

{
  "additionalProperties": {
    "status": "Succeeded"
  },
  "captureStartTime": "2016-12-06T17:20:01.5671279Z",
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/NetworkWatcherRG/providers/Microsoft.Network/networkWatchers/NetworkWatcher_chinaeast/packetCaptures/packetCaptureName",
  "name": "packetCaptureName",
  "packetCaptureError": [],
  "packetCaptureStatus": "Stopped",
  "stopReason": "TimeExceeded"
}

停止数据包捕获

运行 az network watcher packet-capture stop 命令后,如果捕获会话正在进行,它将停止。

az network watcher packet-capture stop --name packetCaptureName --location chinaeast

注意

该命令在当前正在运行的捕获会话或已停止的现有会话中运行时,将不返回任何响应。

删除数据包捕获

az network watcher packet-capture delete --name packetCaptureName --location chinaeast

注意

删除数据包捕获不会删除存储帐户中的文件。

下载数据包捕获

完成数据包捕获会话后,可以将捕获文件上传到 blob 存储或 VM 上的本地文件。 数据包捕获的存储位置是在创建会话时定义的。 用于访问这些保存到存储帐户的捕获文件的便利工具是 Azure 存储资源管理器,下载地址为:https://storageexplorer.com/

如果指定了存储帐户,则数据包捕获文件将保存到以下位置的存储帐户:

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