Come monitorare le connessioni da punto a sito per rete WAN virtuale

Questa sezione illustra come creare una cartella di lavoro di Azure che mostra i dati pertinenti dei client VPN utente connessi ad Azure rete WAN virtuale.

Operazioni preliminari

Per completare i passaggi descritti in questo articolo, è necessario avere un rete WAN virtuale, un hub virtuale e un Gateway VPN utente. Per creare queste risorse, seguire la procedura descritta in questo articolo: Creare rete WAN virtuale, hub virtuale e un gateway

Architettura della soluzione cartella di lavoro

Screenshot shows workbook architecture.

Per configurare l'architettura precedente, si useranno i log VPN da punto a sito e il comando di PowerShell seguenti.

  • AzureDiagnostics: questi log vengono ricevuti creando un'impostazione di diagnostica per l'Gateway VPN utente e abilitando i log seguenti: GatewayDiagnosticLog, IKEDiagnosticLog, P2SDiagnosticLog e AllMetrics.

  • Get-AzP2sVpnGatewayDetailed Connessione ionHealth: si tratta di un comando di PowerShell (in esecuzione in un'app per le funzioni) per ottenere i dettagli delle sessioni attive. Questo comando supporta solo l'archiviazione dei dati in un account di archiviazione basato su una chiave di firma di accesso condiviso e fornisce dettagli aggiuntivi sulle connessioni VPN da sito a sito attive.

Creare un account di archiviazione di Azure e caricare BLOB

  1. Creare un account di archiviazione di Azure.
  2. Creare un contenitore e caricare un BLOB nel contenitore
    1. Il BLOB deve essere un file di testo vuoto con estensione json
    2. Quando si carica il BLOB, assegnare alla chiave dell'account le autorizzazioni seguenti: lettura, aggiunta, creazione e scrittura.
    3. Assicurarsi di copiare il token di firma di accesso condiviso BLOB e l'URL di firma di accesso condiviso BLOB in un percorso sicuro.

Creare un'app per le funzioni di Azure

  1. Creare un'app per le funzioni di Azure e selezionare PowerShell Core come stack di runtime

  2. Assegnare un'identità gestita assegnata dal sistema all'app per le funzioni

  3. Creare un'impostazione dell'applicazione con le 7 voci seguenti immettendo nome e valore e quindi selezionare OK dopo ogni valore.

    Name valore
    "resourcegroup" Il gruppo di risorse
    "sasuri" @Microsoft.KeyVault(SecretUri=https://\<keyvaultname>.vault.azure.net/secrets/sasuri/<version>)
    --> aggiornare di conseguenza dopo la creazione dell'insieme di credenziali delle chiavi nella sezione successiva.
    "sottoscrizione" ID sottoscrizione
    "tenantname" ID tenant
    "vpngw" Questo nome è simile <a guid-eastus-ps2-gw>. È possibile ottenerlo dalle impostazioni VPN utente dell'hub vWAN.
  4. Creare una funzione attivata dal timer

  5. Selezionare Codice e test nel pannello sinistro e digitare il codice seguente nel file run.ps1 . Seleziona Salva.

    # 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. Tornare alla pagina App per le funzioni e selezionare servizio app Editor nel pannello sinistro in Strumenti di sviluppo. Selezionare quindi Vai -->.

  7. Passare a requirements.psd1 e rimuovere il commento dalla riga che inizia con 'Az'... come illustrato.

    Screenshot showing the requirements file for function app.

  8. Affinché il comando get-AzP2sVpnGatewayDetailed Connessione ionHealth abbia esito positivo, è necessario disporre delle autorizzazioni appropriate per le informazioni. Passare al gruppo di risorse e scegliere "Controllo di accesso (IAM)" nel pannello sinistro. Corrisponde alla gestione delle identità e degli accessi. Assegnare l'accesso in lettura FunctionApp al gruppo di risorse.

Creare un Azure Key Vault

  1. Creare Azure Key Vault.

    1. Per Modello di autorizzazione selezionare Criteri di accesso dell'insieme di credenziali.
    2. Lasciare disabilitate le opzioni in Accesso alle risorse.
    3. In Criteri di accesso selezionare + Crea.

    Screenshot shows first screen in creating access policy.

    1. Selezionare Avanti per passare alla scheda Entità . Digitare il nome dell'app per le funzioni e selezionarlo.
    2. Selezionare Avanti due volte per passare alla quarta scheda: Rivedi e crea e seleziona Crea nella parte inferiore.
    3. Il criterio di accesso appena creato dovrebbe essere visualizzato nella sezione Criteri di accesso . La modifica dei valori predefiniti nella scheda Rete è facoltativa, quindi selezionare Rivedi e crea nell'angolo in basso a sinistra.
  2. Passare a Segreti in Oggetti nel pannello sinistro della risorsa dell'insieme di credenziali delle chiavi. Selezionare + Genera/Importa e aggiungere il segreto come segue:

    • Nome: sasuri
    • value: <SASURI>
    • Abilitato: Sì
  3. Tornare alla scheda Configurazione per l'app per le funzioni e modificare la voce seguente. Il valore proviene dal campo Identificatore segreto visualizzato dopo aver fatto clic sul segreto:

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

Creare una cartella di lavoro di Azure

La cartella di lavoro di Azure è ora pronta per la creazione. Verrà usata una combinazione di funzionalità predefinite e i dettagli della sessione aggiunti dalla soluzione dell'app per le funzioni.

  1. Passare alla risorsa rete WAN virtuale e selezionare Informazioni dettagliate in Monitoraggio nel pannello a sinistra. Selezionare Cartelle di lavoro e quindi + Nuovo. Screenshot shows first step in creation of Azure Workbook.

  2. Aggiungere la query seguente nella cartella di lavoro. Sostituire "SASURI" con l'URI di firma di accesso condiviso.

     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. Per visualizzare i risultati, selezionare il pulsante blu Esegui query per visualizzare i risultati.

  4. Se viene visualizzato l'errore seguente, tornare al file (vpnstatfile.json) nel BLOB del contenitore di archiviazione e rigenerare l'URL della firma di accesso condiviso. Incollare quindi l'URL di firma di accesso condiviso aggiornato nella query.

    Screenshot shows error when running query in workbook.

  5. Salvare la cartella di lavoro per tornare al file in un secondo momento.

  6. Per le metriche seguenti, è necessario abilitare la registrazione diagnostica aggiungendo le impostazioni di diagnostica in portale di Azure. Compilare i campi obbligatori per la sottoscrizione e il gruppo di risorse. Per il tipo di risorsa digitare "microsoft.network/p2svpngateways". Aggiungere un'impostazione di diagnostica (o modificare l'impostazione di diagnostica corrente) per il gateway da punto a sito da monitorare.

    Screenshot shows first Diagnostic settings page in Azure Monitor.

  7. Abilitare allLogs e allMetrics e scegliere di inviare all'area di lavoro Log Analytics come destinazione.

    Screenshot shows second Diagnostic settings page in Azure Monitor.

Query di esempio

La sezione seguente illustra le query di log di esempio da eseguire nell'area di lavoro Log Analytics.

Connessioni da sito a sito con esito positivo 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

Per alcune di queste query, i nomi utente potrebbero essere offuscati a causa di motivi di privacy.

Autenticazione EAP (Extensible Authentication Protocol) completata

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]

Informazioni utente VPN da sito a sito

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;

Connessioni VPN da sito a sito riuscite per utente

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

Connessioni VPN da sito a sito

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

Connessioni VPN da sito a sito riuscite

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

Connessioni VPN da sito a sito non riuscite

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

Numero di connessioni VPN per 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 

Altri dettagli di diagnostica 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

Statistiche VPN da sito a sito

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

Passaggi successivi

Per altre informazioni sulle domande frequenti, vedere la pagina rete WAN virtuale domande frequenti.