VPN 環境での Stream イベントと Teams イベントに関する特別な考慮事項

注:

この記事は、リモート ユーザー向けの Microsoft 365 の最適化に対処する一連の記事の一部です。

Microsoft 365 ライブ イベントの出席者トラフィック (Teams で生成されたライブ イベントへの出席者と、Teams、Stream、または Viva Engage を介して外部エンコーダーを使用して生成されたものが含まれます)、Microsoft Teams タウン ホールの出席者トラフィックとオンデマンド ストリーム出席者トラフィックは、現在、サービスの URL/IP リスト既定最適化に分類されています。 これらのエンドポイントは、他のサービスで使用される可能性がある CDN でホストされるため、 既定 として分類されます。 お客様は通常、この種類のトラフィックをプロキシし、このようなエンドポイントで通常実行されるセキュリティ要素を適用することを好みます。

多くのお客様は、VPN インフラストラクチャを介して大量の遅延に敏感なトラフィックをルーティングするのではなく、出席者をローカル インターネット接続から Stream または Teams イベントに直接接続するために必要な URL/IP データを求めています。 通常、これは、専用の名前空間とエンドポイントの正確な IP 情報の両方なしでは実現できません。これは、 既定として分類された Microsoft 365 エンドポイントには提供されません。

強制トンネル VPN を使用して、クライアントから Stream または Teams イベント サービスの直接接続を有効にするには、次の手順を使用します。 このソリューションは、職場のシナリオによりネットワーク トラフィックが多い間に、VPN 経由でイベント出席者のトラフィックをルーティングしないようにするためのオプションを顧客に提供することを目的としています。 可能であれば、検査プロキシを使用してサービスにアクセスすることをお勧めします。

注:

このソリューションを使用すると、提供された IP アドレスに解決されず、VPN を経由するサービス要素が存在する可能性がありますが、ストリーミング データのような大量のトラフィックの大部分が必要です。 このオフロードによってキャッチされるライブ イベント/ストリームの範囲外には他の要素が存在する可能性がありますが、直接実行する前に FQDN IP の両方の一致を満たす必要があるため、これらを制限する必要があります。

重要

ライブ イベントのパフォーマンス向上に対して VPN をバイパスするトラフィックを増やすリスクを検討することをお勧めします。

Teams イベントとストリームの強制トンネル例外を実装するには、次の手順を適用する必要があります。

1. 外部 DNS 解決を構成する

クライアントでは、次のホスト名を IP アドレスに解決できるように、外部の再帰 DNS 解決を使用できる必要があります。

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

*.azureedge.net は Stream イベントに使用されます (Microsoft Stream でのライブ ストリーミング用にエンコーダーを構成する - Microsoft Stream |Microsoft Docs)。

*.media.azure.net*.bmc.cdn.office.net は、Teams クライアントからスケジュールされた Teams で生成されるライブ イベント (クイック スタート イベントとサポートされているイベント RTMP-In) に使用されます。

*.media.azure.net*.bmc.cdn.office.net*.ml.cdn.office.net は Teams タウン ホール イベントに使用されます。

これらのエンドポイントの一部は、Stream または Teams イベント以外の他の要素と共有されます。 VPN ソリューションで技術的に可能な場合 (たとえば、IP ではなく FQDN で動作する場合) でも、これらの FQDN を使用して VPN オフロードを構成することはお勧めしません。

FQDN は VPN 構成では必要ありません。これは、関連するトラフィックを直接送信するために、IP と組み合わせて PAC ファイルで使用するために純粋に使用されます。

2. PAC ファイルの変更を実装する (必要な場合)

VPN 上で PAC ファイルを使用してプロキシ経由でトラフィックをルーティングする組織の場合、これは通常 FQDN を使用して実現されます。 ただし、Stream/Live Events/Town hall では、指定されたホスト名に *.azureedge.net などのワイルドカードが含まれます。これには、完全な IP リストを提供できないその他の要素も含まれます。 したがって、DNS ワイルドカードの一致に基づいて要求が直接送信される場合、この記事の 後半の手順 3 のダイレクト パス経由のルートがないため、これらのエンドポイントへのトラフィックはブロックされます。

これを解決するために、次の IP を提供し、 手順 1 で説明されているように PAC ファイルの例のホスト名と組み合わせて使用できます。 PAC ファイルは、URL が Stream/Live Events/Town Hall で使用されているものと一致するかどうかを確認し、その URL が使用されている場合は、DNS 参照から返された IP がサービスに提供されているものと一致するかどうかを確認します。 両方が一致する場合、トラフィックは直接ルーティングされます。 いずれかの要素 (FQDN/IP) が一致しない場合、トラフィックはプロキシに送信されます。 その結果、構成により、IP と定義された名前空間の両方のスコープ外の IP に解決されるすべてのものが、通常どおり VPN 経由でプロキシを通過します。

CDN エンドポイントの現在の一覧を収集する

Teams イベントでは、複数の CDN プロバイダーを使用して顧客にストリーミングし、最適なカバレッジ、品質、回復性を提供します。 現時点では、Microsoft と Verizon の両方の Azure CDN が使用されています。 時間の経過と同時に、リージョンの可用性などの状況により、これが変更される可能性があります。 この記事は、IP 範囲を最新の状態に保つためのソースです。

Microsoft の Azure CDN の場合は、[ Azure IP 範囲とサービス タグのダウンロード ] から一覧をダウンロードできます 。公式の Microsoft ダウンロード センターからパブリック クラウド - JSON のサービス タグ AzureFrontdoor.Frontend を具体的に探す必要があります。 addressPrefixes には、IPv4/IPv6 サブネットが表示されます。 時間の経過とともに IP は変更される可能性がありますが、サービス タグの一覧は常に更新されてから使用されます。

Azure CDN from Verizon (Edgecast) では、 Edge ノード - リスト ( [試してみる ] を選択) を使用して包括的な一覧を見つけることができます。 Premium_Verizon セクションを具体的に確認する必要があります。 この API には、すべての Edgecast IP (配信元と Anycast) が表示されることに注意してください。 現時点では、API が配信元と Anycast を区別するメカニズムはありません。

これを PAC ファイルに実装するには、次の例を使用して、FQDN 経由で Microsoft 365 Optimize トラフィック ダイレクト (推奨されるベスト プラクティス) と、FQDN と返された IP アドレスの組み合わせを介して重要な Stream/Live Events トラフィック ダイレクトを送信します。 Contoso というプレースホルダー名を、 contoso が contoso.onmicrosoft.com から取得した 特定のテナントの名前に編集する必要があります。

PAC ファイルの例

PAC ファイルを生成する方法の例を次に示します。

  1. 次のスクリプトをGet-TLEPacFile.ps1としてローカル ハード ディスク 保存します。

  2. Verizon URL に移動し、結果の JSON をダウンロードします (cdnedgenodes.json のようなファイルにコピーして貼り付けます)

  3. スクリプトと同じフォルダーにファイルを配置します。

  4. PowerShell ウィンドウで、次のコマンドを実行します。 SPO URL が必要な場合は、他の何かのテナント名を変更します。 これはタイプ 2 であるため、 最適化許可 (タイプ 1 は最適化のみ)。

    .\Get-TLEPacFile.ps1 -Instance Worldwide -Type 2 -TenantName <contoso> -CdnEdgeNodesFilePath .\cdnedgenodes.json -FilePath TLE.pac
    
  5. TLE.pac ファイルには、すべての名前空間と IP (IPv4/IPv6) が含まれます。

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

<#PSScriptInfo

.VERSION 1.0.5

.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

.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.

.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 1 and 2, which are 2 different modes of operation.
Type 1 will send Optimize traffic to the direct route. Type 2 will send Optimize and Allow traffic to
the direct route.

.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-TLEPacFile.ps1 -ClientRequestId b10c5ed1-bad1-445f-b386-b919946339a7 -DefaultProxySettings "PROXY 4.4.4.4:70" -FilePath type1.pac

.EXAMPLE

Get-TLEPacFile.ps1 -ClientRequestId b10c5ed1-bad1-445f-b386-b919946339a7 -Instance China -Type 2 -DefaultProxySettings "PROXY 4.4.4.4:70" -FilePath type2.pac

.EXAMPLE

Get-TLEPacFile.ps1 -ClientRequestId b10c5ed1-bad1-445f-b386-b919946339a7 -Instance WorldWide -Lowercase -TenantName tenantName -ServiceAreas Sharepoint

#>

#Requires -Version 2

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

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

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

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

    [Parameter(Mandatory = $false)]
    [ValidateRange(1, 2)]
    [int] $Type = 1,

    [Parameter(Mandatory = $false)]
    [switch] $Lowercase = $false,

    [Parameter(Mandatory = $false)]
    [ValidateNotNullOrEmpty()]
    [string] $TenantName,

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

    [Parameter(Mandatory = $false)]
    [ValidateNotNullOrEmpty()]
    [string] $FilePath,

    [Parameter(Mandatory = $false)]
    [ValidateNotNullOrEmpty()]
    [string] $CdnEdgeNodesFilePath
)

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

$baseServiceUrl = "https://endpoints.office.com/endpoints/$Instance/?ClientRequestId={$ClientRequestId}"
$directProxyVarName = "direct"
$defaultProxyVarName = "proxyServer"
$bl = "`r`n"

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

function Get-PacClauses
{
    param(
        [Parameter(Mandatory = $false)]
        [string[]] $Urls,

        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [String] $ReturnVarName
    )

    if (!$Urls)
    {
        return ""
    }

    $clauses =  (($Urls | ForEach-Object { "shExpMatch(host, `"$_`")" }) -Join "$bl        || ")

@"
    if($clauses)
    {
        return $ReturnVarName;
    }
"@
}

function Get-PacString
{
    param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [array[]] $MapVarUrls
    )

@"
// This PAC file will provide proxy config to Microsoft 365 services
//  using data from the public web service for all endpoints
function FindProxyForURL(url, host)
{
    var $directProxyVarName = "$DirectProxySettings";
    var $defaultProxyVarName = "$DefaultProxySettings";

$( if ($Lowercase) { "    host = host.toLowerCase();" })

$( ($MapVarUrls | ForEach-Object { Get-PACClauses -ReturnVarName $_.Item1 -Urls $_.Item2 }) -Join "$bl$bl" )

$( if (!$ServiceAreas -or $ServiceAreas.Contains('Skype')) { Get-TLEPacConfiguration })

    return $defaultProxyVarName;
}
"@ -replace "($bl){3,}","$bl$bl" # Collapse more than one blank line in the PAC file so it looks better.
}

##################################################################################################################
### Functions to get and filter endpoints
##################################################################################################################

function Get-TLEPacConfiguration {
    param ()
    $PreBlock = @"
    // Don't Proxy Teams Live Events traffic

    if(shExpMatch(host, "*.azureedge.net")
    || shExpMatch(host, "*.bmc.cdn.office.net")
    || shExpMatch(host, "*.ml.cdn.office.net")
    || shExpMatch(host, "*.media.azure.net"))
    {
        var resolved_ip = dnsResolveEx(host);

"@
    $TLESb = New-Object 'System.Text.StringBuilder'
    $TLESb.Append($PreBlock) | Out-Null

    if (![string]::IsNullOrEmpty($CdnEdgeNodesFilePath) -and (Test-Path -Path $CdnEdgeNodesFilePath)) {
        $CdnData = 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
        $CdnData | Select-Object -ExpandProperty ipv4Addresses | ForEach-Object {
            if ($TLESb.Length -eq $PreBlock.Length) {
                $TLESb.Append("        if(") | Out-Null
            }
            else {
                $TLESb.AppendLine() | Out-Null
                $TLESb.Append("        || ") | Out-Null
            }
            $TLESb.Append("isInNetEx(resolved_ip, `"$($_.BaseIpAddress)/$($_.prefixLength)`")") | Out-Null
        }
        $CdnData | Select-Object -ExpandProperty ipv6Addresses | ForEach-Object {
            if ($TLESb.Length -eq $PreBlock.Length) {
                $TLESb.Append("        if(") | Out-Null
            }
            else {
                $TLESb.AppendLine() | Out-Null
                $TLESb.Append("        || ") | Out-Null
            }
            $TLESb.Append("isInNetEx(resolved_ip, `"$($_.BaseIpAddress)/$($_.prefixLength)`")") | Out-Null
        }
    }
    $AzureIPsUrl = Invoke-WebRequest -Uri "https://www.microsoft.com/en-us/download/confirmation.aspx?id=56519" -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 | ForEach-Object {
                if ($TLESb.Length -eq $PreBlock.Length) {
                    $TLESb.Append("        if(") | Out-Null
                }
                else {
                    $TLESb.AppendLine() | Out-Null
                    $TLESb.Append("        || ") | Out-Null
                }
                $TLESb.Append("isInNetEx(resolved_ip, `"$_`")") | Out-Null
            }
    }
    if ($TLESb.Length -gt $PreBlock.Length) {
        $TLESb.AppendLine(")") | Out-Null
        $TLESb.AppendLine("        {") | Out-Null
        $TLESb.AppendLine("            return $directProxyVarName;") | Out-Null
        $TLESb.AppendLine("        }") | Out-Null
    }
    else {
        $TLESb.AppendLine("        // no addresses found for service via script") | Out-Null
    }
    $TLESb.AppendLine("    }") | Out-Null
    return $TLESb.ToString()
}

function Get-Regex
{
    param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string] $Fqdn
    )

    return "^" + $Fqdn.Replace(".", "\.").Replace("*", ".*").Replace("?", ".?") + "$"
}

function Match-RegexList
{
    param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string] $ToMatch,

        [Parameter(Mandatory = $false)]
        [string[]] $MatchList
    )

    if (!$MatchList)
    {
        return $false
    }
    foreach ($regex in $MatchList)
    {
        if ($regex -ne $ToMatch -and $ToMatch -match (Get-Regex $regex))
        {
            return $true
        }
    }
    return $false
}

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

function Get-Urls
{
    param(
        [Parameter(Mandatory = $false)]
        [psobject[]] $Endpoints
    )

    if ($Endpoints)
    {
        return $Endpoints | Where-Object { $_.urls } | ForEach-Object { $_.urls } | Sort-Object -Unique
    }
    return @()
}

function Get-UrlVarTuple
{
    param(
        [Parameter(Mandatory = $true)]
        [ValidateNotNullOrEmpty()]
        [string] $VarName,

        [Parameter(Mandatory = $false)]
        [string[]] $Urls
    )
    return New-Object 'Tuple[string,string[]]'($VarName, $Urls)
}

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

    if ($Type -eq 1)
    {
        $directUrls = Get-Urls ($Endpoints | Where-Object { $_.category -eq "Optimize" })
        $nonDirectPriorityUrls = Get-Urls ($Endpoints | Where-Object { $_.category -ne "Optimize" }) | Where-Object { Match-RegexList $_ $directUrls }
        return @(
            Get-UrlVarTuple -VarName $defaultProxyVarName -Urls $nonDirectPriorityUrls
            Get-UrlVarTuple -VarName $directProxyVarName -Urls $directUrls
        )
    }
    elseif ($Type -eq 2)
    {
        $directUrls = Get-Urls ($Endpoints | Where-Object { $_.category -in @("Optimize", "Allow")})
        $nonDirectPriorityUrls = Get-Urls ($Endpoints | Where-Object { $_.category -notin @("Optimize", "Allow") }) | Where-Object { Match-RegexList $_ $directUrls }
        return @(
            Get-UrlVarTuple -VarName $defaultProxyVarName -Urls $nonDirectPriorityUrls
            Get-UrlVarTuple -VarName $directProxyVarName -Urls $directUrls
        )
    }
}

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

$content = Get-PacString (Get-MapVarUrls)

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

このスクリプトでは、AzureFrontDoor.Frontendダウンロード URL とキーに基づいて Azure リストが自動的に解析されるため、手動で取得する必要はありません。

ここでも、FQDN のみを使用して VPN オフロードを実行することはお勧めしません。関数で FQDN と IP アドレスの 両方 を使用すると、このオフロードの使用を、ライブ イベント/ストリームを含む限られたエンドポイント セットにスコープを設定するのに役立ちます。 関数の構造化方法により、クライアントによって直接一覧表示されるものと一致する FQDN に対して DNS 参照が実行されます。つまり、残りの名前空間の DNS 解決は変更されません。

Teams イベントと Stream に関連しないエンドポイントをオフロードするリスクを制限する場合は、すべての Azure CDN 顧客に使用される共有ドメインであるため、このリスクの大部分が存在する構成から *.azureedge.net ドメインを削除できます。 この欠点は、Stream を搭載した外部エンコーダーを使用するイベントは最適化されませんが、Teams 内で生成または編成されるイベントは最適化されません。

3. 直接エグレスを有効にするように VPN のルーティングを構成する

最後の手順では、「 CDN エンドポイントの現在のリスト を VPN 構成に収集する」で説明されている Teams イベント IP の直接ルートを追加して、トラフィックが強制トンネル経由で VPN に送信されないようにします。 Microsoft 365 の最適化エンドポイントに対してこれを行う方法の詳細については、「Microsoft 365 の VPN 分割トンネリングの実装」の「VPN 分割トンネリング実装」セクションを参照してください。 このプロセスは、このドキュメントに記載されている Stream イベントまたは Teams イベント IP でまったく同じです。

VPN 構成には、 CDN エンドポイントの現在のリストを収集している IP (FQDN ではなく) のみを使用する必要があることに注意してください。

FAQ

これにより、すべてのトラフィックがサービスに直接送信されますか?

いいえ。これにより、Teams イベントまたは Stream ビデオ ダイレクトの待機時間に依存するストリーミング トラフィックが送信されます。公開された IP に解決されない場合、他のトラフィックは引き続き VPN トンネルを使用します。

IPv6 アドレスを使用する必要がありますか?

いいえ。接続は、必要な場合にのみ IPv4 にすることができます。

これらの IP が Microsoft 365 URL/IP サービスで公開されないのはなぜですか?

Microsoft では、お客様が情報を確実に使用してエンドポイント カテゴリに基づいて安全で最適なルーティングを実装できるように、サービス内の情報の形式と種類を厳密に制御しています。

[既定のエンドポイント] カテゴリには、さまざまな理由で IP 情報が提供されていません (既定のエンドポイントは Microsoft の制御の外にある可能性があります。変更頻度が高すぎる場合や、他の要素と共有されるブロック内にある可能性があります)。 このため、既定のエンドポイントは、通常の Web トラフィックと同様に、FQDN 経由で検査プロキシに送信されるように設計されています。

この場合、上記のエンドポイントは、Live Events や Stream 以外の Microsoft 以外の制御された要素によって使用される可能性がある CDN であるため、トラフィック ダイレクトを送信すると、これらの IP に解決される他の何かがクライアントから直接送信されることも意味します。 現在のグローバル危機の固有の性質と、お客様の短期的なニーズを満たすために、Microsoft は、お客様が必要に応じて使用できるように上記の情報を提供しています。

Microsoft では、今後、Teams イベント エンドポイントを許可/最適化エンドポイント カテゴリに含めることができるように、Teams イベント エンドポイントの再構成に取り組んでいます。

これらの IP へのアクセスのみを許可する必要がありますか?

いいえ。サービスを動作させるためには、URL/IP サービス内のすべての必須マーク付きエンドポイントへのアクセスが不可欠です。 さらに、Stream (ID 41 から 45) にマークされた任意の省略可能なエンドポイントが必要です。

このアドバイスはどのようなシナリオに対応しますか?

  1. Teams アプリ内で生成されるライブ イベント
  2. Stream でホストされているコンテンツを表示する
  3. 外部デバイス (エンコーダー) によって生成されたイベント
  4. Teams タウン ホール

このアドバイスは発表者のトラフィックに対応していますか?

それはしません。上記のアドバイスは、サービスを使用する人のためのものです。 Teams 内から発表すると、発表者のトラフィックが URL/IP サービス行 11 に一覧表示され、Microsoft 365 の VPN 分割トンネリングの実装に関する記事の「VPN 分割トンネリングの実装」セクションで説明されている詳細な VPN オフロード アドバイスが記載された、マークされた UDP エンドポイントの最適化に流れる発表者のトラフィックが表示されます。

この構成では、タウン ホール、ライブ イベント、& Stream 以外のトラフィックが直接送信されるリスクがありますか?

はい。サービスの一部の要素で使用される共有 FQDN のため、これは避けられません。 このトラフィックは通常、検査を適用できる企業プロキシ経由で送信されます。 VPN スプリット トンネルのシナリオでは、FQDN と IP の両方を使用すると、このリスクを最小限に抑えることができますが、引き続き存在します。 お客様は、オフロード構成から *.azureedge.net ドメインを削除し、このリスクを最小限に抑えることができますが、これにより、Stream でサポートされるライブ イベント (Teams スケジュール、ストリーム エンコーダー イベント、Teams で生成されたViva Engage イベント、Viva Engage スケジュールされた Stream エンコーダー イベント、Stream からオンデマンド表示) のオフロードが削除されます。 Teams (タウン ホールを含む) でスケジュールおよび生成されたイベントは影響を受けません。

概要: Microsoft 365 の VPN 分割トンネリング

Microsoft 365 の VPN 分割トンネリングの実装

Microsoft 365 の一般的な VPN 分割トンネリング シナリオ

VPN 分割トンネリングのための Teams メディア トラフィックのセキュリティ保護

中国ユーザー向けの Microsoft 365 パフォーマンスの最適化

Microsoft 365 ネットワーク接続の原則

Microsoft 365 ネットワーク接続の評価

Microsoft 365 ネットワークとパフォーマンスのチューニング

セキュリティ専門家と IT による、現代のユニークなリモート ワーク シナリオで最新のセキュリティ管理を実現するための代替的な方法 (Microsoft セキュリティ チーム ブログ)

Microsoft での VPN のパフォーマンス強化: Windows 10 の VPN プロファイルを使用して自動接続を許可する

VPN で実行: Microsoft がリモート ワークの従業員をどのように接続させているか

Microsoft グローバル ネットワーク