powershell无法捕获原始网络包,但可通过get-azeffectivenetworksecuritygroup分析nsg规则、test-aznetworkipflow验证连接通断、解析nsg流日志定位真实拒绝流量,并结合get-nettcpconnection查看vm内部进程连接。
powershell 本身不能直接获取 azure 虚拟机(vm)的原始网络流量包或完整会话内容,但它能高效调用 azure 平台提供的诊断能力,实现对 vm 网络流量的**策略级分析、连接验证与安全规则溯源**——这是生产环境中最实用、最可靠的排查路径。
查看 VM 网络接口的有效安全规则
流量不通?先确认是不是被 NSG(网络安全组)拦截。以下命令可一次性列出应用到指定 VM 网卡的所有入站/出站规则(含子网和网卡两级 NSG 合并结果):
- 确保已登录 Azure:Connect-AzAccount
- 执行命令(替换为你的资源名):
Get-AzEffectiveNetworkSecurityGroup -NetworkInterfaceName "myVMVMNic" -ResourceGroupName "myResourceGroup" - 输出中重点关注 Protocol、SourceAddressPrefix、DestinationPortRange 和 Access 字段;若某条规则标记为 Deny 且匹配你的通信场景(如源为 0.0.0.0/0、目标端口 80),即为阻断根因。
使用 IP 流验证测试具体连接通断
模拟真实通信路径,验证从 VM 到某个目标 IP+端口是否可达,并明确失败原因(是路由问题、NSG 拒绝,还是目标无响应):
- 启用 Network Watcher(若未启用):
Enable-AzNetworkWatcher -Location "East US" - 运行验证(示例:检查 VM 是否能连通 8.8.8.8 的 53 端口):
Test-AzNetworkIPFlow -TargetResourceId "/subscriptions/xxx/resourceGroups/myRG/providers/Microsoft.Compute/virtualMachines/myVM" -Direction Outbound -Protocol TCP -LocalIPAddress "10.0.0.4" -LocalPort 12345 -RemoteIPAddress "8.8.8.8" -RemotePort 53 - 返回结果中的 Access(Allow/Deny)、RuleName(触发的具体 NSG 规则)和 Reason(如 “Rule does not match” 或 “No matching rule”)直接定位问题层级。
导出并分析 NSG 流日志(需提前开启)
若已为 NSG 启用流日志(存储到 Storage Account 或 Log Analytics),可用 PowerShell 查询近 7 天内的实际拒绝/允许记录:
- 读取存储账户中的日志(需安装 Az.Storage):
$ctx = New-AzStorageContext -StorageAccountName "mystorage" -StorageAccountKey "xxx"
Get-AzStorageBlobContent -Container "insights-logs-networksecuritygroupflowevent" -Blob "resourceId=xxx/y=2026/m=06/d=06/h=12/m=00/..." -Context $ctx -Destination "nsg-log.json" - 解析 JSON 日志(简化示例):
(Get-Content nsg-log.json | ConvertFrom-Json).records | Where-Object {$_.properties.status -eq "Reject"} | Select-Object @{n="Src";e={$_.properties.srcIP}}, @{n="Dst";e={$_.properties.dstIP}}, dstPort, protocol - 该方式可发现真实发生的“被拒连接”,比如某后台进程频繁尝试连外网特定端口,而该行为在本地 PowerShell 中不可见。
补充:本地 VM 内部流量观察(非 Azure 平台层)
若需了解 VM 自身进程的实时网络行为(如哪个程序在发包),回到 Windows 原生命令组合:
- 查当前活跃 TCP 连接及所属进程:
Get-NetTCPConnection | Where-Object State -eq 'Established' | ForEach-Object { [PSCustomObject]@{ RemoteAddr = $_.RemoteAddress; Port = $_.RemotePort; Process = (Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue).ProcessName } } | Sort-Object RemoteAddr - 结合 Get-Counter "\Network Interface\*\Bytes Received/sec" 查网卡瞬时速率,交叉比对高流量时段的连接列表,缩小嫌疑进程范围。










