本文提供了有关 Azure 网络观察程序的流量分析功能的常见问题的解答。
若要了解如何检查分配给用户用于订阅的角色,请参阅使用 Azure 门户列出 Azure 角色分配。 如果看不到角色分配,请联系相应的订阅管理员。
是的,网络安全组可与 Log Analytics 工作区位于不同区域。
可以。
否,流量分析不支持经典网络安全组。
在“流量分析”仪表板的资源选择下拉列表中,必须选择“虚拟网络”资源的资源组,而不是虚拟机或网络安全组的资源组。
可以。 如果选择现有工作区,请确保它已迁移到新的查询语言。 如果不想要升级该工作区,则需要创建新的工作区。 有关 Kusto 查询语言 (KQL) 的详细信息,请参阅 Azure Monitor 中的日志查询。
是,可将 Azure 存储帐户置于一个订阅中,并将 Log Analytics 工作区置于另一个订阅中。
可以。 可以将流日志配置为发送到一个位于其他订阅中的存储帐户,前提是你有适当的权限,并且该存储帐户与网络安全组(网络安全组流日志)或虚拟网络(虚拟网络流日志)位于同一区域。 目标存储帐户必须共享网络安全组或虚拟网络的同一 Microsoft Entra 租户。
否。 包括网络安全组(网络安全组流日志)、虚拟网络(虚拟网络流日志)、流日志、存储帐户和 Log Analytics 工作区(如果启用了流量分析)在内的所有资源必须位于同一租户中。
可以。
否。 如果删除用于流日志的存储帐户,Log Analytics 工作区中存储的数据不会受到影响。 你仍然可以在 Log Analytics 工作区中查看历史数据(某些指标将受到影响),但在更新流日志以使用其他存储帐户之前,流量分析将不再处理任何新的流日志。
选择支持的区域。 如果选择不支持的区域,则会收到“未找到”错误。 有关详细信息,请参阅流量分析支持的区域。
要使流日志记录正常工作,必须注册 Microsoft.Insights
提供程序。 如果不确定是否 Microsoft.Insights
为订阅注册了提供程序,请参阅有关如何注册该订阅的管理 NSG 流日志 说明。
仪表板首次显示报告最长可能需要花费 30 分钟。 解决方案必须先聚合足够的数据才能派生有意义的见解,然后才能生成报告。
请尝试以下选项:
- 在上部菜单栏中更改时间间隔。
- 在上部菜单栏中选择不同的 Log Analytics 工作区。
- 如果流量分析是最近才启用的,请尝试在 30 分钟后访问它。
如果问题仍未解决,请在 Azure 支持中咨询。
出现此消息的可能原因有:
- 流量分析最近才启用,可能尚未聚合足够的数据,无法获得有意义的见解。
- 你正在使用免费版 Log Analytics 工作区,它超出了配额限制。 可能需要使用容量更大的工作区。
尝试上一问题的建议解决方案。 如果问题仍未解决,请在 Azure 支持中咨询。
仪表板上显示了资源信息,但未显示与流相关的统计信息。 由于资源之间没有通信流,因此可能不显示数据。 请在 60 分钟后重新检查状态。 如果问题仍未解决,而你确信资源之间存在通信流,请在 Azure 支持中咨询。
流量分析计量。 计量基于服务对原始流日志数据的处理。 有关详细信息,请参阅网络观察程序定价。
Log Analytics 工作区中引入的增强型日志最多可免费保留 31 天(如果工作区上启用了 Microsoft Sentinel,则最多可以保留 90 天)。 有关详细信息,请参阅 Azure Monitor 定价。
流量分析的默认处理间隔为 60 分钟,但可以选择以 10 分钟的间隔加速处理。 有关详细信息,请参阅流量分析中的数据聚合。
流量分析在与工作区相同的资源组中创建和管理数据收集规则(DCR)和数据收集终结点(DCE)资源,其前缀为 NWTA
前缀。 如果对这些资源执行任何操作,流量分析可能无法按预期运行。 有关详细信息,请参阅流量分析中的数据聚合。 有关详细信息,请参阅 Azure Monitor 中的数据收集规则,以及 Azure Monitor 中的数据收集终结点。
流量分析依靠 Microsoft 内部威胁智能系统来确定某个 IP 是否为恶意 IP。 这些系统使用各种遥测源,如 Azure 产品和服务、Microsoft数字犯罪部门(DCU)、Microsoft安全响应中心(MSRC)和外部源,并在其之上构建智能。 其中一些数据是 Microsoft 内部数据。 如果已知 IP 被标记为恶意 IP,请提出支持票证以了解详细信息。
流量分析没有对警报的内置支持。 但是,由于流量分析数据存储在 Log Analytics 中,因此可以编写自定义查询并对其设置警报。 请执行以下步骤:
使用以下查询:
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowType_s == "S2S"
| where <Scoping condition>
| mvexpand vm = pack_array(VM1_s, VM2_s) to typeof(string)
| where isnotempty(vm)
| extend traffic = AllowedInFlows_d + DeniedInFlows_d + AllowedOutFlows_d + DeniedOutFlows_d // For bytes use: | extend traffic = InboundBytes_d + OutboundBytes_d
| make-series TotalTraffic = sum(traffic) default = 0 on FlowStartTime_t from datetime(<time>) to datetime(<time>) step 1 m by vm
| render timechart
对于 IP,请使用以下查询:
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowType_s == "S2S"
//| where <Scoping condition>
| mvexpand IP = pack_array(SrcIP_s, DestIP_s) to typeof(string)
| where isnotempty(IP)
| extend traffic = AllowedInFlows_d + DeniedInFlows_d + AllowedOutFlows_d + DeniedOutFlows_d // For bytes use: | extend traffic = InboundBytes_d + OutboundBytes_d
| make-series TotalTraffic = sum(traffic) default = 0 on FlowStartTime_t from datetime(<time>) to datetime(<time>) step 1 m by IP
| render timechart
对于时间,请使用格式:yyyy-mm-dd 00:00:00
使用以下查询:
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowType_s == "S2S"
//| where <Scoping condition>
| mvexpand vm = pack_array(VM1_s, VM2_s) to typeof(string)
| where isnotempty(vm)
| extend traffic = AllowedInFlows_d + DeniedInFlows_d + AllowedOutFlows_d + DeniedOutFlows_d // For bytes use: | extend traffic = InboundBytes_d + utboundBytes_d
| summarize deviation = stdev(traffic) by vm
对于 IP:
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowType_s == "S2S"
//| where <Scoping condition>
| mvexpand IP = pack_array(SrcIP_s, DestIP_s) to typeof(string)
| where isnotempty(IP)
| extend traffic = AllowedInFlows_d + DeniedInFlows_d + AllowedOutFlows_d + DeniedOutFlows_d // For bytes use: | extend traffic = InboundBytes_d + OutboundBytes_d
| summarize deviation = stdev(traffic) by IP
使用以下查询:
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and TimeGenerated between (startTime .. endTime)
| extend sourceIPs = iif(isempty(SrcIP_s), split(SrcPublicIPs_s," "), pack_array(SrcIP_s)),
destIPs = iif(isempty(DestIP_s), split(DestPublicIPs_s," "), pack_array(DestIP_s))
| mvexpand SourceIp = sourceIPs to typeof(string)
| mvexpand DestIp = destIPs to typeof(string)
| project SourceIp = tostring(split(SourceIp, "|")[0]), DestIp = tostring(split(DestIp, "|")[0]), NSGList_s, NSGRule_s, DestPort_d, L4Protocol_s, FlowStatus_s
| summarize DestPorts= makeset(DestPort_d) by SourceIp, DestIp, NSGList_s, NSGRule_s, L4Protocol_s, FlowStatus_s