Tutorial: Implementación de Always On VPN: Configuración del perfil de Always On VPN para clientes de Windows 10+

Se aplica a: Windows Server 2022, Windows Server 2019, Windows Server 2016, Windows Server 2012 R2, Windows 10, Windows 11

En esta última parte del tutorial, aprenderá a utilizar un script de configuración ProfileXML de PowerShell para configurar los parámetros de Always On VPN y crear un túnel de usuario para las conexiones de los clientes.

Para obtener información más detallada sobre las opciones de configuración de VPN Always On para el proveedor de servicios de configuración (CSP), consulte Proveedor de servicios de configuración de VPNv2.

Requisitos previos

Completar Tutorial: Implementación de Always On VPN: Configuración de plantillas de autoridad de certificación.

Creación de un perfil de cliente de Always On VPN

En esta sección, crearemos una conexión de cliente VPN para verificar que el cliente VPN de prueba puede establecer una conexión VPN satisfactoria. Esto también nos permitirá crear la configuración de EAP para la exportación en la sección siguiente.

Para más información sobre los valores de EAP, consulte Configuración de EAP.

  1. Inicie sesión en el equipo cliente de VPN unido al dominio como el usuario de VPN que creó en Creación del usuario de prueba de Active Directory.

  2. En el menú Inicio, escriba VPN para seleccionar Configuración de VPN. Presione ENTRAR.

  3. En el panel de detalles, seleccione Agregar una conexión VPN.

  4. En Proveedor de VPN, seleccione Windows (integrado).

  5. En Nombre de conexión, escriba Contoso VPN.

  6. En Nombre o dirección del servidor, escriba el FQDN externo del servidor VPN (por ejemplo, vpn.contoso.com).

  7. En Tipo de VPN, seleccione IKEv2.

  8. En Tipo de información de inicio de sesión, seleccione Certificado.

  9. Seleccione Guardar.

  10. En Configuración relacionada, seleccione Cambiar opciones del adaptador.

  11. Haga clic con el botón derecho del ratón en Contoso VPN y seleccione Propiedades.

  12. En la pestaña Seguridad, para Cifrado de datos, seleccione Cifrado de máxima seguridad.

  13. Seleccione Usar Protocolo de autenticación extensible (EAP). Después, en Usar Protocolo de autenticación extensible (EAP), seleccione Microsoft: Protected EAP (PEAP) (cifrado activado).

  14. Seleccione Propiedades para abrir las Propiedades de Protected EAP y complete los siguientes pasos:

    1. En Conectar a estos servidores, escriba el nombre del servidor NPS.

    2. En Entidades de certificación raíz de confianza, seleccione la CA que emitió el certificado del servidor NPS (por ejemplo, contoso-CA).

    3. En Notificaciones antes de conectarse, seleccione No pedir al usuario que autorice nuevos servidores o CA de confianza.

    4. En Seleccionar método de autenticación, seleccione Tarjeta inteligente u otro certificado.

    5. Seleccione Configurar.

      1. Seleccione Usar un certificado en este equipo.

      2. En Conectar a estos servidores, escriba el nombre del servidor NPS.

      3. En Entidades de certificación raíz de confianza, seleccione la CA que emitió el certificado del servidor NPS.

      4. Seleccione No pedir al usuario que autorice nuevos servidores o autoridades de certificación de confianza.

      5. Seleccione Aceptar para cerrar las Propiedades de tarjeta inteligente u otros certificados.

      6. Seleccione Aceptar para cerrar las Propiedades de Protected EAP.

    6. Seleccione Aceptar para cerrar las Propiedades de Contoso VPN.

  15. Cierre la ventana Conexiones de red.

  16. En Configuración, seleccione Contoso VPN y después seleccione Conectar.

Importante

Asegúrese de que la conexión VPN de plantilla al servidor VPN se realiza correctamente. Esto garantiza que la configuración de EAP sea correcta antes de usarla en el siguiente paso. Debe conectarse al menos una vez antes de continuar; de lo contrario, el perfil no tendrá toda la información necesaria para conectarse a la VPN.

Configuración del cliente VPN de Windows

En esta sección, configurará manualmente el cliente VPN de Windows usando un script de PowerShell.

  1. Inicie sesión como usuario de VPN en el equipo cliente de VPN.

  2. Abra el entorno de scripting integrado (ISE) de Windows PowerShell como Administrador.

  3. Copie y pegue el siguiente script:

    
    # Define key VPN profile parameters
    # Replace with your own values
    
    $Domain = 'corp' # Name of the domain.
    
    $TemplateName = 'Contoso VPN' # Name of the test VPN connection you created in the tutorial. 
    
    $ProfileName = 'Contoso AlwaysOn VPN' # Name of the profile we are going to create.
    
    $Servers = 'aov-vpn.contoso.com' #Public or routable IP address or DNS name for the VPN gateway.
    
    $DnsSuffix = 'corp.contoso.com' # Specifies one or more commas separated DNS suffixes. 
    
    $DomainName = '.corp.contoso.com' #Used to indicate the namespace to which the policy applies. Contains `.` prefix.
    
    $DNSServers = '10.10.0.6' #List of comma-separated DNS Server IP addresses to use for the namespace.
    
    $TrustedNetwork = 'corp.contoso.com' #Comma-separated string to identify the trusted network.
    
    
    #Get the EAP settings for the current profile called $TemplateName
    
    $Connection = Get-VpnConnection -Name $TemplateName
    
    if(!$Connection)
    {
        $Message = "Unable to get $TemplateName connection profile: $_"
        Write-Host "$Message"
        exit
    }
    
    $EAPSettings= $Connection.EapConfigXmlStream.InnerXml
    
    $ProfileNameEscaped = $ProfileName -replace ' ', '%20'
    
    # Define ProfileXML
    $ProfileXML = @("
    <VPNProfile>
      <DnsSuffix>$DnsSuffix</DnsSuffix>
      <NativeProfile>
    <Servers>$Servers</Servers>
    <NativeProtocolType>IKEv2</NativeProtocolType>
    <Authentication>
      <UserMethod>Eap</UserMethod>
      <Eap>
        <Configuration>
        $EAPSettings
        </Configuration>
      </Eap>
    </Authentication>
    <RoutingPolicyType>SplitTunnel</RoutingPolicyType>
      </NativeProfile>
    <AlwaysOn>true</AlwaysOn>
    <RememberCredentials>true</RememberCredentials>
    <TrustedNetworkDetection>$TrustedNetwork</TrustedNetworkDetection>
      <DomainNameInformation>
    <DomainName>$DomainName</DomainName>
    <DnsServers>$DNSServers</DnsServers>
    </DomainNameInformation>
    </VPNProfile>
    ")
    
    #Output the XML for possible use in Intune
    $ProfileXML | Out-File -FilePath ($env:USERPROFILE + '\desktop\VPN_Profile.xml')
    
    # Escape special characters in the profile (<,>,")
    $ProfileXML = $ProfileXML -replace '<', '&lt;'
    $ProfileXML = $ProfileXML -replace '>', '&gt;'
    $ProfileXML = $ProfileXML -replace '"', '&quot;'
    
    # Define WMI-to-CSP Bridge properties
    $nodeCSPURI = "./Vendor/MSFT/VPNv2"
    $namespaceName = "root\cimv2\mdm\dmmap"
    $className = "MDM_VPNv2_01"
    
    try
    {
    
        # Determine user SID for VPN profile.
        $WmiLoggedOnUsers = (Get-WmiObject Win32_LoggedOnUser).Antecedent
        If($WmiLoggedOnUsers.Count -gt 1) { 
            $WmiLoggedOnUsers = $WmiLoggedOnUsers -match "Domain=""$Domain"""
        }
    
        $WmiUserValid = ($WmiLoggedOnUsers | Select-Object -Unique -First 1) -match 'Domain="([^"]+)",Name="([^"]+)"'
    
        If(-not $WmiUserValid){
            Throw "Returned object is not a valid WMI string"
        }
    
    
        $UserName = "$($Matches[1])\$($Matches[2])"
    
        $ObjUser = New-Object System.Security.Principal.NTAccount($UserName)
        $Sid = $ObjUser.Translate([System.Security.Principal.SecurityIdentifier])
        $SidValue = $Sid.Value
        $Message = "User SID is $SidValue."
    
        Write-Host "$Message"
    
    }
    catch [Exception] 
    {
    
        $Message = "Unable to get user SID. $_"
        Write-Host "$Message" 
        exit
    }
    
    try 
    {
        # Define WMI session.
        $session = New-CimSession
        $options = New-Object Microsoft.Management.Infrastructure.Options.CimOperationOptions
        $options.SetCustomOption("PolicyPlatformContext_PrincipalContext_Type", "PolicyPlatform_UserContext", $false)
        $options.SetCustomOption("PolicyPlatformContext_PrincipalContext_Id", "$SidValue", $false)
    
    }
    catch {
    
        $Message = "Unable to create new session for $ProfileName profile: $_"
        Write-Host $Message
        exit
    }
    
    try
    {
        #Detect and delete previous VPN profile.
        $deleteInstances = $session.EnumerateInstances($namespaceName, $className, $options)
    
        foreach ($deleteInstance in $deleteInstances)
        {
            $InstanceId = $deleteInstance.InstanceID
            if ("$InstanceId" -eq "$ProfileNameEscaped")
            {
                $session.DeleteInstance($namespaceName, $deleteInstance, $options)
                $Message = "Removed $ProfileName profile $InstanceId" 
                Write-Host "$Message"
            }
            else 
            {
                $Message = "Ignoring existing VPN profile $InstanceId"
                Write-Host "$Message"
            }
        }
    }
    catch [Exception]
    {
        $Message = "Unable to remove existing outdated instance(s) of $ProfileName profile: $_"
        Write-Host $Message
        exit
    
    }
    
    try
    {
        # Create the VPN profile.
        $newInstance = New-Object Microsoft.Management.Infrastructure.CimInstance $className, $namespaceName
        $property = [Microsoft.Management.Infrastructure.CimProperty]::Create("ParentID", "$nodeCSPURI", "String", "Key")
        $newInstance.CimInstanceProperties.Add($property)
        $property = [Microsoft.Management.Infrastructure.CimProperty]::Create("InstanceID", "$ProfileNameEscaped", "String", "Key")
        $newInstance.CimInstanceProperties.Add($property)
        $property = [Microsoft.Management.Infrastructure.CimProperty]::Create("ProfileXML", "$ProfileXML", "String", "Property")
        $newInstance.CimInstanceProperties.Add($property)
        $session.CreateInstance($namespaceName, $newInstance, $options)
    
        $Message = "Created $ProfileName profile."
        Write-Host "$Message"
    
    }
    catch [Exception]
    {
    
        $Message = "Unable to create $ProfileName profile: $_"
        Write-Host "$Message"
        exit
    }
    
    $Message = "Script Complete"
    Write-Host "$Message"
    
    
  4. Establezca el valor de las siguientes variables en la parte superior del script: $Domain, $TemplateName, $ProfileName, $Servers, $DnsSuffix, $DomainName y $DNSServers. Para obtener información más detallada sobre cómo establecer estos parámetros, consulte: VPNv2 CSP.

  5. Pulse ENTRAR para ejecutar el script.

  6. Compruebe que el script se ha ejecutado correctamente ejecutando el siguiente comando en el ISE de Windows PowerShell:

        Get-CimInstance -Namespace root\cimv2\mdm\dmmap -ClassName MDM_VPNv2_01
    
  7. Debería ver la siguiente salida (el valor ProfileXML se ha truncado para mejorar la legibilidad):

    
    AlwaysOn                : True
    ByPassForLocal          : 
    DeviceTunnel            : 
    DnsSuffix               : corp.contoso.com
    EdpModeId               : 
    InstanceID              : Contoso%20AlwaysOn%20VPN
    LockDown                : 
    ParentID                : ./Vendor/MSFT/VPNv2
    ProfileXML              : <VPNProfile>...</VPNProfile>
    RegisterDNS             : 
    RememberCredentials     : True
    TrustedNetworkDetection : corp.contoso.com
    PSComputerName          : 
    `
    

Ahora ha configurado el túnel de usuario para Always On VPN. Si quiere obtener información sobre cómo configurar un túnel de dispositivo, consulte Configuración de túneles de dispositivo VPN en el cliente de Windows.

Pasos siguientes