Sdílet prostřednictvím


Zvláštní aspekty událostí Teams v prostředích VPN

Poznámka

Tento článek je součástí sady článků, které se týkají optimalizace Microsoftu 365 pro vzdálené uživatele.

Přenosy účastníků událostí Microsoft Teams Live (to zahrnuje účastníky živých událostí vytvořených aplikací Teams a těch, které se vytvářejí pomocí externího kodéru prostřednictvím Aplikace Teams nebo Viva Engage) a provoz účastníků na radnici Microsoft Teams je v současné době v seznamu adres URL/IP adres služby kategorizován jako výchozí a optimalizovaný. Tyto koncové body jsou kategorizovány jako Výchozí , protože jsou hostované ve sítích CDN, které můžou používat i jiné služby. Zákazníci obvykle dávají přednost proxy tomuto typu provozu a používají všechny prvky zabezpečení, které se obvykle provádějí na koncových bodech, jako jsou tyto.

Mnoho zákazníků požádalo o data adres URL/IP potřebná k připojení účastníků událostí Teams přímo z místního připojení k internetu, a ne ke směrování provozu s vysokým objemem a latencí přes infrastrukturu SÍTĚ VPN. Obvykle to není možné bez vyhrazených oborů názvů a přesných informací o IP adresách koncových bodů, které nejsou k dispozici pro koncové body Microsoft 365 kategorizované jako Výchozí.

Pomocí následujících kroků identifikujte a povolte přímé připojení pro přenosy účastníků pro události Teams z klientů, kteří používají vynucenou tunelovou síť VPN. Cílem tohoto řešení je poskytnout zákazníkům možnost vyhnout se směrování provozu účastníků přes SÍŤ VPN, když je v důsledku scénářů práce z domova vysoký síťový provoz. Pokud je to možné, doporučujeme přistupovat ke službě přes kontrolující proxy server.

Poznámka

Při použití tohoto řešení můžou existovat prvky služby, které se nepřeloží na zadané IP adresy, a proto procházejí sítí VPN, ale velká část provozu s velkým objemem, jako jsou streamovaná data, by měla. Můžou existovat další prvky mimo rozsah živých událostí nebo Stream, které se tímto přesměrováním zatížení zachytí, ale tyto prvky by měly být omezené, protože před přímým přístupem musí splňovat plně kvalifikovaný název domény i shodu IP adres.

Důležité

Doporučujeme zvážit riziko odesílání většího množství provozu, které obchází síť VPN, než zvýšení výkonu událostí Teams.

Pokud chcete implementovat výjimku vynuceného tunelu pro události Teams, měli byste použít následující kroky:

1. Konfigurace externího překladu DNS

Klienti potřebují externí rekurzivní překlad DNS, aby bylo možné přeložit následující názvy hostitelů na IP adresy.

Pro komerční cloud:

  • *.media.azure.net
  • *.bmc.cdn.office.net
  • *.ml.cdn.office.net

*.media.azure.net a *.bmc.cdn.office.net se používají pro živé události vytvořené v Teams (události rychlého startu a RTMP-In podporované události) naplánované z klienta Teams.

*.media.azure.net, *.bmc.cdn.office.net a *.ml.cdn.office.net se používají pro události na radnici Teams.

Poznámka

Některé z těchto koncových bodů se sdílí s dalšími prvky mimo události Teams.

Pro cloudy pro státní správu(GCC, GCC High, DoD):

  • *.cdn.ml.gcc.teams.microsoft.com
  • *.cdn.ml.gov.teams.microsoft.us
  • *.cdn.ml.dod.teams.microsoft.us

*.cdn.ml.gcc.teams.microsoft.com se používá pro události na radnici Teams v Microsoft 365 U.S. Government Community Cloud (GCC).

*.cdn.ml.gov.teams.microsoft.us se používá pro události na radnici Teams v Microsoft 365 U.S. Government GCC High Cloud (GCC High).

*.cdn.ml.dod.teams.microsoft.us se používá pro události na radnici Teams v Microsoft 365 U.S. Government DoD Cloud (DoD).

2. Implementace změn souboru PAC (v případě potřeby)

V organizacích, které využívají soubor PAC ke směrování provozu přes proxy server v síti VPN, se toho obvykle dosahuje pomocí plně kvalifikovaných názvů domén. U událostí Teams ale zadané názvy hostitelů obsahují zástupné cardy, které se přeloží na IP adresy používané sítěmi pro doručování obsahu (CDN), které se nepoužívají výhradně pro přenosy událostí Teams. Proto pokud se požadavek odešle přímo na základě samotné shody zástupných znaků DNS, provoz do těchto koncových bodů může být blokovaný, pokud neexistuje žádná trasa přes přímou cestu pro něj v kroku 3 dále v tomto článku.

K vyřešení tohoto problému můžeme poskytnout následující IP adresy a použít je v kombinaci s názvy hostitelů v ukázkovém souboru PAC, jak je popsáno v kroku 1. Soubor PAC zkontroluje, jestli adresa URL odpovídá adresám použitým pro události Teams, a pokud ano, zkontroluje také, jestli IP adresa vrácená z vyhledávání DNS odpovídá ip adrese poskytnuté pro službu. Pokud se obě shodují, provoz se směruje přímo. Pokud se některý z prvků (plně kvalifikovaný název domény nebo IP adresa) neshoduje, provoz se odešle na proxy server. V důsledku toho konfigurace zajistí, že vše, co se přeloží na IP adresu mimo rozsah IP adresy i definované obory názvů, bude procházet proxy serverem přes síť VPN jako obvykle.

Shromažďování aktuálních seznamů koncových bodů CDN

V případě komerčních cloudů a cloudů Microsoft 365 PRO státní správu USA (GCC, GCC High a DoD) používají teams události Azure CDN od Microsoftu. Časem se to může změnit v důsledku situace, jako je regionální dostupnost. Tento článek obsahuje požadované obory názvů pro události Teams a pokyny pro odpovídající použité rozsahy IP adres (pokud jsou k dispozici).

Pro komerční cloud:

Pro cloudy pro státní správu(GCC, GCC High a DoD):

Následující skript může vygenerovat soubor PAC, který bude obsahovat obory názvů a výpisy IP adres pro přenos účastníků událostí Teams. Parametr -Instance určuje zadané prostředí – podporované hodnoty jsou [Worldwide, USGov, USGovGCCHigh a UsGovDoD]. Volitelně může skript obsahovat také domény Optimize a Allow a také pomocí parametru -Type .

Příklad generování souborů PAC pro komerční cloud

Tady je příklad vygenerování souboru PAC pro komerční cloud:

  1. Uložte skript na místní pevný disk jako Get-EventsPacFile.ps1.

  2. V okně PowerShellu spusťte následující příkaz. Pokud chcete pouze názvy Optimize (a ne Optimize a Allow), změňte parametr -Type na OptimizeOnly.

    .\Get-EventsPacFile.ps1 -Instance Worldwide -Type OptimizeAndAllow -FilePath .\Commercial.pac
    
  3. Soubor Commercial.pac bude obsahovat všechny obory názvů a IP adresy (IPv4/IPv6) dostupné pro přenos účastníků událostí Teams.

Příklad generování souborů PAC pro Microsoft 365 U.S. Government Community Cloud (GCC)

Tady je příklad, jak vygenerovat soubor PAC pro prostředí GCC:

  1. Uložte skript na místní pevný disk jako Get-EventsPacFile.ps1.

  2. V okně PowerShellu spusťte následující příkaz. Pokud chcete pouze názvy Optimize (a ne Optimize a Allow), změňte parametr -Type na OptimizeOnly.

    .\Get-EventsPacFile.ps1 -Instance UsGov -Type OptimizeAndAllow -FilePath .\USGov.pac
    
  3. Soubor USGov.pac bude obsahovat všechny obory názvů a IP adresy (IPv4/IPv6) specifické pro cloud GCC pro provoz účastníků na radnici Teams.

Get-EventsPacFile.ps1
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.

<#PSScriptInfo

.VERSION 1.0.7

.AUTHOR Microsoft Corporation

.GUID 7f692977-e76c-4582-97d5-9989850a2529

.COMPANYNAME Microsoft

.COPYRIGHT
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the MIT License.

.TAGS PAC Microsoft Microsoft365 365

.LICENSEURI

.PROJECTURI http://aka.ms/ipurlws

.ICONURI

.EXTERNALMODULEDEPENDENCIES

.REQUIREDSCRIPTS

.EXTERNALSCRIPTDEPENDENCIES

.RELEASENOTES

#>

<#

.SYNOPSIS

Create a PAC file for Microsoft 365 prioritized connectivity for Teams Events (Live Events, Town hall)

.DESCRIPTION

This script will access updated information to create a PAC file to prioritize Microsoft 365 Urls for
better access to the service. This script will allow you to create different types of files depending
on how traffic needs to be prioritized.

.PARAMETER Instance

The service instance inside Microsoft 365. The default is Worldwide. To specify GCC use the USGov value.

.PARAMETER ClientRequestId

The client request id to connect to the web service to query up to date Urls.

.PARAMETER DirectProxySettings

The direct proxy settings for priority traffic.

.PARAMETER DefaultProxySettings

The default proxy settings for non priority traffic.

.PARAMETER Type

The type of prioritization to give. Valid values are Optimize and OptimizeAndAllow, which are 2 different modes of operation.
These values align to the categories defined in our Principles of Network Connectivity at https://aka.ms/pnc

.PARAMETER Lowercase

Flag this to include lowercase transformation into the PAC file for the host name matching.

.PARAMETER TenantName

The tenant name to replace wildcard Urls in the webservice.

.PARAMETER ServiceAreas

The service areas to filter endpoints by in the webservice.

.PARAMETER FilePath

The file to print the content to.

.EXAMPLE

Get-EventsPacFile.ps1 -Instance Worldwide -Type OptimizeOnly -FilePath .\PACFiles\Commercial.pac 

.EXAMPLE

Get-EventsPacFile.ps1 -Instance USGov -FilePath .\PACFiles\USGov.pac -Type OptimizeAndAllow


#>

#Requires -Version 2

[CmdletBinding(SupportsShouldProcess = $True)]
Param (
    [Parameter()]
    [ValidateSet('Worldwide', 'Germany', 'China', 'USGovDoD', 'USGovGCCHigh', 'USGov')]
    [String] $Instance = "Worldwide",

    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [guid] $ClientRequestId = [Guid]::NewGuid(),

    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [String] $DirectProxySettings = 'DIRECT',

    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [String] $DefaultProxySettings = 'PROXY 10.10.10.10:8080',

    [Parameter()]
    [ValidateSet('OptimizeOnly','OptimizeAndAllow')]
    [string]
    $Type = 'OptimizeOnly',

    [Parameter()]
    [switch] $Lowercase,

    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string] $TenantName,

    [Parameter()]
    [ValidateSet('Exchange', 'SharePoint', 'Common', 'Skype')]
    [string[]] $ServiceAreas,

    [Parameter()]
    [ValidateNotNullOrEmpty()]
    [string] $FilePath

)

##################################################################################################################
### Global constants
##################################################################################################################

$baseServiceUrl = if ($Instance -eq 'USGov') {
    "https://endpoints.office.com/endpoints/Worldwide/?ClientRequestId=$ClientRequestId"
} else {
    "https://endpoints.office.com/endpoints/$Instance/?ClientRequestId=$ClientRequestId"
}
$directProxyVarName = "direct"
$defaultProxyVarName = "proxyServer"

##################################################################################################################
### Functions to create PAC files
##################################################################################################################

function Get-PacString {
    param(
        [Parameter(ValueFromPipelineByPropertyName)]
        [string[]]
        $NonDirectOverrideFqdns,

        [Parameter(ValueFromPipelineByPropertyName)]
        [string[]]
        $DirectFqdns
    )

    $PACSb = New-Object 'System.Text.StringBuilder'
    $null = & {
        $PACSb.AppendLine('// This PAC file will provide proxy config to Microsoft 365 services')
        $PACSb.AppendLine('// using data from the public web service for all endpoints')
        $PACSb.AppendLine('function FindProxyForURL(url, host)')
        $PACSb.AppendLine('{')
        $PACSb.Append('    var ').Append($directProxyVarName).Append(' = "').Append($DirectProxySettings).AppendLine('";')
        $PACSb.Append('    var ').Append($defaultProxyVarName).Append(' = "').Append($DefaultProxySettings).AppendLine('";')
        if ($Lowercase) {
            $PACSb.AppendLine('    host = host.toLowerCase();')
        }
        $first = $true
        foreach ($fqdn in $NonDirectOverrideFqdns) {
            if ($first) {
                $PACSb.AppendLine()
                $PACSb.AppendLine('    // Force proxy for subdomains of bypassed hosts')
                $PACSb.AppendLine()
                $PACSb.Append('    if(')
            }
            else {
                $PACSb.AppendLine().Append('            || ')
            }
            $first = $false
            $PACSb.Append('shExpMatch(host, "').Append($fqdn).Append('")')
        }
        if (!$first) {
            $PACSb.AppendLine(')')
            $PACSb.AppendLine('    {')
            $PACSb.Append('        return ').Append($directProxyVarName).AppendLine(';')
            $PACSb.AppendLine('    }')
        }

        $first = $true
        foreach ($fqdn in $DirectFqdns) {
            if ($first) {
                $PACSb.AppendLine()
                $PACSb.AppendLine('    // Bypassed hosts')
                $PACSb.AppendLine()
                $PACSb.Append('    if(')
            }
            else {
                $PACSb.AppendLine().Append('            || ')
            }
            $first = $false
            $PACSb.Append('shExpMatch(host, "').Append($fqdn).Append('")')
        }
        if (!$first) {
            $PACSb.AppendLine(')')
            $PACSb.AppendLine('    {')
            $PACSb.Append('        return ').Append($directProxyVarName).AppendLine(';')
            $PACSb.AppendLine('    }')
        }

        if (!$ServiceAreas -or $ServiceAreas.Contains('Skype')) {
            $EventsConfig = Get-TeamsEventsConfiguration
            if ($EventsConfig.EventsAddressRanges.Count -gt 0) {
                $EventsBlock = $EventsConfig | Get-TLEPacConfiguration
                $PACSb.AppendLine()
                $PACSb.AppendLine($EventsBlock)
            }
        }

        $PACSb.Append('    return ').Append($defaultProxyVarName).AppendLine(';').Append('}')
    }

    return $PACSb.ToString()
}

##################################################################################################################
### Functions to get and filter endpoints
##################################################################################################################
function Get-TeamsEventsConfiguration {
    param()
    $IncludedHosts = switch ($Instance) {
        'USGov' {
            @('*.cdn.ml.gcc.teams.microsoft.com')
            break
        }
        'USGovDoD' {
            @('*.cdn.ml.dod.teams.microsoft.us')
            break
        }
        'USGovGCCHigh' {
            @('*.cdn.ml.gov.teams.microsoft.us')
            break
        }
        default {
            @('*.bmc.cdn.office.net', '*.ml.cdn.office.net', '*.media.azure.net')
            break
        }
    }
    $IncludedAddressRanges = & {
        $ServiceTagsDownloadId = '56519'
        if ($Instance.StartsWith('USGov')) {
            $ServiceTagsDownloadId = '57063'
        }
        $AzureIPsUrl = Invoke-WebRequest -Uri "https://www.microsoft.com/en-us/download/confirmation.aspx?id=$ServiceTagsDownloadId" -UseBasicParsing -ErrorAction SilentlyContinue |
            Select-Object -ExpandProperty Links | Select-Object -ExpandProperty href |
            Where-Object { $_.EndsWith('.json') -and $_ -match 'ServiceTags' } | Select-Object -First 1
        if ($AzureIPsUrl) {
            Invoke-RestMethod -Uri $AzureIPsUrl -ErrorAction SilentlyContinue | Select-Object -ExpandProperty values |
                Where-Object { $_.name -eq 'AzureFrontDoor.Frontend' } | Select-Object -First 1 -ExpandProperty properties |
                Select-Object -ExpandProperty addressPrefixes
        }
    }
    [PSCustomObject]@{
        EventsHostNames = $IncludedHosts
        EventsAddressRanges = $IncludedAddressRanges
    }
}

function Get-TLEPacConfiguration {
    [CmdletBinding()]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string[]]
        $EventsHostNames,

        [Parameter(ValueFromPipelineByPropertyName)]
        [string[]]
        $EventsAddressRanges
    )
    if ($EventsAddressRanges.Count -eq 0) {
        return ''
    }
    $TLESb = New-Object 'System.Text.StringBuilder'
    $Spaces = '    '
    $null = $TLESb.Append($Spaces).AppendLine('// Bypass Teams Events attendee traffic')
    $first = $true
    $null = foreach ($hostName in $EventsHostNames) {
        if ($first) {
            $TLESb.AppendLine().Append($Spaces).Append('if(')
        }
        else {
            $TLESb.AppendLine().Append($Spaces).Append('    || ')
        }
        $first = $false
        $TLESb.Append('shExpMatch(host, "').Append($hostName).Append('")')
    }
    $null = $TLESb.AppendLine(')').Append($Spaces).AppendLine('{')
    $Spaces = $Spaces + $Spaces
    $null = $TLESb.Append($Spaces).AppendLine('var resolved_ip = dnsResolveEx(host);')

    $first = $true
    $null = foreach ($addressRange in $EventsAddressRanges) {
        if ($first) {
            $TLESb.AppendLine().Append($Spaces).Append('if(')
        } else {
            $TLESb.AppendLine().Append($Spaces).Append('    || ')
        }
        $first = $false
        $TLESb.Append('isInNetEx(resolved_ip, "').Append($addressRange).Append('")')
    }
    if (!$first) {
        $null = $TLESb.AppendLine(')').
            Append($Spaces).AppendLine('{').
            Append($Spaces).Append('    return ').Append($directProxyVarName).AppendLine(';').
            Append($Spaces).AppendLine('}')
    }
    else {
        $null = $TLESb.Append($Spaces).AppendLine('// no addresses found for service via script')
    }
    return $TLESb.AppendLine('    }').ToString()
}

function Get-Endpoints {
    $url = $baseServiceUrl
    if ($TenantName) {
        $url += "&TenantName=$TenantName"
    }
    if ($ServiceAreas) {
        $url += "&ServiceAreas=" + ($ServiceAreas -Join ",")
    }
    return Invoke-RestMethod -Uri $url
}

function Get-MapVarUrls {
    Write-Verbose "Retrieving all endpoints for instance $Instance from web service."
    $Endpoints = Get-Endpoints

    $Include = if ($Type -eq 'OptimizeOnly') { @('Optimize') } else { @('Optimize', 'Allow') }

    $directUrls = $endpoints |
        Where-Object { $_.category -in $Include } |
        Where-Object { $_.urls } |
        ForEach-Object { $_.urls } |
        Sort-Object -Unique

    $MatchList = [Collections.Generic.Dictionary[string,Regex]]@{}
    $directUrls |
        Where-Object { $_.Contains('*') -or $_.Contains('?') } |
        ForEach-Object { $MatchList[$_] = [Regex]::new('^{0}$' -f $_.Replace('.','\.').Replace('*','.*').Replace('?','.?'),[Text.RegularExpressions.RegexOptions]::IgnoreCase) }

    $nonDirectPriorityUrls = $endpoints |
        Where-Object { $_.category -notin $Include } |
        Where-Object { $_.urls } |
        ForEach-Object { $_.urls } |
        Sort-Object -Unique |
        Where-Object { [Linq.Enumerable]::Any($MatchList,[Func[System.Collections.Generic.KeyValuePair[string,Regex],bool]]{$args[0].Key -ne $_ -and $args[0].Value.IsMatch($_)}) }

    return [PSCustomObject]@{
        NonDirectOverrideFqdns = $nonDirectPriorityUrls
        DirectFqdns = $directUrls
    }
}

##################################################################################################################
### Main script
##################################################################################################################

$content = Get-MapVarUrls | Get-PacString

if ($FilePath) {
    $content | Out-File -FilePath $FilePath -Encoding ascii
}
else {
    $content
}

Skript automaticky parsuje příslušný seznam Azure CDN na základě hodnoty parametru instance a klíčů z AzureFrontDoor.Frontend, takže není potřeba je získávat ručně.

Provádění snižování zátěže SÍTĚ VPN s využitím plně kvalifikovaných názvů domén a IP adres (pokud jsou ve funkci k dispozici) pomáhá omezit použití tohoto přesměrování zatížení na omezenou sadu koncových bodů, včetně událostí Teams. Způsob, jakým je funkce strukturovaná, způsobí, že se pro plně kvalifikovaný název domény provede vyhledávání DNS, které odpovídá názvům uvedeným přímo klientem, to znamená, že překlad DNS zbývajících oborů názvů zůstane nezměněný. V případě komerčního cloudu nejsou k dispozici všechny IP adresy. Snižování zátěže VPN by se muselo spoléhat na odpovídající obory názvů definované dříve v tomto článku.

3. Nakonfigurujte směrování na síti VPN, abyste umožnili přímý výchozí přenos dat.

Posledním krokem je přidání přímé trasy pro IP adresy událostí (nebo obory názvů) Teams popsané v tématu Shromažďování aktuálních seznamů koncových bodů CDN do konfigurace SÍTĚ VPN, aby se zajistilo, že se provoz neodesílá prostřednictvím vynuceného tunelu do sítě VPN. Podrobné informace o tom, jak to provést u koncových bodů Optimalizace Microsoftu 365, najdete v části Implementace rozděleného tunelového propojení VPN v tématu Implementace rozděleného tunelového propojení VPN pro Microsoft 365. Proces je úplně stejný pro IP adresy událostí Teams uvedené v tomto dokumentu.

Časté otázky

Bude se tím veškerý provoz odesílat přímo do služby?

Ne, tím se přímo odešle přenosy streamování citlivé na latenci a potenciálně velký objem streamovaných přenosů účastníků události Teams. Všechny ostatní přenosy budou dál používat tunel VPN, pokud se nepřeloží na publikované IP adresy nebo se neshodují s definovaným oborem názvů.

Musím používat adresy IPv6?

Ne, připojení může být IPv4 pouze v případě potřeby.

Proč se tyto IP adresy nepublikují ve službě Microsoft 365 URL/IP?

Microsoft má přísné kontroly týkající se formátu a typu informací, které jsou ve službě, aby zajistily, že zákazníci můžou informace spolehlivě používat k implementaci zabezpečeného a optimálního směrování na základě kategorie koncových bodů.

Kategorie Výchozí koncový bod neobsahuje žádné informace o IP adrese z mnoha důvodů (výchozí koncové body můžou být mimo kontrolu Microsoftu, můžou se příliš často měnit nebo se můžou nacházet v blocích sdílených s jinými prvky). Výchozí koncové body jsou navržené tak, aby se prostřednictvím plně kvalifikovaného názvu domény odesílaly na kontrolující proxy server, jako je běžný webový provoz.

Musím povolit přístup pouze k těmto IP adresám nebo oborům názvů?

Ne, přístup ke všem požadovaným označeným koncovým bodům pro příslušné prostředí je pro provoz služby nezbytný.

K jakým scénářům se bude toto doporučení vztahovat?

  1. Živé události vytvořené v aplikaci Teams
  2. Kodér Teams produkoval živé události
  3. Teams Radnice

Týká se tato rada provozu prezentujícího?

Není to tak; výše uvedené doporučení je výhradně pro ty, kteří se události účastní. Při prezentaci z aplikace Teams uvidíte přenosy prezentujícího do koncových bodů UDP s označením Optimalizace uvedených na řádku 11 služby URL/IP s podrobnými pokyny ke snižování zátěže VPN v části Implementace rozděleného tunelového propojení VPNv tématu Implementace rozděleného tunelového propojení VPN pro Microsoft 365.

Přehled: Dělené tunelové propojení VPN pro Microsoft 365

Implementace rozděleného tunelového propojení VPN pro Microsoft 365

Běžné scénáře rozděleného tunelového propojení VPN pro Microsoft 365

Zabezpečení přenosů médií v Teams pro dělené tunelování VPN

Optimalizace výkonu Microsoftu 365 pro uživatele v Číně

Principy síťového připojení Microsoftu 365

Vyhodnocování síťového připojení Microsoft 365

Ladění sítě a výkonu Microsoftu 365

Alternativní způsoby, jak odborníci na zabezpečení a IT dosáhnout moderních kontrolních mechanismů zabezpečení v dnešních jedinečných scénářích práce na dálku (blog týmu Microsoft Security Team)

Zvýšení výkonu sítě VPN v Microsoftu: Povolení automatických připojení pomocí profilů Windows 10 VPN

Provoz na SÍTI VPN: Jak Microsoft udržuje své vzdálené pracovníky ve spojení

Globální síť Microsoftu