Supervisión de conexiones de punto a sitio para Virtual WAN

En esta sección se documenta cómo crear un libro de Azure que muestre los datos pertinentes de los clientes VPN de usuario conectados a Azure Virtual WAN.

Antes de empezar

Para completar los pasos de este artículo, debe tener una Virtual WAN, un centro de conectividad virtual y una instancia de VPN Gateway de usuario. Para crear estos recursos, siga los pasos descritos en este artículo: Creación de una red Virtual WAN, un centro de conectividad virtual y una puerta de enlace

Arquitectura de la solución de libros

Screenshot shows workbook architecture.

Para configurar la arquitectura anterior, usaremos los siguientes registros de VPN de punto a sitio y el comando de PowerShell.

  • AzureDiagnostics: estos registros se reciben mediante la creación de una configuración de diagnóstico para la VPN Gateway de usuario y la habilitación de los registros GatewayDiagnosticLog, IKEDiagnosticLog, P2SDiagnosticLog y AllMetrics.

  • Get-AzP2sVpnGatewayDetailedConnectionHealth: se trata de un comando de PowerShell (que se ejecuta en una aplicación de funciones) para obtener los detalles de las sesiones activas. Este comando solo admite el almacenamiento de datos en una cuenta de almacenamiento basada en una clave SAS y proporciona detalles adicionales sobre las conexiones VPN de punto a sitio activas.

Creación de una cuenta de almacenamiento de Azure y carga de un blob

  1. Creación de una cuenta de Azure Storage.
  2. Creación de un contenedor y carga de un blob en el contenedor
    1. El blob debe ser un archivo de texto vacío con la extensión .json
    2. Al cargar el blob, asigne a la clave de cuenta los siguientes permisos: Leer, Agregar, Crear y Escribir.
    3. Asegúrese de copiar los valores Token de SAS de blob y URL de SAS de Blob en una ubicación segura.

Creación de una aplicación de funciones de Azure

  1. Creación de una aplicación de funciones de Azure y selección de PowerShell Core como pila de runtime

  2. Asignación de una identidad administrada asignada por el sistema a la aplicación de funciones

  3. Creación de una configuración de la aplicación con las siete entradas siguientes; para ello, escriba el nombre y el valor y, a continuación, seleccione Aceptar después de cada valor.

    Nombre Valor
    "resourcegroup" su grupo de recursos
    "sasuri" @Microsoft.KeyVault(SecretUri=https://\<keyvaultname>.vault.azure.net/secrets/sasuri/<version>)
    --> actualícelo en consecuencia después de crear el almacén de claves en la sección siguiente.
    "subscription" el identificador de suscripción
    "tenantname" el identificador de inquilino
    "vpngw" Este nombre es algo parecido a <guid>-eastus-ps2-gw. Puede obtenerlo en la configuración de VPN de usuario de vWAN HUB.
  4. Creación de una función desencadenada por un temporizador

  5. Seleccione Código y prueba en el panel izquierdo y escriba el código siguiente en el archivo run.ps1. Seleccione Guardar.

    # Input bindings are passed in via param block.
    param($Timer)
    
    # Get the current universal time in the default string format.
    $currentUTCtime = (Get-Date).ToUniversalTime()
    
    # The 'IsPastDue' property is "true" when the current function invocation is later than scheduled.
    if($Timer.IsPastDue){
    Write-Host "PowerShell timer is running late!"
    }
    
    ## Write an information log with current time.
    Write-Host "PowerShell timer trigger function ran! TIME:$currentUTCtime"
    
    $tenantname = $env:appsetting_tenantname
    $subscription = $env:appsetting_subscription
    $resourceGroup = $env:appsetting_resourcegroup
    $vpngw = $env:appsetting_vpngw
    $sasuri = $env:appsetting_sasuri
    
    Write-Host "Connecting to Managed Identity..."
    connect-azaccount -tenant $tenantname -identity -subscription $subscription
    
    Write-Host "Executing File Update..."
    Get-AzP2sVpnGatewayDetailedConnectionHealth -name $vpngw -ResourceGroupName $resourceGroup -OutputBlobSasUrl $sasuri
    
    Write-Host "Function Execution Completed!"
    
  6. Vuelva a la página Aplicación de funciones y seleccione Editor de App Service en el panel izquierdo en Herramientas de desarrollo. A continuación, seleccione Ir -->.

  7. Vaya a requirements.psd1 y descomprima la línea que empieza por "Az"... como se muestra.

    Screenshot showing the requirements file for function app.

  8. Para que el comando get-AzP2sVpnGatewayDetailedConnectionHealth se ejecute correctamente, debe tener los permisos adecuados para la información. Vaya al grupo de recursos y elija "Control de acceso (IAM)" en el panel izquierdo. Esto corresponde a la administración de identidades y acceso. Asigne el acceso de lectura de FunctionApp a través del grupo de recursos.

Crear una instancia de Azure Key Vault

  1. Crear una instancia de Azure Key Vault.

    1. Seleccione Directiva de acceso al almacén en Modelo de permisos.
    2. Deje las opciones en Acceso a los recursos como deshabilitado.
    3. En Directivas de acceso, seleccione + Crear.

    Screenshot shows first screen in creating access policy.

    1. Seleccione Siguiente para ir a la pestaña Principal. Escriba el nombre de la aplicación de funciones y selecciónelo.
    2. Seleccione Siguiente dos veces para ir a la cuarta pestaña: Revisar y crear y seleccione Crear en la parte inferior.
    3. Ahora debería ver la directiva de acceso recién creada en la sección Directivas de acceso. La modificación de los valores predeterminados en la pestaña Redes es opcional, por lo que seleccione Revisar y crear en la esquina inferior izquierda.
  2. Vaya a Secretos en Objetos en el panel izquierdo del recurso del almacén de claves. Seleccione + Generar/Importar y agregue el secreto como se muestra a continuación:

    • Nombre: sasuri
    • valor: <SASURI>
    • Habilitado: Sí
  3. Vuelva a la pestaña Configuración de la aplicación de funciones y modifique la entrada siguiente. El valor procede del campo Identificador secreto que aparece después de hacer clic en el secreto:

    • Nombre: "sasuri"
    • Valor: @Microsoft.KeyVault(SecretUri=https://\<keyvaultname>.vault.azure.net/secrets/sasuri/<version>)

Creación de un libro de Azure

El libro de Azure ya está listo para crearse. Usaremos una combinación de funcionalidad integrada y los detalles de sesión agregados de nuestra solución de aplicación de funciones.

  1. Vaya al recurso Virtual WAN y seleccione en Insightsen Monitor en el panel izquierdo. Seleccione Libros y, a continuación, seleccione + Nuevo. Screenshot shows first step in creation of Azure Workbook.

  2. Agregue la siguiente consulta al libro. Reemplace "SASURI" por el URI de SAS.

     let P2Svpnconnections = (externaldata (resource:string, UserNameVpnConnectionHealths: dynamic) [
         @"SASURI"
     ] with(format="multijson"));
    
     P2Svpnconnections
     | mv-expand UserNameVpnConnectionHealths
     | extend Username = parse_json(UserNameVpnConnectionHealths).UserName
     | extend VpnConnectionHealths = parse_json(parse_json(UserNameVpnConnectionHealths).VpnConnectionHealths)
     | mv-expand VpnConnectionHealths
     | extend VpnConnectionId = parse_json(VpnConnectionHealths).VpnConnectionId, VpnConnectionDuration = parse_json(VpnConnectionHealths).VpnConnectionDuration, VpnConnectionTime = parse_json(VpnConnectionHealths).VpnConnectionTime, PublicIpAddress = parse_json(VpnConnectionHealths).PublicIpAddress, PrivateIpAddress = parse_json(VpnConnectionHealths).PrivateIpAddress, MaxBandwidth = parse_json(VpnConnectionHealths).MaxBandwidth, EgressPacketsTransferred = parse_json(VpnConnectionHealths).EgressPacketsTransferred, EgressBytesTransferred = parse_json(VpnConnectionHealths).EgressBytesTransferred, IngressPacketsTransferred = parse_json(VpnConnectionHealths).IngressPacketsTransferred, IngressBytesTransferred = parse_json(VpnConnectionHealths).IngressBytesTransferred, MaxPacketsPerSecond = parse_json(VpnConnectionHealths).MaxPacketsPerSecond
     | extend PubIp = tostring(split(PublicIpAddress, ":").[0])
     | project Username, VpnConnectionId, VpnConnectionDuration, VpnConnectionTime, PubIp, PublicIpAddress, PrivateIpAddress, MaxBandwidth, EgressPacketsTransferred, EgressBytesTransferred, IngressPacketsTransferred, IngressBytesTransferred, MaxPacketsPerSecond;
    
    
  3. Para ver los resultados, seleccione el botón azul Ejecutar consulta para ver los resultados.

  4. Si ve el siguiente error, vuelva al archivo (vpnstatfile.json) en el blob del contenedor de almacenamiento y vuelva a generar la dirección URL de SAS. A continuación, pegue la dirección URL de SAS actualizada en la consulta.

    Screenshot shows error when running query in workbook.

  5. Guarde el libro para volver a él más adelante.

  6. Para las métricas siguientes, debe habilitar el registro de diagnóstico agregando la configuración de diagnóstico en Azure Portal. Rellene los campos necesarios para la suscripción y el grupo de recursos. En el tipo de recurso, escriba "microsoft.network/p2svpngateways". Agregue una configuración de diagnóstico (o edite la configuración de diagnóstico actual) para la puerta de enlace de punto a sitio que desea supervisar.

    Screenshot shows first Diagnostic settings page in Azure Monitor.

  7. Habilite allLogs y allMetrics y elija enviar al "área de trabajo de Log Analytics" como destino.

    Screenshot shows second Diagnostic settings page in Azure Monitor.

Consultas de ejemplo

En la sección siguiente se muestran consultas de registro de ejemplo para ejecutarse en el área de trabajo de Log Analytics.

Conexiones correctas de punto a sitio con IP

AzureDiagnostics
| where Category == "P2SDiagnosticLog" and Message has "Connection successful" and Message has "Username={UserName}"
| project splitted=split(Message, "Username=")
| mv-expand col1=splitted[0], col2=splitted[1], col3=splitted[2]
| project user=split(col2, " ")
| mv-expand username=user[0]
| project ['user']

Nota:

En algunas de estas consultas, los nombres de usuario pueden ofuscarse por motivos de privacidad.

Autenticación EAP (protocolo de autenticación extensible) correcta

AzureDiagnostics
| where Category == "P2SDiagnosticLog" and Message has "EAP authentication succeeded" and Message has "Username={UserName}"
| project Message, MessageFields = split(Message, " "), Userinfo = split (Message, "Username=")
| mv-expand MessageId=MessageFields[2], user=split(Userinfo[1]," ")
| project MessageId, Message, Userinfo[1]

Información de usuario de VPN de punto a sitio

AzureDiagnostics
| where Category == "P2SDiagnosticLog" and Message has "Username={UserName}"
| project Message, MessageFields = split(Message, " "), Userinfo = split (Message, "Username=")
| mv-expand MessageId=MessageFields[2], Username=Userinfo[1]
| project MessageId, Message, Username;

Conexiones correctas de VPN de punto a sitio por usuario

AzureDiagnostics
| where Category == "P2SDiagnosticLog" and Message has "Connection successful"
| project splitted=split(Message, "Username=")
| mv-expand col1=splitted[0], col2=splitted[1], col3=splitted[2]
| project user=split(col2, " ")
| mv-expand username=user[0]
| project-away ['user']
| summarize count() by tostring(username)
| sort by count_ desc

Conexiones VPN de punto a sitio

AzureDiagnostics
| where Category == "P2SDiagnosticLog"
| project TimeGenerated, OperationName, Message, Resource, ResourceGroup
| sort by TimeGenerated asc

Conexiones correctas VPN de punto a sitio

AzureDiagnostics
| where Category == "P2SDiagnosticLog" and Message has "Connection successful"
| project TimeGenerated, Resource, Message

Conexiones VPN de punto a sitio con error

AzureDiagnostics
| where Category == "P2SDiagnosticLog" and Message has "Connection failed"
| project TimeGenerated, Resource, Message

Número de conexiones VPN por P2SDiagnosticLog

AzureDiagnostics
| where Category == "P2SDiagnosticLog" and Message has "Connection successful" and Message has "Username={UserName}"| count

IKEDiagnosticLog

AzureDiagnostics
| where Category == "IKEDiagnosticLog"
| project TimeGenerated, OperationName, Message, Resource, ResourceGroup
| sort by TimeGenerated asc 

Detalles adicionales de diagnóstico de IKE

AzureDiagnostics
| where Category == "IKEDiagnosticLog"
| extend Message1=Message
| parse Message with * "Remote " RemoteIP ":" * "500: Local " LocalIP ":" * "500: " Message2
| extend Event = iif(Message has "SESSION_ID", Message2, Message1)
| project TimeGenerated, RemoteIP, LocalIP, Event, Level
| sort by TimeGenerated asc

Estadísticas de VPN de punto a sitio

AzureDiagnostics
| where Category == "P2SDiagnosticLog" and Message has "Statistics"
| project Message, MessageFields = split (Message, " ")
| mv-expand MessageId=MessageFields[2]
| project MessageId, Message;

Pasos siguientes

Para más información sobre las preguntas más frecuentes, consulte la página de preguntas frecuentes de Virtual WAN.