VPN 환경의 Teams 이벤트에 대한 특별 고려 사항
참고
이 문서는 원격 사용자를 위한 Microsoft 365 최적화를 다루는 문서 집합의 일부입니다.
- VPN 분할 터널링을 사용하여 원격 사용자를 위한 Microsoft 365 연결을 최적화하는 방법에 대한 개요는 개요: Microsoft 365용 VPN 분할 터널링을 참조하세요.
- VPN 분할 터널링을 구현하는 방법에 대한 자세한 지침은 Microsoft 365용 VPN 분할 터널링 구현을 참조하세요.
- VPN 분할 터널링 시나리오의 자세한 목록은 Microsoft 365에 대한 일반적인 VPN 분할 터널링 시나리오를 참조하세요.
- VPN 분할 터널링 환경에서 Teams 미디어 트래픽을 보호하는 방법에 대한 지침은 VPN 분할 터널링을 위한 Teams 미디어 트래픽 보안을 참조하세요.
- 중국 사용자의 Microsoft 365 전 세계 테넌트 성능을 최적화하는 방법에 대한 자세한 내용은 중국 사용자를 위한 Microsoft 365 성능 최적화를 참조하세요.
Microsoft Teams Live 이벤트 참석자 트래픽(Teams에서 생성한 라이브 이벤트에 참석자 및 Teams 또는 Viva Engage 통해 외부 인코더로 생성된 참석자 포함) 및 Microsoft Teams 타운 홀 참석자 트래픽은 현재 서비스의 URL/IP 목록에서기본 및 최적화로 분류됩니다. 이러한 엔드포인트는 다른 서비스에서도 사용할 수 있는 CDN에서 호스트되므로 기본값 으로 분류됩니다. 고객은 일반적으로 이러한 유형의 트래픽을 프록시하고 이와 같은 엔드포인트에서 일반적으로 수행되는 모든 보안 요소를 적용하는 것을 선호합니다.
많은 고객이 VPN 인프라를 통해 대용량 및 대기 시간에 민감한 트래픽을 라우팅하는 대신 로컬 인터넷 연결에서 직접 Teams 이벤트에 참석자를 연결하는 데 필요한 URL/IP 데이터를 요청했습니다. 일반적으로 Microsoft 365 엔드포인트에 대해 기본값으로 분류되지 않은 엔드포인트에 대한 전용 네임스페이스와 정확한 IP 정보가 모두 없으면 이 작업을 수행할 수 없습니다.
다음 단계를 사용하여 강제 터널 VPN을 사용하는 클라이언트의 Teams 이벤트에 대한 참석자 트래픽에 대한 직접 연결을 식별하고 사용하도록 설정합니다. 이 솔루션은 회사 홈 시나리오로 인해 네트워크 트래픽이 많은 동안 VPN을 통해 참석자 트래픽을 라우팅하지 않도록 고객에게 옵션을 제공하기 위한 것입니다. 가능하면 검사 프록시를 통해 서비스에 액세스하는 것이 좋습니다.
참고
이 솔루션을 사용하면 제공된 IP 주소로 resolve 않아 VPN을 트래버스하는 서비스 요소가 있을 수 있지만 스트리밍 데이터와 같은 대량의 대용량 트래픽이 있어야 합니다. 라이브 이벤트/Stream scope 외부에 다른 요소가 있을 수 있지만 직접 진행하기 전에 FQDN과 IP 일치를 모두 충족해야 하므로 제한해야 합니다.
중요
Teams 이벤트의 성능 향상보다 VPN을 우회하는 트래픽을 더 많이 보낼 위험을 감수하는 것이 좋습니다.
Teams 이벤트에 대한 강제 터널 예외를 구현하려면 다음 단계를 적용해야 합니다.
1. 외부 DNS 확인 구성
클라이언트는 다음 호스트 이름을 IP 주소로 확인할 수 있도록 외부 재귀 DNS 확인을 사용할 수 있어야 합니다.
상용 클라우드의 경우:
- *.media.azure.net
- *.bmc.cdn.office.net
- *.ml.cdn.office.net
*.media.azure.net 및 *.bmc.cdn.office.net Teams 클라이언트에서 예약된 Teams에서 만든 라이브 이벤트(빠른 시작 이벤트 및 RTMP-In 지원되는 이벤트)에 사용됩니다.
*.media.azure.net, *.bmc.cdn.office.net 및 *.ml.cdn.office.net Teams 타운 홀 이벤트에 사용됩니다.
참고
이러한 엔드포인트 중 일부는 Teams 이벤트 외부의 다른 요소와 공유됩니다. VPN 솔루션에서 기술적으로 가능하더라도(예: IP가 아닌 네임스페이스에서 작동하는 경우) 이러한 네임스페이스를 사용하여 VPN 오프로드를 구성하는 것은 권장되지 않습니다.
정부 클라우드(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 Microsoft 365 미국 정부 커뮤니티 클라우드(GCC)의 Teams 타운 홀 이벤트에 사용됩니다.
*.cdn.ml.gov.teams.microsoft.us Microsoft 365 미국 정부 GCC High Cloud(GCC High)의 Teams 타운 홀 이벤트에 사용됩니다.
*.cdn.ml.dod.teams.microsoft.us Microsoft 365 미국 정부 DoD 클라우드(DoD)의 Teams 타운 홀 이벤트에 사용됩니다.
FQDN은 VPN 구성에 필요하지 않으며, 관련 트래픽을 직접 보내기 위해 IP와 함께 PAC 파일에서 사용하기 위한 것입니다.
2. PAC 파일 변경 내용 구현(필요한 경우)
PAC 파일을 사용하여 VPN에 있는 동안 프록시를 통해 트래픽을 라우팅하는 조직의 경우 일반적으로 FQDN을 사용하여 수행됩니다. 그러나 Teams 이벤트와 함께 제공된 호스트 이름에는 Teams 이벤트 트래픽에만 사용되지 않는 CDN(Content Delivery Networks)에서 사용하는 IP 주소로 resolve 와일드카드가 포함됩니다. 따라서 요청이 DNS 와일드카드 일치에 따라 직접 전송되는 경우 이 문서의 뒷부분에 있는 3단계 에서 직접 경로를 통해 경로가 없으므로 이러한 엔드포인트에 대한 트래픽이 차단됩니다.
이 문제를 해결하기 위해 다음 IP를 제공하고 1단계에 설명된 대로 예제 PAC 파일의 호스트 이름과 함께 사용할 수 있습니다. PAC 파일은 URL이 Teams 이벤트에 사용되는 URL과 일치하는지 확인한 다음, DNS 조회에서 반환된 IP가 서비스에 대해 제공된 IP와 일치하는지 확인합니다. 둘 다 일치하면 트래픽이 직접 라우팅됩니다. 두 요소(FQDN/IP)가 일치하지 않으면 트래픽이 프록시로 전송됩니다. 따라서 구성은 IP 및 정의된 네임스페이스의 scope 외부의 IP로 확인되는 모든 항목이 VPN을 통해 정상적으로 프록시를 트래버스하도록 합니다.
CDN 엔드포인트의 현재 목록 수집
상업용 클라우드의 경우 Teams 이벤트는 여러 CDN 공급자를 사용하여 고객에게 스트리밍하여 최상의 적용 범위, 품질 및 복원력을 제공합니다. 현재 Microsoft의 Azure CDN과 Verizon의 Azure CDN이 모두 사용됩니다. 시간이 지남에 따라 지역 가용성과 같은 상황으로 인해 변경될 수 있습니다. 이 문서는 IP 범위를 최신 상태로 유지할 수 있는 원본입니다. Microsoft 365 미국 정부 클라우드(GCC, GCC High 및 DoD)의 경우 Microsoft의 Azure CDN만 사용됩니다.
상용 클라우드의 경우:
Microsoft의 Azure CDN의 경우 공식 Microsoft 다운로드 센터에서 Azure IP 범위 및 서비스 태그 - 퍼블릭 클라우드 다운로드에서 목록을 다운로드 할 수 있습니다. JSON의 서비스 태그
AzureFrontdoor.Frontend
를 구체적으로 확인해야 합니다. addressPrefixes 에는 IPv4/IPv6 서브넷이 표시됩니다. 시간이 지남에 따라 IP는 변경할 수 있지만 서비스 태그 목록은 사용되기 전에 항상 업데이트됩니다.Verizon(Edgecast)의 Azure CDN의 경우 Edge 노드 - 목록 ( 사용해 보기 선택)을 사용하여 전체 목록을 찾을 수 있습니다. Premium_Verizon 섹션을 구체적으로 확인해야 합니다. 이 API는 모든 Edgecast IP(원본 및 Anycast)를 표시합니다. 현재 API가 원본과 Anycast를 구분하는 메커니즘은 없습니다.
정부 클라우드(GCC, GCC High 및 DoD)의 경우:
- Microsoft의 Azure CDN의 경우 공식 Microsoft 다운로드 센터에서 Azure IP 범위 및 서비스 태그 - 미국 정부 클라우드 다운로드에서 목록을 다운로드할 수 있습니다. JSON의 서비스 태그
AzureFrontdoor.Frontend
를 구체적으로 확인해야 합니다. addressPrefixes 에는 IPv4/IPv6 서브넷이 표시됩니다. 시간이 지남에 따라 IP는 변경할 수 있지만 서비스 태그 목록은 사용되기 전에 항상 업데이트됩니다.
다음 스크립트는 Teams 이벤트 참석자 트래픽에 대한 네임스페이스 및 IP 목록을 포함하는 PAC 파일을 생성할 수 있습니다. -Instance 매개 변수는 지정된 환경을 결정합니다. 지원되는 값은 [Worldwide, USGov, USGovGCCHigh 및 UsGovDoD]입니다. 필요에 따라 스크립트에는 -Type 매개 변수를 사용하는 도메인 최적화 및 허용도 포함될 수 있습니다.
상용 클라우드에 대한 PAC 파일 생성 예제
다음은 상용 클라우드에 대한 PAC 파일을 생성하는 방법의 예입니다.
스크립트를 로컬 하드 디스크에 Get-EventsPacFile.ps1저장합니다.
Verizon URL로 이동하여 결과 JSON을 다운로드합니다(복사하여 cdnedgenodes.json 파일에 붙여넣기)
스크립트와 동일한 폴더에 파일을 넣습니다.
PowerShell 창에서 다음 명령을 실행합니다. 최적화 이름만 원하는 경우(최적화 및 허용이 아님) -Type 매개 변수를 최적화로 변경합니다.
.\Get-EventsPacFile.ps1 -Instance Worldwide -CdnEdgeNodesFilePath .\cdnedgenodes.json -Type OptimizeAndAllow -FilePath .\Commercial.pac
Commercial.pac 파일에는 Teams 이벤트 참석자 트래픽에 대한 모든 네임스페이스 및 IP(IPv4/IPv6)가 포함됩니다.
Microsoft 365 미국 정부 커뮤니티 클라우드(GCC)에 대한 PAC 파일 생성 예제
GCC 환경에 대한 PAC 파일을 생성하는 방법의 예는 다음과 같습니다.
스크립트를 로컬 하드 디스크에 Get-EventsPacFile.ps1저장합니다.
PowerShell 창에서 다음 명령을 실행합니다. 최적화 이름만 원하는 경우(최적화 및 허용이 아님) -Type 매개 변수를 최적화로 변경합니다.
.\Get-EventsPacFile.ps1 -Instance UsGov -Type OptimizeAndAllow -FilePath .\USGov.pac
USGov.pac 파일에는 Teams 타운 홀 참석자 트래픽에 대한 GCC 클라우드와 관련된 모든 네임스페이스 및 IP(IPv4/IPv6)가 포함됩니다.
Get-EventsPacFile.ps1
# Copyright (c) Microsoft Corporation. All rights reserved.
# Licensed under the MIT License.
<#PSScriptInfo
.VERSION 1.0.6
.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 -CdnEdgeNodesFilePath .\cdnedgenodes.json -Type OptimizeAndAllow -FilePath .\Commercial.pac
.EXAMPLE
Get-EventsPacFile.ps1 -Instance USGov -FilePath .\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,
[Parameter()]
[ValidateNotNullOrEmpty()]
[string] $CdnEdgeNodesFilePath
)
##################################################################################################################
### 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 = & {
if (!$Instance.StartsWith('USGov') -and ![string]::IsNullOrEmpty($CdnEdgeNodesFilePath) -and (Test-Path -Path $CdnEdgeNodesFilePath)) {
Get-Content -Path $CdnEdgeNodesFilePath -Raw -ErrorAction SilentlyContinue | ConvertFrom-Json | Select-Object -ExpandProperty value |
Where-Object { $_.name -eq 'Premium_Verizon' } | Select-Object -First 1 -ExpandProperty properties |
Select-Object -ExpandProperty ipAddressGroups |
ForEach-Object {
$_.ipv4Addresses
$_.ipv6Addresses
} |
Where-Object { $_.BaseIpAddress } |
ForEach-Object { $_.BaseIpAddress + '/' + $_.prefixLength }
}
$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
}
스크립트는 AzureFrontDoor.Frontend의 인스턴스 매개 변수 값과 키를 기반으로 적절한 Azure CDN 목록을 자동으로 구문 분석하므로 수동으로 가져올 필요가 없습니다.
다시 말하지만, FQDN만 사용하여 VPN 오프로드를 수행하지 않는 것이 좋습니다. 함수에서 FQDN과 IP 주소를 모두 활용하면 이 오프로드를 Teams 이벤트를 포함한 제한된 엔드포인트 집합으로 scope 데 도움이 됩니다. 함수를 구조화하면 클라이언트에서 직접 나열한 것과 일치하는 FQDN에 대한 DNS 조회가 수행됩니다. 즉, 나머지 네임스페이스의 DNS 확인은 변경되지 않은 상태로 유지됩니다.
3. 직접 송신을 사용하도록 VPN에서 라우팅 구성
마지막 단계는 현재 CDN 엔드포인트 목록을 VPN 구성에 수집에 설명된 Teams 이벤트 IP에 대한 직접 경로를 추가하여 트래픽이 강제 터널을 통해 VPN으로 전송되지 않도록 하는 것입니다. Microsoft 365 최적화 엔드포인트에 대해 이 작업을 수행하는 방법에 대한 자세한 내용은 Microsoft 365용 VPN 분할 터널링 구현의 VPN 분할 터널링 구현 섹션에서 찾을 수 있습니다. 이 프로세스는 이 문서에 나열된 Teams 이벤트 IP와 정확히 동일합니다.
참고
현재 CDN 엔드포인트 목록 수집의 IP(FQDN 아님)만 VPN 구성에 사용해야 합니다.
FAQ
그러면 모든 트래픽이 서비스에 직접 전송될까요?
아니요, 그러면 Teams 이벤트 참석자에 대한 대기 시간에 민감한 스트리밍 트래픽이 직접 전송되고, 게시된 IP에 resolve 않는 경우 다른 트래픽은 VPN 터널을 계속 사용합니다.
IPv6 주소를 사용해야 하나요?
아니요, 필요한 경우에만 IPv4로 연결할 수 있습니다.
이러한 IP가 Microsoft 365 URL/IP 서비스에 게시되지 않는 이유는 무엇인가요?
Microsoft는 고객이 이 정보를 안정적으로 사용하여 엔드포인트 범주에 따라 안전하고 최적의 라우팅을 구현할 수 있도록 서비스에 있는 정보의 형식과 유형을 엄격하게 제어합니다.
기본 엔드포인트 범주에는 여러 가지 이유로 제공되는 IP 정보가 없습니다(기본 엔드포인트가 Microsoft의 제어 범위를 벗어나거나, 너무 자주 변경되거나, 다른 요소와 공유되는 블록에 있을 수 있음). 이러한 이유로 기본 엔드포인트는 FQDN을 통해 일반 웹 트래픽과 같은 검사 프록시로 보내도록 설계되었습니다.
이 경우 위의 엔드포인트는 Teams 이벤트 이외의 비 Microsoft 제어 요소에서 사용할 수 있는 CDN이므로 트래픽 직접 전송은 이러한 IP로 확인되는 다른 모든 항목도 클라이언트에서 직접 전송됨을 의미합니다. 현재 글로벌 위기의 고유한 특성과 고객의 단기 요구 사항을 충족하기 위해 Microsoft는 고객이 적합할 때 사용할 수 있도록 위의 정보를 제공했습니다.
Microsoft는 Teams 이벤트 엔드포인트를 나중에 허용/최적화 엔드포인트 범주에 포함할 수 있도록 다시 구성하기 위해 노력하고 있습니다.
이러한 IP에 대한 액세스만 허용해야 하나요?
아니요, 서비스가 작동하려면 적절한 환경에 대해 모든 필수 표시된 엔드포인트에 액세스해야 합니다.
- GCC를 포함한 전 세계: 전 세계 엔드포인트
- Microsoft 365 미국 정부 GCC High: GCC High용 엔드포인트
- Microsoft 365 미국 정부 DoD: DoD용 엔드포인트
이 조언은 어떤 시나리오를 다룰 것인가?
- Teams 앱 내에서 생성된 라이브 이벤트
- 외부 디바이스(인코더) 생성 이벤트
- Teams 타운 홀
이 조언은 발표자 트래픽을 다루나요?
그렇지 않습니다. 위의 조언은 이벤트에 참석하는 사람들을 위한 것입니다. Teams 내에서 프레젠테이션하면 Microsoft 365용 VPN 분할 터널링 구현의 VPN 분할 터널링 구현 섹션에 설명된 자세한 VPN 오프로드 조언과 함께 URL/IP 서비스 행 11에 나열된 최적화 표시된 UDP 엔드포인트로 이동하는 발표자의 트래픽이 표시됩니다.
관련 문서
Microsoft 365에 대한 일반적인 VPN 분할 터널링 시나리오
VPN 분할 터널링을 위한 Teams 미디어 트래픽 보호
중국 사용자를 위한 Microsoft 365 성능 최적화
보안 전문가와 IT가 오늘날의 고유한 원격 작업 시나리오에서 최신 보안 제어를 달성할 수 있는 다른 방법(Microsoft 보안팀 블로그)
Microsoft에서 VPN 성능 향상: Windows 10 VPN 프로필을 사용하여 자동 연결 허용