パブリック ネットワーク用 Azure Virtual Desktop RDP Shortpath (プレビュー)

リモート デスクトップ プロトコル (RDP) では、複数の異なる種類のネットワーク トランスポートを使用して、リモート デスクトップ クライアントとセッション ホスト間の接続を確立できます。

  • 逆方向接続 - 既定では、RDP で TCP ベースの逆方向接続トランスポートが使用されます。 このトランスポートでは、さまざまなネットワーク構成との最適な互換性が提供され、RDP 接続を確立するための成功率が高くなります。 このトランスポートは、RDP Shortpath 接続が失敗した場合のフォールバックとしても使用されます。
  • マネージド ネットワーク用 RDP Shortpath - 制御されたネットワーク セットアップでの直接接続用に設計された UDP ベースのトランスポート。 たとえば、ExpressRoute または Azure Stack HCI デプロイ経由の接続などです。 詳細については、ドキュメントを参照してください。
  • 現在プレビュー段階にあるパブリック ネットワーク用 RDP Shortpath については、このドキュメントで説明されています。

Note

プレビュー期間中は、マネージド ネットワーク用 RDP Shortpath はパブリック ネットワーク用 RDP Shortpath と互換性がありません。 プレビューに参加する場合は、マネージド ネットワーク用 RDP Shortpath の無効化に関するドキュメントを参照してください。

RDP Shortpath トランスポートは、リモート デスクトップ クライアントとセッション ホストとの間に直接的な UDP データ フローを確立する Azure Virtual Desktop の機能です。 RDP ではこのデータ フローを使用して、より高い信頼性と一貫した待機時間を提供しながら、リモート デスクトップと RemoteApp を提供します。

主な利点

マネージドおよびパブリック ネットワーク用の両方の RDP Shortpath には、同じ一連の主な利点があります。

  • RDP Shortpath トランスポートは、Universal Rate Control Protocol (URCP) に基づいています。 URCP では、ネットワークの状態をアクティブに監視することで UDP を強化し、公平で完全なリンク使用率を実現します。 URCP は、リモート デスクトップの必要に応じて、低遅延および低損失レベルで動作します。 URCP を使用すると、ネットワーク パラメーターを動的に学習し、レート制御メカニズムを備えたプロトコルを提供することにより、最高のパフォーマンスが達成されます。
  • RDP Shortpath は、リモート デスクトップ クライアントとセッション ホストとの間に直接接続を確立します。 直接接続により、Azure Virtual Desktop ゲートウェイへの依存関係が軽減され、接続の信頼性が向上し、各ユーザー セッションに使用できる帯域幅が増加します。
  • 余分なリレーを削除することでラウンド トリップ時間が短縮され、待機時間の影響を受けやすいアプリケーションと入力方式でユーザー エクスペリエンスが向上します。

接続のセキュリティ

パブリック ネットワーク用 RDP Shortpath により、RDP マルチトランスポート機能が拡張されます。 逆方向接続トランスポートは置き換えられませんが、補完されます。 初期セッション ブローカリングは、Azure Virtual Desktop インフラストラクチャを介して管理されます。 各 RDP セッションでは、以前に逆方向接続トランスポート経由で認証された Shortpath トラフィックを受け入れる、動的に割り当てられた UDP ソケットが使用されます。 このソケットでは、逆方向接続セッションと一致するものを除き、接続試行はすべて無視されます。 UDP ソケットが開く前に、新しい RDP セッションで一意の逆方向接続トランスポートを確立する必要があります。 RDP Shortpath では、セッション ホストの証明書を使用して、クライアントとセッション ホスト間の TLS 接続を使用します。 既定では、RDP 暗号化に使用される証明書は、デプロイ中に OS によって自己生成されます。 必要に応じて、顧客は企業の証明機関によって発行され、一元管理された証明書を展開できます。 証明書の構成の詳細については、Windows Server ドキュメントを参照してください。

ネットワーク アドレス変換とファイアウォール

ほとんどの Azure Virtual Desktop クライアントは、プライベート ネットワーク上のコンピューターで実行されます。 インターネット アクセスは、ネットワーク アドレス変換 (NAT) ゲートウェイ デバイスを介して提供されます。 そのため、NAT ゲートウェイにより、プライベート ネットワークからインターネット宛てのすべてのネットワーク要求が変更されます。 このような変更は、プライベート ネットワーク上のすべてのコンピューターで 1 つのパブリック IP アドレスを共有することを意図しています。 IP パケットの変更により、トラフィックの受信者には、実際の送信者ではなく NAT ゲートウェイのパブリック IP アドレスが表示されます。 トラフィックが NAT ゲートウェイに戻ったら、送信者に気付かれずに目的の受信者に転送するように注意します。 ほとんどのシナリオでは、このような NAT の背後に隠れているコンピューターで、変換が行われているのが認識されず、NAT ゲートウェイのネットワーク アドレスがわかりません。

NAT は、すべてのセッション ホストが存在する Azure Virtual Networks にも適用されます。 セッション ホストがインターネット上のネットワーク アドレスに到達しようとすると、NAT Gateway または Azure Load Balancer によりアドレス変換が実行されます。 さまざまな種類の送信元ネットワーク アドレス変換の詳細については、こちらのドキュメントを参照してください。

通常、ほとんどのネットワークには、トラフィックを検査し、ルールに基づいてブロックするファイアウォールが含まれています。 ほとんどのお客様は、受信接続 (つまり、要求なしで送信されるインターネットからの要請されていないパケット) を防ぐためにファイアウォールを構成します。 ファイアウォールでは、要請されたトラフィックと要請されていないトラフィックを区別するために、さまざまな手法を使用してデータ フローを追跡します。 TCP のコンテキストでは、ファイアウォールにより SYN および ACK パケットが追跡され、そのプロセスは簡単です。 UDP ファイアウォールでは通常、パケット アドレスに基づくヒューリスティックを使用して、トラフィックを UDP フローに関連付け、許可またはブロックします。 使用できるさまざまな NAT 実装があります。 ほとんどの場合、NAT ゲートウェイとファイアウォールは、同じ物理または仮想デバイスの機能です。

パブリック ネットワーク用 RDP Shortpath のしくみ

RDP Shortpath では、NAT ゲートウェイのトラバーサルに標準化された一連の方法を使用します。 その結果、ユーザー セッションでクライアントとセッション ホストの間に UDP フローが直接確立されます。 さらに具体的に言うと、RDP Shortpath では STUN プロトコルを使用して、NAT ルーターの外部 IP アドレスを検出します。 RDP Shortpath データ フローの確立には、次の 4 つの主なコンポーネントが使用されます。

  • リモート デスクトップ クライアント
  • セッション ホスト
  • Azure Virtual Desktop ゲートウェイ
  • Azure Virtual Desktop STUN サーバー

Azure Virtual Desktop では、すべての RDP 接続は、Azure Virtual Desktop ゲートウェイ経由で逆方向接続トランスポートを確立することから始まります。 ユーザー認証の後、クライアントとセッション ホストで最初の RDP トランスポートが確立され、クライアントとセッション ホストでそれらの機能の交換が開始されます。 パブリック ネットワーク用 RDP Shortpath がセッション ホストで有効になっている場合、セッション ホストにより候補収集というプロセスが開始されます。

  • この段階では、セッション ホストで、VPN や Teredo などの仮想インターフェイスを含め、VM に割り当てられているすべてのネットワーク インターフェイスが列挙されます。
  • リモート デスクトップ サービスでは、各インターフェイスに UDP ソケットを割り当て、IP:Port ペアを ''ローカル候補'' として候補テーブルに格納します。
  • リモート デスクトップ サービスでは、前の手順で割り当てた各 UDP ソケットを使用して、パブリック インターネット上の Azure Virtual Desktop STUN サーバーに到達しようとします。 通信は、ポート 3478 に小さな UDP パケットを送信することによって行われます
  • パケットが STUN サーバーに到達すると、STUN サーバーはセッション ホストのパブリック IP とリスナー ポートで応答します。 この情報は、''再帰候補'' として候補テーブルに格納されます。

セッション ホストですべての候補が収集された後、セッション ホストでは確立された逆方向接続トランスポートを使用して、候補リストをクライアントに渡します。 クライアントはサーバーから候補リストを受け取ると、クライアント側で候補の収集を実行します。 その後、クライアントはその候補リストをセッション ホストに送信します。 セッション ホストとクライアントが候補リストを交換した後、両者は収集されたすべての候補を使用して相互に接続しようとします。 この接続試行は両側で同時に行われます。 NAT ゲートウェイの多くは、送信データ転送によってソケットが初期化されるとすぐに、そのソケットへの受信トラフィックを許可するように構成されています。 NAT ゲートウェイのこの動作が、同時接続が不可欠な理由です。 最初のパケット交換の後、クライアントとセッション ホストは 1 つまたは複数のデータ フローを確立できます。 その後、リモート デスクトップ プロトコルで最速のネットワーク パスが選択されます。 次に、クライアントでセッション ホストとのセキュリティで保護された TLS 接続が確立され、RDP Shortpath トランスポートが開始されます。 RDP で Shortpath トランスポートが確立された後、リモート グラフィックス、入力、デバイス リダイレクトを含むすべての動的仮想チャネル (DVC) が新しいトランスポートに移動されます。

必要条件

RDP Shortpath をサポートするには、Azure Virtual Desktop クライアントに、セッション ホストへの直接の通信経路が必要です。 直接の通信経路を取得するには、これらのいずれかの方法を使用します。

他の VPN の種類を使用して Azure portal に接続する場合は、ユーザー データグラム プロトコル (UDP) ベースの VPN を使用することをお勧めします。 ほとんどの伝送制御プロトコル (TCP) ベースの VPN ソリューションでは、入れ子になった UDP がサポートされていますが、TCP 輻輳制御の継承されたオーバーヘッドが追加されるため、RDP のパフォーマンスが低下します。

直接の通信経路を持つことは、クライアントがファイアウォールにブロックされることなく、セッション ホストに直接接続できることを意味します。

パブリック ネットワーク用 RDP Shortpath のプレビューの有効化

RDP Shortpath のプレビューに参加するには、Shortpath 機能を有効にする必要があります。 ご利用の環境内で使用されている任意の数のセッション ホストで RDP Shortpath を構成することができます。 プール内のすべてのホストで RDP Shortpath を有効にする必要はありません。 「検証ホスト プールとしてホスト プールを定義する」の手順に従って、検証ホスト プールを使用することをお勧めします。

セッション ホストを構成するには、以下の手順に従います。

  1. セッション ホストに接続します
  2. 管理者特権でコマンド プロンプトを開きます
  3. パブリック ネットワーク用 RDP Shortpath を有効にします。
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations" /v ICEControl /t REG_DWORD  /d 2 /f

パブリック ネットワーク用 RDP Shortpath のプレビューの無効化

RDP Shortpath のプレビューを無効にすることにした場合は、Shortpath 機能を無効にできます。

セッション ホストを構成するには、以下の手順に従います。

  1. セッション ホストに接続します
  2. 管理者特権でのコマンド プロンプトを開きます。
  3. パブリック ネットワーク用 RDP Shortpath を無効にします。
REG DELETE "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations" /v ICEControl /f

ネットワーク構成

パブリック ネットワーク用 RDP Shortpath をサポートするには、通常、特定の構成は必要ありません。 Azure Virtual Desktop クライアントとセッション ホストにより、ネットワーク構成で可能であれば、直接データ フローが自動的に検出されます。 しかし、すべての環境は一意であり、一部のネットワーク構成は直接接続の成功率に悪影響を与える可能性があります。 直接データ フローの可能性を高めるには、以下の推奨事項に従います。

送信 UDP 接続を許可する

RDP Shortpath では、UDP を使用してデータ フローを確立します。 ネットワーク上のファイアウォールにより UDP トラフィックがブロックされると、RDP Shortpath は失敗し、接続は TCP ベースの逆方向接続トランスポートにフォールバックされます。 Azure Virtual Desktop では、Azure Communication Services と Microsoft Teams によって提供される STUN サーバーが使用されます。 この機能の性質上、セッション ホストからクライアントへの送信接続が必要です。 残念ながら、ほとんどの場合、ユーザーがどこにいるかを予測することはできません。 そのため、インターネットへの送信 UDP 接続を許可することをお勧めします。 受信 UDP フローのリッスンに使用されるポート範囲を制限できます。 RDP Shortpath のファイアウォールを構成する際には、参照用に次の表を使用してください。

セッション ホスト仮想ネットワーク

名前 source 宛先ポート Protocol 宛先 アクション
RDP Shortpath サーバー エンドポイント VM サブネット 1024 から 65535 UDP * Allow
STUN アクセス VM サブネット 3478 UDP 13.107.17.41/32、13.107.64.0/18、20.202.0.0/16、52.112.0.0/14、52.120.0.0/14 Allow

クライアント ネットワーク

名前 source 宛先ポート Protocol 宛先 アクション
RDP Shortpath サーバー エンドポイント クライアント ネットワーク 1024 から 65535 UDP NAT Gateway または Azure Firewall に割り当てられたパブリック IP アドレス Allow
STUN アクセス クライアント ネットワーク 3478 UDP 13.107.17.41/32、13.107.64.0/18、20.202.0.0/16、52.112.0.0/14、52.120.0.0/14 Allow

Note

プレビューで使用される STUN サーバーの IP 範囲は、機能の一般提供リリース時に変更されます。

クライアント側で使用されるポート範囲の制限

既定では、パブリック ネットワーク用 RDP Shortpath で一時的なポート範囲 (49152 から 65535) を使用して、サーバーとクライアントの間の直接パスを確立します。 しかし、場合によっては、より小さく予測可能なポート範囲を使用するようにサーバーを構成することもできます。 限られたポート範囲を有効にするには、セッション ホストで次のコマンドを使用できます。

REG ADD HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services /v ICEEnableClientPortRange /t REG_DWORD /d 1 /f

セッション ホストでこの設定を有効にすると、Azure Virtual Desktop クライアントにより、すべての接続の範囲からポートがランダムに選択されます。 指定されたポート範囲がすべて使用されている場合は、クライアントのオペレーティング システムにより使用するポートが選択されます。 既定では、ポート範囲の構成が有効になっている場合、クライアントにより 38300 から 39299 の範囲からポートが選択されます。 ポート番号を変更する場合は、Azure Virtual Desktop クライアントの UDP ポート範囲をカスタマイズできます。 ベースおよびプール サイズを選択する際には、上限が 49151 を超えないようにポートの設定数を考慮してください。 たとえば、ポート ベースとして 38300、プール サイズとして 1000 を選択した場合、上限は 39299 になります。 ポート範囲を指定するには、次のコマンドを使用し、ベース ポートとポートの数を置き換えます。

reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services /v ICEClientPortBase /t REG_DWORD /d 38300 /f
reg add HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\Terminal Services /v ICEClientPortRange /t REG_DWORD /d 1000 /f

クライアントで RDP Shortpath を無効にする

特定のクライアントに対して RDP Shortpath を無効にするには、次のグループ ポリシーを使用して UDP のサポートを無効にすることができます。

  1. クライアントで、gpedit.msc を実行します。
  2. [コンピューターの構成][管理用テンプレート][Windows コンポーネント][リモート デスクトップ サービス][リモート デスクトップ接続のクライアント] の順に移動します。
  3. [クライアントの UDP を無効にする] 設定を [有効] に設定します

Teredo サポート

RDP Shortpath には必要ありませんが、Teredo ではさらに NAT トラバーサル候補が追加され、IPv4 のみのネットワークでの RDP Shortpath 接続の成功率が高まります。 次のコマンドを実行することで、セッション ホストとクライアント側の両方で Teredo を有効にすることができます。

netsh interface Teredo set state type=enterpriseclient

UPnP サポート

直接接続の可能性を高めるために、リモート デスクトップ クライアント側では、RDP Shortpath で UPnP を使用して NAT ルーター上のポート マッピングを構成できます。 UPnP は、Xbox、配信の最適化、Teredo など、さまざまなアプリケーションで使用される標準的なテクノロジです。 UPnP は、通常ホーム ネットワーク上にあるルーターで一般提供されています。 UPnP プロトコルは、ほとんどのホーム ルーターとアクセス ポイントで既定で有効になっています。 多くの場合、UPnP は企業ネットワークで無効になっています。

一般的な推奨事項

  • ユーザーがインターネット経由で Azure Virtual Desktop にアクセスする場合は、強制トンネリング構成の使用を避けてください。
  • ダブル NAT やキャリア グレード NAT (CGN) 構成を使用していないことを確認してください。
  • ユーザーにホーム ルーターで UPnP を無効にしないように勧めてください。
  • クラウド パケット検査サービスの使用は避けてください
  • TCP ベースの VPN ソリューションの使用を避けてください
  • IPv6 接続または Teredo を有効にしてください

ネットワーク接続を確認します。

次に、ネットワークで RDP Shortpath が使用されていることを確認する必要があります。 [接続情報] ダイアログで、または Log Analytics を使用して、トランスポートを確認できます。

[接続情報] ダイアログ

接続で RDP Shortpath が使用されていることを確認するには、次のスクリーンショットに示されているように、画面の上部にある [接続] ツール バーに移動し、アンテナ アイコンを選択して [接続情報] ダイアログを開きます。

Image of Remote Desktop Connection Bar of remote desktop client

Image of Remote Desktop Connection Info dialog

Log Analytics の使用

Azure Log Analytics を使用している場合、WVDConnections テーブルに対してクエリを実行することで接続を監視できます。 UdpUse という名前の列は、Azure Virtual Desktop RDP スタックが現在のユーザー接続で UDP プロトコルを使用しているかどうかを示します。 設定できる値は次のとおりです。

  • 0 - ユーザー接続で RDP Shortpath は使用されていない。
  • 1 - ユーザー接続でマネージド ネットワーク用 RDP Shortpath が使用されている。
  • 2 - ユーザー接続でパブリック ネットワーク用 RDP Shortpath が使用されている。

次のクエリで接続情報を確認できます。 このクエリは、Log Analytics クエリ エディターで実行できます。 クエリごとに、userupn を検索するユーザーの UPN に置き換えます。

let Events = WVDConnections | where UserName == "userupn" ;
Events
| where State == "Connected"
| project CorrelationId , UserName, ResourceAlias , StartTime=TimeGenerated, UdpUse, SessionHostName, SessionHostSxSStackVersion
| join (Events
| where State == "Completed"
| project EndTime=TimeGenerated, CorrelationId, UdpUse)
on CorrelationId
| project StartTime, Duration = EndTime - StartTime, ResourceAlias, UdpUse,  SessionHostName, SessionHostSxSStackVersion
| sort by StartTime asc

次の Log Analytics クエリを実行して、特定のユーザー セッションに対して RDP Shortpath が有効になっているかどうかを確認できます。

WVDCheckpoints 
|where Name contains "Shortpath"

トラブルシューティング

STUN サーバー接続と NAT の種類の確認

RDP Shortpath トランスポートを使用して接続を確立できない場合は、次の PowerShell スクリプトを使用して STUN サーバーへの接続を検証します

function Test-StunEndpoint 
{
  param
  (
    [Parameter(Mandatory)]
    $UdpClient,
    [Parameter(Mandatory)]
    $StunEndpoint
  )
  $ipendpoint = $null
  try 
  {
    $UdpClient.client.ReceiveTimeout = 5000 
    $listenport = $UdpClient.client.localendpoint.port
    $endpoint = New-Object -TypeName System.Net.IPEndPoint -ArgumentList ([IPAddress]::Any, $listenport)

  
    [Byte[]] $payload = 
    0x00, 0x01, # Message Type: 0x0001 (Binding Request)
    0x00, 0x00, # Message Length: 0 bytes excluding header
    0x21, 0x12, 0xa4, 0x42 # Magic Cookie: Always 0x2112A442

    $LocalTransactionId = ([guid]::NewGuid()).ToByteArray()[1..12]
    $payload = $payload + $LocalTransactionId
    try 
    {
      $null = $UdpClient.Send($payload, $payload.length, $StunEndpoint)
    }
    catch 
    {
      throw "Unable to send data, check if $($StunEndpoint.AddressFamily) is configured"
    }
  
  
    try 
    {
      $content = $UdpClient.Receive([ref]$endpoint)
    }
    catch 
    {
      try 
      {
        $null = $UdpClient.Send($payload, $payload.length, $StunEndpoint)
        $content = $UdpClient.Receive([ref]$endpoint)
      }
      catch 
      {
        try 
        {
          $null = $UdpClient.Send($payload, $payload.length, $StunEndpoint)
          $content = $UdpClient.Receive([ref]$endpoint)
        }
        catch 
        {
          throw "Unable to receive data, check if firewall allows access to $($StunEndpoint.ToString())"
        }
      }
    }
    
    
    if (-not $content) 
    {
      throw  'Null response.'
    }
  
    [Byte[]]$messageType = $content[0..1]
    [Byte[]]$messageCookie = $content[4..7]
    [Byte[]]$TransactionId = $content[8..19]
    [Byte[]]$AttributeType = $content[20..21]
    [Byte[]]$AttributeLength = $content[22..23]

    if ([System.BitConverter]::IsLittleEndian) 
    {
      [Array]::Reverse($AttributeLength)
    }

    if ( -not ([BitConverter]::ToString($messageType)) -eq '01-01') 
    {
      throw  "Invalid message type: $([BitConverter]::ToString($messageType))"
    }
    if ( -not ([BitConverter]::ToString($messageCookie)) -eq '21-12-A4-42') 
    {
      throw  "Invalid message cookie: $([BitConverter]::ToString($messageCookie))"
    }
  
    if (-not  ([BitConverter]::ToString($TransactionId)) -eq [BitConverter]::ToString($LocalTransactionId) ) 
    {
      throw  "Invalid message id: $([BitConverter]::ToString($TransactionId))"
    }
    if (-not  ([BitConverter]::ToString($AttributeType)) -eq '00-20' ) 
    {
      throw  "Invalid Attribute Type: $([BitConverter]::ToString($AttributeType))"
    }
    $ProtocolByte = $content[25]
    if (-not (($ProtocolByte -eq 1) -or ($ProtocolByte -eq 2))) 
    {
      throw "Invalid Address Type: $([BitConverter]::ToString($ProtocolByte))"
    }
    $portArray = $content[26..27]
    if ([System.BitConverter]::IsLittleEndian) 
    {
      [Array]::Reverse($portArray)
    }

    $port = [Bitconverter]::ToUInt16($portArray, 0) -bxor 0x2112
          
    if ($ProtocolByte -eq 1) 
    {
      $IPbytes = $content[28..31]
      if ([System.BitConverter]::IsLittleEndian) 
      {
        [Array]::Reverse($IPbytes)
      }
      $IPByte = [System.BitConverter]::GetBytes(([Bitconverter]::ToUInt32($IPbytes, 0) -bxor 0x2112a442))
        
      if ([System.BitConverter]::IsLittleEndian) 
      {
        [Array]::Reverse($IPByte)
      }
      $IP = [ipaddress]::new($IPByte)
    }
    elseif ($ProtocolByte -eq 2) 
    {
      $IPbytes = $content[28..44]
      [Byte[]]$magic = $content[4..19]
      for ($i = 0; $i -lt $IPbytes.Count; $i ++) 
      {
        $IPbytes[$i] = $IPbytes[$i] -bxor $magic[$i]
      }
      $IP = [ipaddress]::new($IPbytes)
    }
    $ipendpoint = [IPEndpoint]::new($IP, $port)
  }
  catch 
  {
    Write-Host -Object "Failed to communicate $($StunEndpoint.ToString()) with error: $_" -ForegroundColor Red
  }
  return $ipendpoint
}


$UdpClient6 = [Net.Sockets.UdpClient]::new([Net.Sockets.AddressFamily]::InterNetworkV6)
$UdpClient = [Net.Sockets.UdpClient]::new([Net.Sockets.AddressFamily]::InterNetwork)

  
$ipendpoint1 = Test-StunEndpoint -UdpClient $UdpClient -StunEndpoint ([IPEndpoint]::new(([Net.Dns]::GetHostAddresses('worldaz.turn.teams.microsoft.com')|Where-Object -FilterScript {$_.AddressFamily -EQ 'InterNetwork'})[0].Address, 3478))
$ipendpoint2 = Test-StunEndpoint -UdpClient $UdpClient -StunEndpoint ([IPEndpoint]::new([ipaddress]::Parse('13.107.17.41'), 3478))
$ipendpoint3 = Test-StunEndpoint -UdpClient $UdpClient6 -StunEndpoint ([IPEndpoint]::new([ipaddress]::Parse('2a01:111:202f::155'), 3478))


$localendpoint1 = $UdpClient.Client.LocalEndPoint
$localEndpoint2 = $UdpClient6.Client.LocalEndPoint


if ($null -ne $ipendpoint1) 
{
  if ($ipendpoint1.Port -eq $localendpoint1.Port) 
  {
    Write-Host  -Object 'Local NAT uses port preservation' -ForegroundColor Green
  }
  else 
  {
    Write-Host  -Object 'Local NAT does not use port preservation, custom port range may not work with Shortpath' -ForegroundColor Red
  }
  if ($null -eq $ipendpoint2) 
  {
    if ($ipendpoint1.Equals($ipendpoint2)) 
    {
      Write-Host -Object 'Local NAT reuses SNAT ports'  -ForegroundColor Green
    }
    else 
    {
      Write-Host -Object 'Local NAT does not reuse SNAT ports, preventing Shortpath from connecting this endpoint'  -ForegroundColor Red
    }
  }
}
Write-Output -InputObject "`nLocal endpoints:`n$localendpoint1`n$localEndpoint2"
Write-Output -InputObject "`nDiscovered external endpoints:`n$ipendpoint1`n$ipendpoint2`n$ipendpoint3`n"


$UdpClient.Close()
$UdpClient6.Close()


Pause

References

  • RFC 8839 - 対話型接続確立 (ICE) のセッション記述プロトコル (SDP) オファーと応答手順
  • RFC 8489 - Session Traversal Utilities for NAT (STUN)
  • RFC 2663 - IP ネットワーク アドレス トランスレーター (NAT) の用語と考慮事項

次のステップ