Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
En este artículo se proporcionan consultas de ejemplo del lenguaje de consulta kusto (KQL) para ayudarle a analizar los datos de análisis de tráfico de forma eficaz. Análisis de tráfico procesa registros de flujo de red virtual (VNet) y registros de flujo del grupo de seguridad de red (NSG) para proporcionar información detallada sobre los patrones de tráfico de red, los eventos de seguridad y las métricas de rendimiento.
Use estas consultas para:
- Identificación de patrones de tráfico de red y puntos de conexión comunicados principales
- Supervisión de eventos de seguridad y análisis de posibles amenazas
- Solución de problemas de conectividad de red
- Optimización del rendimiento de red y el uso de recursos
Prerrequisitos
- Análisis de tráfico configurado para los registros de flujo. Para obtener más información, consulte Habilitación o deshabilitación del análisis de tráfico.
- Acceso al área de trabajo de Log Analytics donde se almacenan los datos del registro de flujo. Para obtener más información, vea Información general del área de trabajo de Log Analytics.
Consultas de NTANetAnalytics
En esta sección se proporcionan consultas de ejemplo para la tabla NTANetAnalytics que puede usar para analizar los datos de análisis de tráfico de Virtual Network. La tabla NTANetAnalytics contiene datos de registro de flujo agregados con información mejorada de análisis de red. Para obtener más información sobre el esquema de tabla y los campos disponibles, consulte NTANetAnalytics.
Enumerar subredes que interactúan con direcciones IP públicas
Utilice la siguiente consulta para enumerar todas las subredes que interactúan con IP públicas que no son de Azure en los últimos 30 días.
NTANetAnalytics
| where SubType == "FlowLog" and FlowStartTime > ago(30d) and FlowType == "ExternalPublic"
| project SrcSubnet, DestSubnet
Enumerar subredes que interactúan entre sí
Use la siguiente consulta para enumerar todas las subredes que intercambiaron tráfico entre sí en los últimos 30 días y el total de bytes intercambiados.
NTANetAnalytics
| where SubType == 'FlowLog' and FaSchemaVersion == '3' and TimeGenerated > ago(30d)
| where isnotempty(SrcSubnet) and isnotempty(DestSubnet)
| summarize TotalBytes=sum(BytesSrcToDest + BytesDestToSrc) by SrcSubnet, DestSubnet,L4Protocol,DestPort
Visualización del tráfico entre regiones
Use la siguiente consulta para ver el tráfico intraregional e interregional en los últimos 30 días.
NTANetAnalytics
| where TimeGenerated > ago(30d)
| project SrcRegion, DestRegion, BytesDestToSrc, BytesSrcToDest
| where isnotempty(SrcRegion) and isnotempty(DestRegion)
| summarize TransferredBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcRegion, DestRegion
Visualización del tráfico basado en la suscripción
Use la siguiente consulta para ver el tráfico de Azure agrupado por suscripciones en los últimos 30 días.
NTANetAnalytics
| where TimeGenerated > ago(30d)
| project SrcSubscription, DestSubscription, BytesDestToSrc, BytesSrcToDest
| where isnotempty(SrcSubscription) and isnotempty(DestSubscription)
| summarize TransferredBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcSubscription, DestSubscription
Enumeración de máquinas virtuales que reciben la mayoría del tráfico local
Use la siguiente consulta para comprobar qué máquinas virtuales reciben más tráfico local.
NTANetAnalytics
| where SubType == "FlowLog" and FlowType == "S2S"
| where <Scoping condition>
| mvexpand vm = pack_array(SrcVm, DestVm) to typeof(string)
| where isnotempty(vm)
| extend traffic = AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows // For bytes use: | extend traffic = InboundBytes + OutboundBytes
| make-series TotalTraffic = sum(traffic) default = 0 on FlowStartTime from datetime(<time>) to datetime(<time>) step 1m by vm
| render timechart
Enumerar direcciones IP que reciben la mayoría del tráfico local
Use la siguiente consulta para comprobar qué direcciones IP reciben la mayoría del tráfico local.
NTANetAnalytics
| where SubType == "FlowLog" and FlowType == "S2S"
| where <Scoping condition>
| mvexpand vm = pack_array(SrcIp, DestIp) to typeof(string)
| where isnotempty(vm)
| extend traffic = AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows // For bytes use: | extend traffic = InboundBytes + OutboundBytes
| make-series TotalTraffic = sum(traffic) default = 0 on FlowStartTime from datetime(<time>) to datetime(<time>) step 1m by vm
| render timechart
Enumerar direcciones IP que envían o reciben tráfico hacia o desde una máquina virtual
Use la consulta siguiente para enumerar todas las IP que intercambiaron datos con una máquina virtual mediante su dirección IP en los últimos 30 días.
NTANetAnalytics
| where TimeGenerated > ago(30d)
| where SrcIp == "10.1.1.8" and strlen(DestIp)>0
| summarize TotalBytes=sum(BytesDestToSrc+BytesSrcToDest) by SrcIp, DestIp
Visualización del tráfico de ExpressRoute
Use la consulta siguiente para ver el tráfico a través de conexiones de ExpressRoute en los últimos 30 días.
NTANetAnalytics
| where SubType == 'FlowLog' and TimeGenerated > ago(30d)
| where isnotnull(SrcExpressRouteCircuit) or isnotnull(DestExpressRouteCircuit)
| extend TargetResourceName = tostring(split(TargetResourceId, "/")[2])
| summarize TotalBytes=sum(BytesSrcToDest + BytesDestToSrc) by TargetResourceName, bin(TimeGenerated, 1d)
| render columnchart
Visualización de la distribución del tráfico del equilibrador de carga
Use la siguiente consulta para ver la distribución del tráfico de la aplicación que tiene un equilibrador de carga delante de ella.
NTANetAnalytics
| where SubType == 'FlowLog' and TimeGenerated > ago(30d)
| where SrcLoadBalancer contains 'web' or DestLoadBalancer contains 'web'
| summarize TotalBytes = sum(BytesSrcToDest + BytesDestToSrc) by tostring(SrcIp)
| render piechart
Comprobación de la desviación estándar en el tráfico recibido por las máquinas virtuales
Use la consulta siguiente para comprobar la desviación estándar en el tráfico recibido por las máquinas virtuales de las máquinas locales.
NTANetAnalytics
| where SubType == "FlowLog" and FlowType == "S2S"
| where <Scoping condition>
| mvexpand vm = pack_array(SrcVm, DestVm) to typeof(string)
| where isnotempty(vm)
| extend traffic = AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows // For bytes use: | extend traffic = InboundBytes + OutboundBytes
summarize deviation = stdev(traffic) by vm
Comprobación de la desviación estándar en el tráfico recibido por las IP
Use la consulta siguiente para comprobar la desviación estándar en el tráfico recibido por las direcciones IP de las máquinas locales.
NTANetAnalytics
| where SubType == "FlowLog" and FlowType == "S2S"
| where <Scoping condition>
| mvexpand vm = pack_array(SrcIp, DestIp) to typeof(string)
| where isnotempty(vm)
| extend traffic = AllowedInFlows + DeniedInFlows + AllowedOutFlows + DeniedOutFlows // For bytes use: | extend traffic = InboundBytes + OutboundBytes
| summarize deviation = stdev(traffic) by IP
Consultas de NTAIpDetails
En esta sección se proporcionan consultas de ejemplo para la tabla NTAIpDetails que puede usar para analizar información específica de IP en los datos de análisis de tráfico. Para obtener más información, consulte NTAIpDetails.
Visualización de tipos de flujo y ubicaciones de IP públicas
Use la consulta siguiente para obtener información sobre los tipos de flujo y la ubicación de las IP públicas en los datos de análisis de tráfico.
NTAIpDetails
| distinct FlowType, PublicIpDetails, Location
Visualización de tipos de flujo malintencionados
Use la consulta siguiente para ver los tipos de subprocesos en flujos malintencionados.
NTAIpDetails
| where TimeGenerated > ago(30d)
| where FlowType == "MaliciousFlow"
| summarize count() by ThreatType
| render piechart
Consultas de AzureNetworkAnalytics_CL
En esta sección se proporcionan consultas de ejemplo para la tabla de consultas de AzureNetworkAnalytics_CL que puede usar para analizar los datos de los registros de flujo de NSG de análisis de tráfico.
Enumerar todas las subredes que interactúan con IP públicas
Utilice la siguiente consulta para enumerar todas las subredes que interactúan con IP públicas que no son de Azure en los últimos 30 días.
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog" and FlowStartTime_t >= ago(30d) and FlowType_s == "ExternalPublic"
| project Subnet1_s, Subnet2_s
Visualización de la ruta de acceso del blob para flujos que interactúan con direcciones IP públicas
Para ver la ruta del blob de los flujos de la consulta anterior, utilice la siguiente consulta.
let TableWithBlobId =
(AzureNetworkAnalytics_CL
| where SubType_s == "Topology" and ResourceType == "NetworkSecurityGroup" and DiscoveryRegion_s == Region_s and IsFlowEnabled_b
| extend binTime = bin(TimeProcessed_t, 6h),
nsgId = strcat(Subscription_g, "/", Name_s),
saNameSplit = split(FlowLogStorageAccount_s, "/")
| extend saName = iif(arraylength(saNameSplit) == 3, saNameSplit[2], '')
| distinct nsgId, saName, binTime)
| join kind = rightouter (
AzureNetworkAnalytics_CL
| where SubType_s == "FlowLog"
| extend binTime = bin(FlowEndTime_t, 6h)
) on binTime, $left.nsgId == $right.NSGList_s
| extend blobTime = format_datetime(todatetime(FlowIntervalStartTime_t), "yyyy MM dd hh")
| extend nsgComponents = split(toupper(NSGList_s), "/"), dateTimeComponents = split(blobTime, " ")
| extend BlobPath = strcat("https://", saName,
"@insights-logs-networksecuritygroupflowevent/resoureId=/SUBSCRIPTIONS/", nsgComponents[0],
"/RESOURCEGROUPS/", nsgComponents[1],
"/PROVIDERS/MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/", nsgComponents[2],
"/y=", dateTimeComponents[0], "/m=", dateTimeComponents[1], "/d=", dateTimeComponents[2], "/h=", dateTimeComponents[3],
"/m=00/macAddress=", replace(@"-", "", MACAddress_s),
"/PT1H.json")
| project-away nsgId, saName, binTime, blobTime, nsgComponents, dateTimeComponents;
TableWithBlobId
| where SubType_s == "FlowLog" and FlowStartTime_t >= ago(30d) and FlowType_s == "ExternalPublic"
| project Subnet_s , BlobPath
La consulta anterior construye una URL para acceder directamente al blob como sigue:
https://{storageAccountName}@insights-logs-networksecuritygroupflowevent/resoureId=/SUBSCRIPTIONS/{subscriptionId}/RESOURCEGROUPS/{resourceGroup}/PROVIDERS/MICROSOFT.NETWORK/NETWORKSECURITYGROUPS/{networkSecurityGroupName}/y={year}/m={month}/d={day}/h={hour}/m=00/macAddress={macAddress}/PT1H.json
Enumeración de máquinas virtuales que reciben la mayoría del tráfico local
Use la siguiente consulta para comprobar qué máquinas virtuales reciben más tráfico local.
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
Enumerar direcciones IP que reciben la mayoría del tráfico local
Use la siguiente consulta para comprobar qué direcciones IP reciben la mayoría del tráfico local.
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
Comprobación de la desviación estándar en el tráfico recibido por las máquinas virtuales
Use la consulta siguiente para comprobar la desviación estándar en el tráfico recibido por las máquinas virtuales de las máquinas locales.
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
Comprobación de la desviación estándar en el tráfico recibido por las IP
Use la consulta siguiente para comprobar la desviación estándar en el tráfico recibido por las direcciones IP de las máquinas locales.
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
Comprobación sobre qué puertos son accesibles o están bloqueados entre pares de IP con reglas de NSG
Use la consulta siguiente para comprobar qué puertos son accesibles (o están bloqueados) entre pares IP con reglas de NSG.
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
Impedir registros duplicados
Si el registro de flujo está habilitado en ambos lados de una conexión, se puede capturar un flujo en varios dispositivos. Como resultado, los datos duplicados pueden aparecer si todos los registros de flujo se agregan en la misma área de trabajo de Log Analytics. Es necesario incluir FlowDirection o MACAddress para evitar la duplicación y distinguir entre registros.
En un flujo o conexión:
-
MacAddressdenota el MAC del dispositivo en el que se captura el flujo. -
SrcIpdenota la dirección IP del dispositivo desde el que se inició la conexión. -
DestIpdenota la dirección IP del dispositivo al que se realizó la conexión. -
FlowDirectiondenota la dirección de la conexión con respecto al dispositivo. Por ejemplo, cuando se realiza una conexión desde VM1 (IP:10.0.0.4y MAC:A1:B1:C1:D1:E1:F1) a VM2 (IP:10.0.0.5y MAC:A2:B2:C2:D2:E2:F2), si el flujo se captura en VM1, entoncesFlowDirectionpara este flujo seríaOutboundy si el flujo se captura en VM2,FlowDirectionpara este flujo seríaInbound. -
BytesSrcToDest/PacketsSrcToDestdenota bytes o paquetes enviados desde el origen al destino, independientemente de dónde se capturaron. -
BytesDestToSrc/PacketsDestToSrcdenota bytes o paquetes enviados desde el destino al origen, independientemente de dónde se capturaron.
Por ejemplo, si se realiza una conexión de VM1 a VM2 con los campos siguientes.
| VM | SrcIp | DestIp | MAC | BytesSrcToDest | BytesDestToSrc | FlowDirection |
|---|---|---|---|---|---|---|
| VM1 | 10.0.0.4 | 10.0.0.5 | A1-B1-C1-D1-E1-F1 | 100 | 200 | Outbound |
| VM2 | 10.0.0.4 | 10.0.0.5 | A2-B2-C2-D2-E2-F2 | 100 | 200 | Entrante |
Puede usar cualquiera de las siguientes consultas para calcular el total de bytes salientes de un dispositivo con dirección IP 10.0.0.4 y dirección MAC A1:B1:C1:D1:E1:F1 para las conexiones iniciadas por este dispositivo.
NTANetAnalytics
| where SubType == "FlowLog"
| where SrcIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1" and FlowDirection == "Outbound"
| summarize totalIniBytes = sum(BytesSrcToDest);
NTANetAnalytics
| where SubType == "FlowLog"
| where SrcIp == "10.0.0.4" and FlowDirection == "Outbound"
| summarize totalIniBytes = sum(BytesSrcToDest);
NTANetAnalytics
| where SubType == "FlowLog"
| where SrcIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1"
| summarize totalIniBytes = sum(BytesSrcToDest);
Del mismo modo, puede usar cualquiera de las siguientes consultas para calcular el total de bytes salientes de un dispositivo con dirección IP 10.0.0.4 y dirección MAC A1:B1:C1:D1:E1:F1, para las conexiones iniciadas por otros dispositivos a este dispositivo.
NTANetAnalytics
| where DestIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1" and FlowDirection == "Inbound"
| summarize totalNoniniBytes = sum(BytesDestToSrc)
NTANetAnalytics
| where DestIp == "10.0.0.4" and FlowDirection == "Inbound"
| summarize totalNoniniBytes = sum(BytesDestToSrc)
NTANetAnalytics
| where DestIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1"
| summarize totalNoniniBytes = sum(BytesDestToSrc)
Puede calcular el total de bytes salientes de un dispositivo mediante la consulta siguiente:
let InitiatedByVM = NTANetAnalytics
| where SubType == "FlowLog"
| where SrcIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1" and FlowDirection == "Outbound"
| summarize totalIniBytes = sum(BytesSrcToDest);
let NotInitiatedByVM = NTANetAnalytics
| where DestIp == "10.0.0.4" and MacAddress == "A1:B1:C1:D1:E1:F1" and FlowDirection == "Inbound"
| summarize totalNoniniBytes = sum(BytesDestToSrc);
InitiatedByVM
| join kind=fullouter NotInitiatedByVM on FlowEndTime
| extend Time = iff(isnotnull(FlowEndTime), FlowEndTime, FlowEndTime1)
| summarize totalMB = (sum(totalIniBytes) + sum(totalNoniniBytes)) / 1024.0 /1024.0;