Del via


Spesielle hensyn for Teams-hendelser i VPN-miljøer

Obs!

Denne artikkelen er en del av et sett med artikler som tar for seg Microsoft 365-optimalisering for eksterne brukere.

Deltakertrafikk for Microsoft Teams Live-arrangementer (dette inkluderer deltakere til Teams-produserte direktesendte arrangementer og de som produseres med en ekstern koder via Teams eller Viva Engage), og deltakertrafikken i Microsoft Teams rådhus kategoriseres for øyeblikket som standard kontra optimaliser i nettadressen/IP-listen for tjenesten. Disse endepunktene er kategorisert som standard fordi de driftes på CDN-er som også kan brukes av andre tjenester. Kunder foretrekker vanligvis å proxy denne typen trafikk og bruke eventuelle sikkerhetselementer som vanligvis gjøres på endepunkter som disse.

Mange kunder har bedt om nettadresse/IP-data som er nødvendige for å koble til deltakerne i Teams-arrangementer direkte fra den lokale Internett-tilkoblingen, i stedet for å rute trafikk med høyt volum og ventetid via VPN-infrastrukturen. Dette er vanligvis ikke mulig uten både dedikerte navneområder og nøyaktig IP-informasjon for endepunktene, som ikke er angitt for Microsoft 365-endepunkter kategorisert som standard.

Bruk følgende fremgangsmåte for å identifisere og aktivere direkte tilkobling for deltakertrafikk for Teams-hendelser fra klienter som bruker en tvungen tunnel-VPN. Denne løsningen er ment å gi kundene et alternativ for å unngå ruting av deltakertrafikk over VPN, mens det er høy nettverkstrafikk på grunn av jobb-fra-hjem-scenarier. Hvis det er mulig, anbefaler vi at du får tilgang til tjenesten gjennom en kontrollproxy.

Obs!

Ved hjelp av denne løsningen kan det være tjenesteelementer som ikke løses til IP-adressene som er angitt, og dermed krysser VPN, men mesteparten av trafikk med høyt volum som strømming av data bør. Det kan være andre elementer utenfor omfanget av direktesendte arrangementer/Stream som fanges opp av denne avlastningen, men disse bør begrenses ettersom de må oppfylle både FQDN og IP-samsvaret før de går direkte.

Viktig

Vi anbefaler at du veier risikoen for å sende mer trafikk som omgår VPN over ytelsesgevinsten for Teams-hendelser.

Hvis du vil implementere det tvangstunnelunntaket for Teams-hendelser, bør følgende trinn brukes:

1. Konfigurere ekstern DNS-oppløsning

Klienter må ha ekstern, rekursiv DNS-oppløsning for å være tilgjengelig, slik at følgende vertsnavn kan løses til IP-adresser.

For den kommersielle skyen:

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

*.media.azure.net og *.bmc.cdn.office.net brukes til Teams-produserte direktesendte arrangementer (hurtigstarthendelser og RTMP-In støttede hendelser) som er planlagt fra Teams-klienten.

*.media.azure.net, *.bmc.cdn.office.net og *.ml.cdn.office.net brukes til Teams rådhusarrangementer.

Obs!

Noen av disse endepunktene deles med andre elementer utenfor Teams-hendelser.

For offentlige skyer (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 brukes til Teams rådhusarrangementer i Microsoft 365 U.S. Government Community Cloud (GCC).

*.cdn.ml.gov.teams.microsoft.us brukes til Teams rådhusarrangementer i Microsoft 365 U.S. Government GCC High Cloud (GCC High).

*.cdn.ml.dod.teams.microsoft.us brukes til Teams rådhusarrangementer i Microsoft 365 U.S. Government DoD Cloud (DoD).

2. Implementer PAC-filendringer (der det er nødvendig)

For organisasjoner som bruker en PAC-fil til å rute trafikk gjennom en proxy mens de er på VPN, oppnås dette vanligvis ved hjelp av FQDN-er. Men med Teams-hendelser inneholder vertsnavnene jokertegn som løses til IP-adresser som brukes av Innholdsleveringsnettverk (CDN-er), som ikke brukes utelukkende for Teams-hendelsestrafikk. Hvis forespørselen sendes direkte basert bare på DNS-jokertegn, kan trafikk til disse endepunktene blokkeres hvis det ikke er noen rute via direktebanen for den i trinn 3 senere i denne artikkelen.

For å løse dette kan vi gi følgende IP-er og bruke dem i kombinasjon med vertsnavnene i et eksempel på EN PAC-fil, som beskrevet i trinn 1. PAC-filen kontrollerer om nettadressen samsvarer med de som brukes for Teams-hendelser, og hvis den gjør det, kontrollerer den også om IP-adressen som returneres fra et DNS-oppslag samsvarer med de som er angitt for tjenesten. Hvis begge samsvarer, rutes trafikken direkte. Hvis et av elementene (FQDN/IP) ikke samsvarer, sendes trafikken til proxyen. Som et resultat sikrer konfigurasjonen at alt som løses til en IP utenfor omfanget av både IP- og definerte navneområder, krysser proxyen via VPN som normalt.

Samle inn gjeldende lister over CDN-endepunkter

Teams-hendelser for kommersielle skyer og Microsoft 365 US Government-skyer (GCC, GCC High og DoD) bruker Azure CDN fra Microsoft. Over tid kan dette endres på grunn av situasjoner som regional tilgjengelighet. Denne artikkelen inneholder de nødvendige navneområdene for Teams-hendelser og veiledning for tilsvarende IP-adresseområder som brukes (der det er tilgjengelig).

For den kommersielle skyen:

For offentlige skyer (GCC, GCC High og DoD):

Følgende skript kan generere en PAC-fil som inkluderer navneområder og IP-oppføringer for deltakertrafikken for Teams Events. -Instance-parameteren bestemmer det angitte miljøet – de støttede verdiene er [Worldwide, USGov, USGovGCCHigh og UsGovDoD]. Skriptet kan også inkludere Domeneoptimalisering og Tillat domener i tillegg til å bruke -Type-parameteren .

Eksempel på PAC-filgenerering for den kommersielle skyen

Her er et eksempel på hvordan du genererer PAC-filen for den kommersielle skyen:

  1. Lagre skriptet på den lokale harddisken som Get-EventsPacFile.ps1.

  2. Kjør følgende kommando i et PowerShell-vindu. Hvis du bare ønsker optimaliser navn (og ikke optimaliser og tillat), endrer du -Type-parameteren til OptimizeOnly.

    .\Get-EventsPacFile.ps1 -Instance Worldwide -Type OptimizeAndAllow -FilePath .\Commercial.pac
    
  3. Commercial.pac-filen vil inneholde alle navneområder og IPv4/IPv6-filer som er tilgjengelige for deltakertrafikk for Teams Events.

Eksempel på generering av PAC-fil for Microsoft 365 U.S. Government Community Cloud (GCC)

Her er et eksempel på hvordan du genererer PAC-filen for GCC-miljøet:

  1. Lagre skriptet på den lokale harddisken som Get-EventsPacFile.ps1.

  2. Kjør følgende kommando i et PowerShell-vindu. Hvis du bare ønsker optimaliser navn (og ikke optimaliser og tillat), endrer du -Type-parameteren til OptimizeOnly.

    .\Get-EventsPacFile.ps1 -Instance UsGov -Type OptimizeAndAllow -FilePath .\USGov.pac
    
  3. USGov.pac-filen vil inneholde alle navneområdene og IPv4/IPv6-filene som er spesifikke for GCC-skyen for teams rådhusdeltakertrafikk.

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
}

Skriptet analyserer automatisk den aktuelle Azure CDN-listen basert på forekomstparameterverdien og nøklene fra AzureFrontDoor.Frontend, så det er ikke nødvendig å hente dette manuelt.

Å utføre VPN-avlastning ved hjelp av både FQDN-er og IP-adressene (der angitt) i funksjonen bidrar til å begrense bruken av denne avlastningen til et begrenset sett med endepunkter, inkludert Teams-hendelser. Måten funksjonen er strukturert på, fører til at et DNS-oppslag gjøres for FQDN som samsvarer med de som er oppført av klienten direkte, det vil eksempelvis være DNS-oppløsningen til de gjenværende navneområdene uendret. Når det gjelder den kommersielle skyen, er ikke alle IP-adresser angitt. VPN-avlastning må være avhengig av samsvar mellom navneområdene som er definert tidligere i denne artikkelen.

3. Konfigurer ruting på VPN for å aktivere direkte utgående trafikk

Det siste trinnet er å legge til en direkte rute for Teams-hendelses-IP-er (eller navneområder) som er beskrevet i Innsamling av gjeldende lister over CDN-endepunkter i VPN-konfigurasjonen for å sikre at trafikken ikke sendes via tvungen tunnel inn i VPN. Du finner detaljert informasjon om hvordan du gjør dette for Microsoft 365 Optimize-endepunkter i delen Implementer VPN-delt tunnelering i implementering av VPN-delt tunnelering for Microsoft 365. Prosessen er nøyaktig den samme for IP-ene for Teams-hendelser som er oppført i dette dokumentet.

Vanlige spørsmål

Vil dette sende all trafikken min til tjenesten direkte?

Nei, dette vil sende den ventetidssensitive, potensielt volumvolumerte strømmetrafikken for en Teams Event-deltaker direkte, all annen trafikk vil fortsette å bruke VPN-tunnelen hvis de ikke løser til IP-ene som er publisert, eller samsvarer med det definerte navneområdet.

Må jeg bruke IPv6-adressene?

Nei, tilkoblingen kan bare være IPv4 om nødvendig.

Hvorfor publiseres ikke disse IP-adressene i URL-/IP-tjenesten for Microsoft 365?

Microsoft har strenge kontroller rundt formatet og typen informasjon som finnes i tjenesten, for å sikre at kundene på en pålitelig måte kan bruke informasjonen til å implementere sikker og optimal ruting basert på endepunktkategorien.

Standard endepunktkategori har ingen IP-informasjon angitt av flere årsaker (standard endepunkter kan være utenfor Microsofts kontroll, kan endres for ofte eller være i blokker som deles med andre elementer). Standard endepunkter er utformet for å sendes via FQDN til en undersøkende proxy, for eksempel vanlig nettrafikk.

Trenger jeg bare å gi tilgang til disse IP-ene/navneområdene?

Nei, tilgang til alle de obligatoriske merkede endepunktene for det aktuelle miljøet er avgjørende for at tjenesten skal fungere.

Hvilke scenarier vil dette rådet dekke?

  1. Direktesendte arrangementer produsert i Teams-appen
  2. Teams-koder produserte direktesendte arrangementer
  3. Teams rådhus

Dekker dette rådet presentatørtrafikk?

Det gjør den ikke; det foregående rådet er utelukkende for de som deltar på arrangementet. Presenting from within Teams will see the presenter's traffic flowing to the Optimize market UDP endpoints listed in URL/IP service row 11 with detailed VPN offload advice outlined in the Implement VPN split tunneling section of Implementing VPN split tunneling for Microsoft 365.

Oversikt: VPN-delt tunnelering for Microsoft 365

Implementere VPN-delt tunnelering for Microsoft 365

Vanlige scenarioer for delt VPN-tunnelering for Microsoft 365

Sikre Teams-medietrafikk for VPN-delt tunnelering

Ytelsesoptimalisering for Microsoft 365 for Kina-brukere

Prinsipper for nettverkstilkobling for Microsoft 365

Vurdering av Nettverkstilkobling for Microsoft 365

Nettverksjustering og ytelsesjustering for Microsoft 365

Alternative måter sikkerhetseksperter og IT-eksperter kan oppnå moderne sikkerhetskontroller på i dagens unike scenarier for eksternt arbeid (Microsoft Security Team-blogg)

Forbedre VPN-ytelsen hos Microsoft: bruke Windows 10 VPN-profiler til å tillate automatisk på-tilkoblinger

Kjører på VPN: Slik holder Microsoft sin eksterne arbeidsstyrke tilkoblet

Microsofts globale nettverk