Azure Virtual Network に、ピアリングで自動生成されるルートの伝播を無効化する機能がパブリックプレビューで提供されています。

Public Preview: Disable VNet peering route

ルートテーブルの設定を変更できることだけでは、実際にどの経路が消えるのか、ほかのサブネットに影響するのかまでは分かりません。そこで、設定を None → All → None と切り替え、各段階で NIC の有効なルートを取得して比較しました。

ピアリング経路の伝播無効化機能の概要

VNet をピアリングすると、ピアリング先のアドレス空間を宛先とするシステム経路が自動的に追加されます。

ここで、複数のピアリング先への通信を Azure Firewall や NVA に集約したいとします。たとえば、ピアリング先のアドレス空間が 10.82.0.0/16 や 10.83.0.0/16 であれば、これらを含む 10.0.0.0/8 の UDR を 1 つ追加すればよさそうに見えます。しかし、自動追加された /16 のシステム経路がロンゲストマッチで優先されるため、集約 UDR だけでは意図した経路に変更できません。

このため、通常は 10.82.0.0/16、10.83.0.0/16 のように、ピアリング先のアドレス空間と同じ宛先プレフィックスの UDR を個別に追加します。同じ宛先プレフィックスならシステム経路より UDR が優先されますが、ピアリング先の VNet ごとに設定が必要です。アドレス空間が複数あれば、そのプレフィックスごとに用意することになります。接続先が増えるほど UDR の追加・変更の手間が増え、ルートテーブルに登録できるルート数の上限も意識する必要があります。

この機能は、ルートテーブルを関連付けたサブネットの対応ワークロードについて、自動生成されるピアリング経路を抑制します。より具体的なシステム経路がなくなれば、複数のピアリング先を含む集約 UDR を 1 つ設定することで、それらの宛先への通信を Azure Firewall や NVA に向けられます。

設定名とオン・オフの対応関係

PowerShell の DisablePeeringRoute と、ポータルの Enable peering routes (Preview) は、肯定・否定が逆です。

ピアリング経路の伝播 DisablePeeringRoute ポータルの Enable peering routes
有効 None オン
無効 All オフ

この記事では、All にすることを「抑制を有効化する」、None に戻すことを「伝播を復元する」と表現します。操作はすべて Azure PowerShell で行い、ポータルは使っていません。

検証構成

今回の検証環境は以下の通りです。

構成図

対象の NIC だけを見るのではなく、次の 3 点を確認します。

NIC 確認したいこと
nic-route-target 関連付けたルートテーブルによって経路が抑制・復元されるか
nic-route-control 同じ VNet でも未関連付けサブネットには影響しないか
nic-route-peer ピア VNet 側の逆方向経路まで一緒に消えないか

プレビュー機能の登録

公式手順では、サブスクリプションへの Microsoft.Network/AllowDisablePeeringRoutes の登録と、Az.Network 8.1.0 以降が必要です。今回の環境では、Az.Network を 8.3.0 に更新して実行しました。

登録前は NotRegistered でした。登録コマンドの実行後、次の確認で Registered を取得できました。

Register-AzProviderFeature `
    -ProviderNamespace Microsoft.Network `
    -FeatureName AllowDisablePeeringRoutes

ルートテーブルと UDR の作成

初期状態を曖昧にしないため、作成時に DisablePeeringRoute = None を明示しました。

$route = New-AzRouteConfig `
    -Name discard-private-summary `
    -AddressPrefix 10.0.0.0/8 `
    -NextHopType None

New-AzRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -Name rt-peering-eval `
    -Location japaneast `
    -DisablePeeringRoute None `
    -Route $route

Get-AzRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -Name rt-peering-eval

確認コマンドの出力から、今回表示したプロパティを抜粋します。

Name                       : rt-peering-eval
ProvisioningState          : Succeeded
DisablePeeringRoute        : None
DisableBgpRoutePropagation : False
Routes                     : {discard-private-summary}

このルートテーブルを snet-target だけに関連付け、双方向のピアリングを作成し、各サブネットの VM が起動していることを確認しました。

DisableBgpRoutePropagation は別の設定です。今回は変更せず、全段階で False のままとしています。

変更前のピアリング経路の確認

まず、対象 NIC の有効なルートを取得します。

$routes = Get-AzEffectiveRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -NetworkInterfaceName nic-route-target

$routes | Format-Table `
    Source,State,AddressPrefix,NextHopType,NextHopIpAddress -AutoSize

実際の出力の先頭 3 行を抜粋します。後続の経路は省略しています。

Source  State   AddressPrefix       NextHopType NextHopIpAddress
------  -----   -------------       ----------- ----------------
Default Active  {10.81.0.0/16}      VnetLocal   {}
Default Active  {10.82.0.0/16}      VNetPeering {}
Default Active  {0.0.0.0/0}         Internet    {}

相手 VNet の 10.82.0.0/16 に対して、Source = Default、State = Active、NextHopType = VNetPeering の経路があります。

All への変更による経路抑制の有効化

ルートテーブルを取得し、DisablePeeringRoute だけを変更して保存します。

$routeTable = Get-AzRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -Name rt-peering-eval

$routeTable.DisablePeeringRoute = "All"

Set-AzRouteTable -RouteTable $routeTable

Get-AzRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -Name rt-peering-eval

再取得した設定は次のとおりです。

Name                       : rt-peering-eval
ProvisioningState          : Succeeded
DisablePeeringRoute        : All
DisableBgpRoutePropagation : False

設定値が All になっただけでは検証として不十分なので、対象 NIC の有効なルートも取り直します。表示は今回確認する 4 プレフィックスに絞りました。フィルターは取得済みの結果に対するローカル処理です。

$routes = Get-AzEffectiveRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -NetworkInterfaceName nic-route-target

$routes | Where-Object {
    $_.AddressPrefix -contains "10.81.0.0/16" -or
    $_.AddressPrefix -contains "10.82.0.0/16" -or
    $_.AddressPrefix -contains "10.0.0.0/8" -or
    $_.AddressPrefix -contains "0.0.0.0/0"
} | Format-Table `
    Source,State,AddressPrefix,NextHopType,NextHopIpAddress -AutoSize
Source  State   AddressPrefix  NextHopType NextHopIpAddress
------  -----   -------------  ----------- ----------------
Default Active  {10.81.0.0/16} VnetLocal   {}
Default Active  {0.0.0.0/0}    Internet    {}
User    Active  {10.0.0.0/8}   None        {}
Default Invalid {10.0.0.0/8}   None        {}

10.82.0.0/16 → VNetPeering が消えています。

一方、ローカル VNet の 10.81.0.0/16 → VnetLocal、0.0.0.0/0 → Internet、既存 UDR の 10.0.0.0/8 → None は残っています。

同一 VNet の別サブネットとピア VNet 側への影響

同じ VNet の snet-control は、対象ルートテーブルに関連付けていません。この NIC についても有効なルートを取得しました。

$routes = Get-AzEffectiveRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -NetworkInterfaceName nic-route-control

$routes | Where-Object {
    $_.NextHopType -in @("VnetLocal","VNetPeering")
} | Format-Table `
    Source,State,AddressPrefix,NextHopType,NextHopIpAddress -AutoSize
Source  State  AddressPrefix  NextHopType NextHopIpAddress
------  -----  -------------  ----------- ----------------
Default Active {10.81.0.0/16} VnetLocal   {}
Default Active {10.82.0.0/16} VNetPeering {}

こちらには 10.82.0.0/16 → VNetPeering が残っています。VNet 全体のピアリング経路を一律に削除する設定ではないことが分かります。

ピア VNet 側も確認します。

$routes = Get-AzEffectiveRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -NetworkInterfaceName nic-route-peer

$routes | Where-Object {
    $_.NextHopType -in @("VnetLocal","VNetPeering")
} | Format-Table `
    Source,State,AddressPrefix,NextHopType,NextHopIpAddress -AutoSize
Source  State  AddressPrefix  NextHopType NextHopIpAddress
------  -----  -------------  ----------- ----------------
Default Active {10.82.0.0/16} VnetLocal   {}
Default Active {10.81.0.0/16} VNetPeering {}

VNet B から VNet A への経路も残っています。片側のルートテーブルを変更したからといって、相手側の経路まで自動的に抑制されるわけではありません。実際の設計では、往路と復路を別々に確認する必要があります。

ピアリング接続自体の維持

抑制中に、ピアリングの状態も確認しました。

Get-AzVirtualNetworkPeering `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -VirtualNetworkName vnet-route-a `
    -Name a-to-b

表示したプロパティの出力です。

Name                      : a-to-b
ProvisioningState         : Succeeded
PeeringState              : Connected
AllowVirtualNetworkAccess : True

反対方向の b-to-a も Connected でした。ルートテーブルにルーティングが挿入されないだけで、ピアリング接続自体は維持されていることが分かります。

None への変更による経路伝播の復元

再度ルートテーブルを取得して、今度は None を保存します。

$routeTable = Get-AzRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -Name rt-peering-eval

$routeTable.DisablePeeringRoute = "None"

Set-AzRouteTable -RouteTable $routeTable

Get-AzRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -Name rt-peering-eval
Name                       : rt-peering-eval
ProvisioningState          : Succeeded
DisablePeeringRoute        : None
DisableBgpRoutePropagation : False

その後、対象 NIC に対して、先ほどの Get-AzEffectiveRouteTable と同じ 4 プレフィックスの表示コマンドを再実行しました。

$routes = Get-AzEffectiveRouteTable `
    -ResourceGroupName rg-peering-route-eval-20261029 `
    -NetworkInterfaceName nic-route-target

$routes | Where-Object {
    $_.AddressPrefix -contains "10.81.0.0/16" -or
    $_.AddressPrefix -contains "10.82.0.0/16" -or
    $_.AddressPrefix -contains "10.0.0.0/8" -or
    $_.AddressPrefix -contains "0.0.0.0/0"
} | Format-Table `
    Source,State,AddressPrefix,NextHopType,NextHopIpAddress -AutoSize
Source  State   AddressPrefix  NextHopType NextHopIpAddress
------  -----   -------------  ----------- ----------------
Default Active  {10.81.0.0/16} VnetLocal   {}
Default Active  {10.82.0.0/16} VNetPeering {}
Default Active  {0.0.0.0/0}    Internet    {}
User    Active  {10.0.0.0/8}   None        {}
Default Invalid {10.0.0.0/8}   None        {}

10.82.0.0/16 → VNetPeering が Active で戻りました。

まとめ

DisablePeeringRoute の動作を確認しました。ピアリングすると自動挿入される経路が自動挿入されなくなるという地味ながらとても助かるアップデートです。GA が待ち遠しい。

参考リンク

  • 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
  • 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
  • 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。