はじめに
今まで漠然と理解していた Virtual WAN のルーティングを、検証環境を組んで実際に試してみました。今回は基本的な動作とルーティングの優先順位を試します。行く行くは、カスタムのルートテーブルやラベル、ルートマップも試したい。
検証環境
東日本リージョンと西日本リージョンに Virtual Hub を用意して、それぞれの Virtual Hub に2つの VNet を接続します。また、オンプレとの経路のやり取りを再現するために、Ubuntu + Libreswan + frr な仮想マシンを用意して、両 Virtual Hub と BGP over S2S VPN で接続します。10.1と10.3で始まる経路が東日本、10.2と10.4で始まる経路が西日本、192.168で始まる経路がオンプレミスです。

検証環境のイメージ
ルートテーブルの仕組み
Virtual Hub には Virtual Hub がパケットの転送先を決めるために利用するルートテーブルが存在します。このルートテーブルには「関連付け」と「伝達」という2つの要素が存在します。「関連付け」は Virtual Hub から経路を学習する設定です。VNet や オンプレ接続をルートテーブルに関連付けると、VNet やオンプレ接続は、そのルートテーブルに存在する経路を学習します。「伝達」は Virtual Hub に経路を広報する設定です。VNet やオンプレ接続は、「伝達」するルートテーブルを選ぶことによって、自分の経路を広報する Virtual Hub のルートテーブルを選べます。

検証環境のイメージ
特に何の制御もしていない場合
Virtual Hub には default という名称の初期のルートテーブルが存在します。特に何の制御もしなければ、全ての VNet とオンプレミスとの接続はこの default というルートテーブルを利用します。今回の検証環境の全ての VNet と S2S VPN を default のルートテーブルに関連付け・伝達すると、各ポイントのルートテーブルは次のようになります。
東日本の je-vnet1
Get-AzEffectiveRouteTable -NetworkInterfaceName nic-jevnet1vm -ResourceGroupName vwaneval | Select-Object AddressPrefix,NextHopType,NextHopIpAddress,State
AddressPrefix NextHopType NextHopIpAddress State
------------- ----------- ---------------- -----
{10.3.1.0/24} VnetLocal {} Active
{10.1.0.0/16} VNetPeering {} Active
{192.168.1.0/26} VirtualNetworkGateway {10.1.0.12} Active
{192.168.1.0/26} VirtualNetworkGateway {10.1.0.13} Active
{10.3.2.0/24} VirtualNetworkGateway {4.241.145.170} Active
{10.4.1.0/24} VirtualNetworkGateway {4.241.145.170} Active
{10.4.2.0/24} VirtualNetworkGateway {4.241.145.170} Active
{0.0.0.0/0} Internet {} Active
- 東日本の VNet のネクストホップ:東日本の Virtual Hub の仮想ハブルータ
- 西日本の VNet のネクストホップ:東日本の Virtual Hub の仮想ハブルータ
- オンプレミスのネクストホップ:東日本の Virtual Hub の S2S ゲートウェイの BGP 用の プライベート IP アドレス
東日本 の Virtual Hub
Virtual Hub の有効なルートの確認には、以前作ったものを利用します
Virtual WAN の有効なルートを PowerShell で取得する
Get-AzVhubEffectiveRoutes -subId aa9de0c7-adae-4ccc-b041-e4720761aa65 -vhubRgName vwaneval -vhubName je-vhub -rtName defaultRouteTable
addressPrefixes : {192.168.1.0/26}
nextHops : vpnGateways/vpngwjehub
nextHopType : VPN_S2S_Gateway
routeOrigin : vpnGateways/vpngwjehub
asPath : 65147
addressPrefixes : {10.3.1.0/24}
nextHops : virtualHubs/je-vhub/hubVirtualNetworkConnections/vnetconnBetweenJevhubAndJevnet1
nextHopType : Virtual Network Connection
routeOrigin : virtualHubs/je-vhub/hubVirtualNetworkConnections/vnetconnBetweenJevhubAndJevnet1
asPath :
addressPrefixes : {10.3.2.0/24}
nextHops : virtualHubs/je-vhub/hubVirtualNetworkConnections/vnetconnBetweenJevhubAndJevnet2
nextHopType : Virtual Network Connection
routeOrigin : virtualHubs/je-vhub/hubVirtualNetworkConnections/vnetconnBetweenJevhubAndJevnet2
asPath :
addressPrefixes : {10.4.1.0/24}
nextHops : virtualHubs/jw-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/jw-vhub
asPath : 65520-65520
addressPrefixes : {10.4.2.0/24}
nextHops : virtualHubs/jw-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/jw-vhub
asPath : 65520-65520
- 東日本の VNet:東日本の VNet とのコネクション
- 西日本の VNet:西日本の Virtual Hub
- オンプレミス:東日本の Virtual Hub の S2S ゲートウェイ
西日本の jw-vnet1
Get-AzEffectiveRouteTable -NetworkInterfaceName nic-jwvnet1vm -ResourceGroupName vwaneval | Select-Object AddressPrefix,NextHopType,NextHopIpAddress,State
AddressPrefix NextHopType NextHopIpAddress State
------------- ----------- ---------------- -----
{10.4.1.0/24} VnetLocal {} Active
{10.2.0.0/16} VNetPeering {} Active
{10.4.2.0/24} VirtualNetworkGateway {52.175.150.144} Active
{10.3.2.0/24} VirtualNetworkGateway {52.175.150.144} Active
{192.168.1.0/26} VirtualNetworkGateway {52.175.150.144} Active
{10.3.1.0/24} VirtualNetworkGateway {52.175.150.144} Active
{0.0.0.0/0} Internet {} Active
- 東日本の VNet のネクストホップ:西日本の Virtual Hub の仮想ハブルータ
- 西日本の隣の VNet のネクストホップ:西日本の Virtual Hub の仮想ハブルータ
- オンプレミスのネクストホップ:西日本の Virtual Hub の S2S ゲートウェイの BGP 用の プライベート IP アドレス
西日本の Virtual Hub
Get-AzVhubEffectiveRoutes -subId aa9de0c7-adae-4ccc-b041-e4720761aa65 -vhubRgName vwaneval -vhubName jw-vhub -rtName defaultRouteTable
addressPrefixes : {192.168.1.0/26}
nextHops : vpnGateways/vpngwjwhub
nextHopType : VPN_S2S_Gateway
routeOrigin : vpnGateways/vpngwjwhub
asPath : 65147
addressPrefixes : {10.3.1.0/24}
nextHops : virtualHubs/je-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/je-vhub
asPath : 65520-65520
addressPrefixes : {10.3.2.0/24}
nextHops : virtualHubs/je-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/je-vhub
asPath : 65520-65520
addressPrefixes : {10.4.1.0/24}
nextHops : virtualHubs/jw-vhub/hubVirtualNetworkConnections/vnetconnBetweenJwvhubAndJwvnet1
nextHopType : Virtual Network Connection
routeOrigin : virtualHubs/jw-vhub/hubVirtualNetworkConnections/vnetconnBetweenJwvhubAndJwvnet1
asPath :
addressPrefixes : {10.4.2.0/24}
nextHops : virtualHubs/jw-vhub/hubVirtualNetworkConnections/vnetconnBetweenJwvhubAndJwvnet2
nextHopType : Virtual Network Connection
routeOrigin : virtualHubs/jw-vhub/hubVirtualNetworkConnections/vnetconnBetweenJwvhubAndJwvnet2
asPath :
- 東日本の VNet のネクストホップ:東日本の Virtual Hub
- 西日本の VNet のネクストホップ:西日本の VNet とのコネクション
- オンプレミスのネクストホップ:西日本の Virtual Hub の S2S ゲートウェイ
オンプレ
show bgp ipv4 u
% Ambiguous command: show bgp ipv4 u
omprevnet2vm# show bgp ipv4 unicast
BGP table version is 341, local router ID is 192.168.1.4, vrf id 0
Default local pref 100, local AS 65147
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*= 10.1.0.0/16 10.1.0.12 0 65515 i
*> 10.1.0.13 0 65515 i
*= 10.2.0.0/16 10.2.0.13 0 65515 i
*> 10.2.0.12 0 65515 i
* 10.3.1.0/24 10.2.0.13 0 65515 65520 65520 e
*= 10.1.0.12 0 65515 i
* 10.2.0.12 0 65515 65520 65520 e
*> 10.1.0.13 0 65515 i
* 10.3.2.0/24 10.2.0.13 0 65515 65520 65520 e
*= 10.1.0.12 0 65515 i
* 10.2.0.12 0 65515 65520 65520 e
*> 10.1.0.13 0 65515 i
*= 10.4.1.0/24 10.2.0.13 0 65515 i
* 10.1.0.12 0 65515 65520 65520 e
*> 10.2.0.12 0 65515 i
* 10.1.0.13 0 65515 65520 65520 e
*= 10.4.2.0/24 10.2.0.13 0 65515 i
* 10.1.0.12 0 65515 65520 65520 e
*> 10.2.0.12 0 65515 i
* 10.1.0.13 0 65515 65520 65520 e
*> 192.168.1.0/26 0.0.0.0 0 32768 i
Displayed 7 routes and 21 total paths
1つの Virtual Hub S2S ゲートウェイあたり2つの IPsec トンネルを張って BGP で経路交換しているので、東西合計で同一アドレスな経路を4つ学習します。この経路の中から BGP のベストパス選択アルゴリズムによってベストパスが選択されます。「西日本の Virtual Hub から聞こえてくる東日本の VNet の経路」のようなリモートハブ経由で学習した経路は AS-PATH が付与されており遠くみえるので選択されません。その結果、東日本 の VNet のネクストホップは東日本の Virtual Hub の S2S ゲートウェイ、西日本の VNet のネクストホップは西日本の S2S ゲートウェイになります。
- 東日本の VNet:東日本の Virtual Hub の S2S ゲートウェイ との IPsec トンネル
- 西日本の VNet:西日本の Virtual Hub の S2S ゲートウェイ との IPsec トンネル
最終的な通信経路
これらのルーティングによって、通信経路は次のようになります。
- オンプレミスと東日本の VNet 間の通信:東日本の Virtual Hub 経由
- オンプレミスと西日本の VNet 間の通信:西日本の Virtual Hub 経由

特に何もしない時の通信経路のイメージ
Virtual Hub のルーティングの優先順位
上記の通信経路は Virtual Hub のルーティングの優先順位の設定に依存します。
https://learn.microsoft.com/ja-jp/azure/virtual-wan/about-virtual-hub-routing-preference

ルーティングの優先順位
初期設定である ExpressRoute では、Virtual Hub は次の順番でベストパスを選択します。
- 最長の経路
- Virtual Hub 上のスタティックルート
- 自分自身が BGP で学習した ExpressRoute の経路
- 自分自身が BGP で学習した S2S VPN の経路
- 異なる Virtual Hub から BGP で学習した S2S VPN の経路
- 異なる Virtual Hub から BGP で学習した ExpressRoute の経路
- BGP の AS-PATH が最も短い経路
両リージョンの Virtual Hub がオンプレミスへの通信のネクストホップに自分自身の S2S ゲートウェイを利用するのは、4つ目の選択条件の結果です。
このベストパス選択アルゴリズムを変更できます。「普段は絶対に東日本の Virtual Hub を通ってほしいんだけどなぁ・・・」という場合には、Virtual Hub のルーティングの優先度を AS-PATH に変更します。AS-PATH の場合のベストパス選択アルゴリズムは次の通りです。
- 最長の経路
- Virtual Hub 上のスタティックルート
- BGP の AS-PATH が最も短い経路
- 自分自身が BGP で学習した ExpressRoute の経路
- 自分自身が BGP で学習した S2S VPN の経路
- 異なる Virtual Hub から BGP で学習した S2S VPN の経路
- 異なる Virtual Hub から BGP で学習した ExpressRoute の経路
今回の検証環境の Virtual Hub のルーティングの優先順位を AS-PATH に変更したうえで、BGP ルータが西日本の S2S ゲートウェイに広報する経路に AS-PATH をたくさん積みます。
frr version 8.5.3
frr defaults traditional
hostname omprevnet2vm
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!
ip route 10.1.0.12/32 vti06
ip route 10.1.0.13/32 vti05
ip route 10.2.0.12/32 vti08
ip route 10.2.0.13/32 vti07
!
router bgp 65147
bgp router-id 192.168.1.4
no bgp ebgp-requires-policy
neighbor 10.1.0.12 remote-as 65515
neighbor 10.1.0.12 ebgp-multihop
neighbor 10.1.0.13 remote-as 65515
neighbor 10.1.0.13 ebgp-multihop
neighbor 10.2.0.12 remote-as 65515
neighbor 10.2.0.12 ebgp-multihop
neighbor 10.2.0.13 remote-as 65515
neighbor 10.2.0.13 ebgp-multihop
!
address-family ipv4 unicast
network 192.168.1.0/26
neighbor 10.1.0.12 next-hop-self
neighbor 10.1.0.12 distribute-list 1 out
neighbor 10.1.0.13 next-hop-self
neighbor 10.1.0.13 distribute-list 1 out
neighbor 10.2.0.12 next-hop-self
neighbor 10.2.0.12 distribute-list 1 out
neighbor 10.2.0.12 route-map addpath out
neighbor 10.2.0.13 next-hop-self
neighbor 10.2.0.13 distribute-list 1 out
neighbor 10.2.0.13 route-map addpath out
exit-address-family
exit
!
access-list 1 seq 5 permit 192.168.1.0/26
!
route-map addpath permit 10
set as-path prepend 65147 65147 65147
exit
!
変更後の Virtual Hub のルートテーブルは次の通りです。
東日本の Virtual Hub
変更前と同じです
Get-AzVhubEffectiveRoutes -subId aa9de0c7-adae-4ccc-b041-e4720761aa65 -vhubRgName vwaneval -vhubName je-vhub -rtName defaultRouteTable
addressPrefixes : {10.3.1.0/24}
nextHops : virtualHubs/je-vhub/hubVirtualNetworkConnections/vnetconnBetweenJevhubAndJevnet1
nextHopType : Virtual Network Connection
routeOrigin : virtualHubs/je-vhub/hubVirtualNetworkConnections/vnetconnBetweenJevhubAndJevnet1
asPath :
addressPrefixes : {10.3.2.0/24}
nextHops : virtualHubs/je-vhub/hubVirtualNetworkConnections/vnetconnBetweenJevhubAndJevnet2
nextHopType : Virtual Network Connection
routeOrigin : virtualHubs/je-vhub/hubVirtualNetworkConnections/vnetconnBetweenJevhubAndJevnet2
asPath :
addressPrefixes : {192.168.1.0/26}
nextHops : vpnGateways/vpngwjehub
nextHopType : VPN_S2S_Gateway
routeOrigin : vpnGateways/vpngwjehub
asPath : 65147
addressPrefixes : {10.4.1.0/24}
nextHops : virtualHubs/jw-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/jw-vhub
asPath : 65520-65520
addressPrefixes : {10.4.2.0/24}
nextHops : virtualHubs/jw-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/jw-vhub
asPath : 65520-65520
西日本の Virtual Hub
Get-AzVhubEffectiveRoutes -subId aa9de0c7-adae-4ccc-b041-e4720761aa65 -vhubRgName vwaneval -vhubName jw-vhub -rtName defaultRouteTable
addressPrefixes : {10.4.1.0/24}
nextHops : virtualHubs/jw-vhub/hubVirtualNetworkConnections/vnetconnBetweenJwvhubAndJwvnet1
nextHopType : Virtual Network Connection
routeOrigin : virtualHubs/jw-vhub/hubVirtualNetworkConnections/vnetconnBetweenJwvhubAndJwvnet1
asPath :
addressPrefixes : {10.4.2.0/24}
nextHops : virtualHubs/jw-vhub/hubVirtualNetworkConnections/vnetconnBetweenJwvhubAndJwvnet2
nextHopType : Virtual Network Connection
routeOrigin : virtualHubs/jw-vhub/hubVirtualNetworkConnections/vnetconnBetweenJwvhubAndJwvnet2
asPath :
addressPrefixes : {192.168.1.0/26}
nextHops : virtualHubs/je-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/je-vhub
asPath : 65520-65520-65147
addressPrefixes : {10.3.1.0/24}
nextHops : virtualHubs/je-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/je-vhub
asPath : 65520-65520
addressPrefixes : {10.3.2.0/24}
nextHops : virtualHubs/je-vhub
nextHopType : Remote Hub
routeOrigin : virtualHubs/je-vhub
asPath : 65520-65520
西日本の Virtual Hub のオンプレミス宛てのルーティングのネクストホップが、自分のところの S2S ゲートウェイではなく東日本の Virtual Hub に向いているのが分かります。西日本の Virtual Hub には「東日本の Virtual Hub から学習した AS-PATH がついていない経路」と「自分自身の S2S ゲートウェイから学習した AS-PATH のついている経路」が存在します。ルーティングの優先順位を AS-PATH にしたことで、AS-PATH の少ない「東日本の Virtual Hub から学習した AS-PATH がついていない経路」がベストパスとなりルーティングテーブルに注入されていることが分かります。
ただしこの段階では、オンプレミスの西日本 VNet 宛てのルーティングが、西日本の Virtual Hub を向いてしまっています。
show bgp ipv4 u
% Ambiguous command: show bgp ipv4 u
omprevnet2vm# show bgp ipv4 unicast
BGP table version is 323, local router ID is 192.168.1.4, vrf id 0
Default local pref 100, local AS 65147
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*= 10.1.0.0/16 10.1.0.13 0 65515 i
*> 10.1.0.12 0 65515 i
*= 10.2.0.0/16 10.2.0.12 0 65515 i
*> 10.2.0.13 0 65515 i
*= 10.3.1.0/24 10.1.0.13 0 65515 i
* 10.2.0.12 0 65515 65520 65520 e
*> 10.1.0.12 0 65515 i
* 10.2.0.13 0 65515 65520 65520 e
*= 10.3.2.0/24 10.1.0.13 0 65515 i
* 10.2.0.12 0 65515 65520 65520 e
*> 10.1.0.12 0 65515 i
* 10.2.0.13 0 65515 65520 65520 e
* 10.4.1.0/24 10.1.0.13 0 65515 65520 65520 e
*= 10.2.0.12 0 65515 i
* 10.1.0.12 0 65515 65520 65520 e
*> 10.2.0.13 0 65515 i
* 10.4.2.0/24 10.1.0.13 0 65515 65520 65520 e
*= 10.2.0.12 0 65515 i
* 10.1.0.12 0 65515 65520 65520 e
*> 10.2.0.13 0 65515 i
*> 192.168.1.0/26 0.0.0.0 0 32768 i
このままだと、オンプレと西日本の VNet 間の通信は、行きは西日本の Virtual Hub を通り、戻りは東日本の Virtual Hub を通る非対称ルーティングになってしまいます。

非対称ルーティングのイメージ
非対称ルーティングを避けるために、オンプレミスのルータ側で、東の Virtual Hub から学習する経路に対して Local preference を400積んで、東の Virtual Hub から学習した経路が優先されるようにします。
frr version 8.5.3
frr defaults traditional
hostname omprevnet2vm
log syslog informational
no ipv6 forwarding
service integrated-vtysh-config
!
ip route 10.1.0.12/32 vti06
ip route 10.1.0.13/32 vti05
ip route 10.2.0.12/32 vti08
ip route 10.2.0.13/32 vti07
!
router bgp 65147
bgp router-id 192.168.1.4
no bgp ebgp-requires-policy
neighbor 10.1.0.12 remote-as 65515
neighbor 10.1.0.12 ebgp-multihop
neighbor 10.1.0.13 remote-as 65515
neighbor 10.1.0.13 ebgp-multihop
neighbor 10.2.0.12 remote-as 65515
neighbor 10.2.0.12 ebgp-multihop
neighbor 10.2.0.13 remote-as 65515
neighbor 10.2.0.13 ebgp-multihop
!
address-family ipv4 unicast
network 192.168.1.0/26
neighbor 10.1.0.12 next-hop-self
neighbor 10.1.0.12 distribute-list 1 out
neighbor 10.1.0.12 route-map addlp in
neighbor 10.1.0.13 next-hop-self
neighbor 10.1.0.13 distribute-list 1 out
neighbor 10.1.0.13 route-map addlp in
neighbor 10.2.0.12 next-hop-self
neighbor 10.2.0.12 distribute-list 1 out
neighbor 10.2.0.12 route-map addpath out
neighbor 10.2.0.13 next-hop-self
neighbor 10.2.0.13 distribute-list 1 out
neighbor 10.2.0.13 route-map addpath out
exit-address-family
exit
!
access-list 1 seq 5 permit 192.168.1.0/26
!
route-map addpath permit 10
set as-path prepend 65147 65147 65147
exit
!
route-map addlp permit 10
set local-preference 400
exit
すると、西日本の10.4 系アドレスの BGP のベストパスが東日本向けの IPsec トンネルに切り替わります。これで、東日本のリージョンの仮想ネットワークと西日本の仮想ネットワークともに、行きの通信と戻りの通信の両方が東日本 の Virtual Hub 経由になります。
show ip bgp
BGP table version is 276, local router ID is 192.168.1.4, vrf id 0
Default local pref 100, local AS 65147
Status codes: s suppressed, d damped, h history, * valid, > best, = multipath,
i internal, r RIB-failure, S Stale, R Removed
Nexthop codes: @NNN nexthop's vrf id, < announce-nh-self
Origin codes: i - IGP, e - EGP, ? - incomplete
RPKI validation codes: V valid, I invalid, N Not found
Network Next Hop Metric LocPrf Weight Path
*> 10.1.0.0/16 10.1.0.12 400 0 65515 i
*= 10.1.0.13 400 0 65515 i
*= 10.2.0.0/16 10.2.0.12 0 65515 i
*> 10.2.0.13 0 65515 i
* 10.3.1.0/24 10.2.0.12 0 65515 65520 65520 e
*> 10.1.0.12 400 0 65515 i
*= 10.1.0.13 400 0 65515 i
* 10.2.0.13 0 65515 65520 65520 e
* 10.3.2.0/24 10.2.0.12 0 65515 65520 65520 e
*> 10.1.0.12 400 0 65515 i
*= 10.1.0.13 400 0 65515 i
* 10.2.0.13 0 65515 65520 65520 e
* 10.4.1.0/24 10.2.0.12 0 65515 i
*> 10.1.0.12 400 0 65515 65520 65520 e
*= 10.1.0.13 400 0 65515 65520 65520 e
* 10.2.0.13 0 65515 i
* 10.4.2.0/24 10.2.0.12 0 65515 i
*> 10.1.0.12 400 0 65515 65520 65520 e
*= 10.1.0.13 400 0 65515 65520 65520 e
* 10.2.0.13 0 65515 i
*> 192.168.1.0/26 0.0.0.0 0 32768 i
まとめ
Virtual WAN の基本となるルーティングの挙動と、その挙動を変更するルーティングの優先順位について、実際に環境を組んで動作確認しました。ドキュメントを読むだけでなく実際に環境を組んでログを眺めると理解が深まりますね。
Note
- 当サイトは個人のブログです。このブログに示されている見解や意見は個人的なものであり、所属組織の見解や意見を表明するものではありません。
- 公開情報を踏まえて正確な情報を掲載するよう努めますが、その内容の完全性や正確性、有用性、安全性、最新性について一切保証しません。
- 添付文章やリンク先などを含む本サイトの内容は作成時点でのものであり、予告なく変更される場合があります。