はじめに
Azure Route Server の NEXT-HOP 属性に関するドキュメントが公開されました。
Route Server が NEXT-HOP 属性をサポートすると、実現できる構成が増えます。その一つが Secured Virtual Hub なしで実現する Azure Firewall 向けのデフォルトルートです。Route Server に対してネクストホップが Azure Firewall のプライベート IP アドレスなデフォルトルートを広報すると、Route Server は素直にそのルートを VNet に広報してくれます。その結果、Azure Firewall 向けのデフォルトルートを UDR で設定しなくても、仮想マシンからインターネットへの通信が Azure Firewall に向かいます。
さらに、Route Server の Branch-to-branch を有効にすれば、この Azure Firewall 向けのデフォルトルートを VPN Gateway/ER Gateway 経由でオンプレミスにも伝搬できます。オンプレミスから Azure 経由でインターネットにアクセスしたい要件はレアかもしれませんが、ER Gateway の先につながる Azure VMware Solution に対して Azure Firewall 向けのデフォルトルートを広報できるとなると夢が広がりそうです。
「百聞は一見に如かず」ということで実際に試した結果をまとめます。
構成
今回の動作を確認した構成は次の通りです。TestVM01 と TestVM02、FortiGate、OCI の4か所を利用して、自 VNet と VNet Peering、S2S VPN、Express Route の4つのポイントで意図したルートが聞こえてくるかを確認します。
BGP VM の設定
Ubuntu に Quagga をインストールして BGP ルータとします。BGP 関連の設定は次の通りです。せっかくなので、デフォルトルートだけでなく適当な/24の経路も広報します。
# show run
router bgp 65001
bgp router-id 10.1.4.10
network 0.0.0.0/0
network 10.100.1.0/24
network 10.100.2.0/24
network 10.100.3.0/24
neighbor 10.1.1.4 remote-as 65515
neighbor 10.1.1.4 soft-reconfiguration inbound
neighbor 10.1.1.5 remote-as 65515
neighbor 10.1.1.5 soft-reconfiguration inbound
!
address-family ipv6
exit-address-family
exit
!
ネクストホップ指定なし
ネクストホップを指定しないと、Quagga が Route Server に広報する経路のネクストホップは自身のプライベート IP アドレス(10.1.4.10)になります。
vm1# show bgp ipv4 unicast neighbors 10.1.1.5 advertised-routes
Network Next Hop Metric LocPrf Weight Path
*> 0.0.0.0 10.1.4.10 0 32768 i
*> 10.100.1.0/24 10.1.4.10 0 32768 i
*> 10.100.2.0/24 10.1.4.10 0 32768 i
*> 10.100.3.0/24 10.1.4.10 0 32768 I
TestVM01 と TestVM02 のルーティングは次の通りです。ネクストホップが Quagga のプライベート IP アドレス(10.1.4.10) になっています。
> Get-AzEffectiveRouteTable -NetworkInterfaceName vm02316 -ResourceGroupName rstest | Select-Object State,Source,AddressPrefix,NextHopType,NextHopIpAddress | ft
State Source AddressPrefix NextHopType NextHopIpAddress
----- ------ ------------- ----------- ----------------
Active Default {10.1.0.0/16} VnetLocal {}
Active Default {192.168.0.0/16} VNetPeering {}
Active VirtualNetworkGateway {10.100.1.0/24} VirtualNetworkGateway {10.1.4.10}
Active VirtualNetworkGateway {10.100.3.0/24} VirtualNetworkGateway {10.1.4.10}
Active VirtualNetworkGateway {10.100.2.0/24} VirtualNetworkGateway {10.1.4.10}
Active VirtualNetworkGateway {0.0.0.0/0} VirtualNetworkGateway {10.1.4.10}
> Get-AzEffectiveRouteTable -NetworkInterfaceName vm3460 -ResourceGroupName rstest | Select-Object State,Source,AddressPrefix,NextHopType,NextHopIpAddress | ft
State Source AddressPrefix NextHopType NextHopIpAddress
----- ------ ------------- ----------- ----------------
Active Default {192.168.0.0/16} VnetLocal {}
Active Default {10.1.0.0/16} VNetPeering {}
Active VirtualNetworkGateway {10.100.1.0/24} VirtualNetworkGateway {10.1.4.10}
Active VirtualNetworkGateway {10.100.3.0/24} VirtualNetworkGateway {10.1.4.10}
Active VirtualNetworkGateway {10.100.2.0/24} VirtualNetworkGateway {10.1.4.10}
Active VirtualNetworkGateway {0.0.0.0/0} VirtualNetworkGateway {10.1.4.10}
ネクストホップ指定あり
Route map を利用して、Azure Firewall のプライベート IP アドレス(10.1.0.4)をネクストホップに指定します。
# show run
router bgp 65001
bgp router-id 10.1.4.10
network 0.0.0.0/0
network 10.100.1.0/24
network 10.100.2.0/24
network 10.100.3.0/24
neighbor 10.1.1.4 remote-as 65515
neighbor 10.1.1.4 soft-reconfiguration inbound
neighbor 10.1.1.4 route-map out out
neighbor 10.1.1.5 remote-as 65515
neighbor 10.1.1.5 soft-reconfiguration inbound
neighbor 10.1.1.5 route-map out out
!
address-family ipv6
exit-address-family
exit
!
route-map out permit 10
set ip next-hop 10.1.0.4
!
# clear ip bgp * soft out
すると、Quagga が Route Server に広報する経路のネクストホップが Azure Firewall のプライベート IP アドレスになります。
vm1# show bgp ipv4 unicast neighbors 10.1.1.4 advertised-routes
Network Next Hop Metric LocPrf Weight Path
*> 0.0.0.0 10.1.0.4 0 32768 i
*> 10.100.1.0/24 10.1.0.4 0 32768 i
*> 10.100.2.0/24 10.1.0.4 0 32768 i
*> 10.100.3.0/24 10.1.0.4 0 32768 i
TestVM01 と TestVM02 のルーティングは次の通りです。ネクストホップが Azure Firewall のプライベート IP になっています。
> Get-AzEffectiveRouteTable -NetworkInterfaceName vm02316 -ResourceGroupName rstest | Select-Object State,Source,AddressPrefix,NextHopType,NextHopIpAddress | ft
State Source AddressPrefix NextHopType NextHopIpAddress
----- ------ ------------- ----------- ----------------
Active Default {10.1.0.0/16} VnetLocal {}
Active Default {192.168.0.0/16} VNetPeering {}
Active VirtualNetworkGateway {10.100.1.0/24} VirtualNetworkGateway {10.1.0.4}
Active VirtualNetworkGateway {10.100.3.0/24} VirtualNetworkGateway {10.1.0.4}
Active VirtualNetworkGateway {10.100.2.0/24} VirtualNetworkGateway {10.1.0.4}
Active VirtualNetworkGateway {0.0.0.0/0} VirtualNetworkGateway {10.1.0.4}
> Get-AzEffectiveRouteTable -NetworkInterfaceName vm3460 -ResourceGroupName rstest | Select-Object State,Source,AddressPrefix,NextHopType,NextHopIpAddress | ft
State Source AddressPrefix NextHopType NextHopIpAddress
----- ------ ------------- ----------- ----------------
Active Default {192.168.0.0/16} VnetLocal {}
Active Default {10.1.0.0/16} VNetPeering {}
Active VirtualNetworkGateway {10.100.1.0/24} VirtualNetworkGateway {10.1.0.4}
Active VirtualNetworkGateway {10.100.3.0/24} VirtualNetworkGateway {10.1.0.4}
Active VirtualNetworkGateway {10.100.2.0/24} VirtualNetworkGateway {10.1.0.4}
Active VirtualNetworkGateway {0.0.0.0/0} VirtualNetworkGateway {10.1.0.4}
デフォルトルートが Azure Firewall を向いているので、TestVM からインターネットにアクセスしようとすると Azure Firewall でブロックされます。Quagga がネクストホップ指定で広報したデフォルトルートが動作している証拠です。
vm3:~$ curl ifconfig.me
Action: Deny. Reason: No rule matched. Proceeding with default action.
Branch-to-branch の挙動
Route Server の Branch-to-branch を無効にした状態では、VPN Gateway は Route Server から経路を受信しません。
> Get-AzVirtualNetworkGatewayLearnedRoute -VirtualNetworkGatewayName vpngw -ResourceGroupName rstest | ft *
LocalAddress Network NextHop SourcePeer Origin AsPath Weight
------------ ------- ------- ---------- ------ ------ ------
10.1.5.4 10.1.0.0/16 10.1.5.4 Network 32768
10.1.5.4 192.168.0.0/16 10.1.5.4 Network 32768
10.1.5.4 172.16.10.132/32 10.1.5.4 Network 32768
10.1.5.5 10.1.0.0/16 10.1.5.5 Network 32768
10.1.5.5 192.168.0.0/16 10.1.5.5 Network 32768
10.1.5.5 172.16.10.132/32 10.1.5.4 10.1.5.4 IBgp 32768
一方で、Branch-to-branch を有効にすると、VPN Gateway は Route Server から経路を受け取ります。受け取った経路の中に Quagga が広報している Azure Firewall 向きのデフォルトルートを確認できます。
> Get-AzVirtualNetworkGatewayLearnedRoute -VirtualNetworkGatewayName vpngw -ResourceGroupName rstest | ft *
LocalAddress Network NextHop SourcePeer Origin AsPath Weight
------------ ------- ------- ---------- ------ ------ ------
10.1.5.4 10.1.0.0/16 10.1.5.4 Network 32768
10.1.5.4 192.168.0.0/16 10.1.5.4 Network 32768
10.1.5.4 10.100.1.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.4 10.100.1.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.4 10.100.2.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.4 10.100.2.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.4 10.100.3.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.4 10.100.3.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.4 0.0.0.0/0 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.4 0.0.0.0/0 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.4 172.16.10.132/32 10.1.5.4 Network 32768
10.1.5.5 10.1.0.0/16 10.1.5.5 Network 32768
10.1.5.5 192.168.0.0/16 10.1.5.5 Network 32768
10.1.5.5 10.100.1.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.5 10.100.1.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.5 10.100.2.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.5 10.100.2.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.5 10.100.3.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.5 10.100.3.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.5 0.0.0.0/0 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.5 0.0.0.0/0 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.5 172.16.10.132/32 10.1.5.4 10.1.5.4 IBgp 32768
ER Gateway も同様です。Route Server から経路を受け取ります。受け取った経路の中に Quagga が広報している Azure Firewall 向きのデフォルトルートを確認できます。
> Get-AzVirtualNetworkGatewayLearnedRoute -ResourceGroupName rstest -ResourceName ergw | ft *
LocalAddress Network NextHop SourcePeer Origin AsPath Weight
------------ ------- ------- ---------- ------ ------ ------
10.1.5.13 10.1.0.0/16 10.1.5.13 Network 32768
10.1.5.13 192.168.0.0/16 10.1.5.13 Network 32768
10.1.5.13 10.100.1.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.13 10.100.1.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.13 10.100.2.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.13 10.100.2.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.13 10.100.3.0/24 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.13 10.100.3.0/24 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.13 0.0.0.0/0 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.13 0.0.0.0/0 10.1.0.4 10.1.1.5 IBgp 65001 32768
10.1.5.13 10.6.0.0/26 10.1.5.6 10.1.5.6 EBgp 12076-31898 32769
10.1.5.13 10.6.0.0/26 10.1.5.7 10.1.5.7 EBgp 12076-31898 32769
10.1.5.13 10.5.0.0/26 10.1.5.6 10.1.5.6 EBgp 12076-31898 32769
10.1.5.13 10.5.0.0/26 10.1.5.7 10.1.5.7 EBgp 12076-31898 32769
ER Gateway は受信したデフォルトルートを BGP ピアに広報します。その結果、下図の通り、Express Route Circuit 経由で接続した OCI のルーティングテーブルにデフォルトルートが乗ります。
ですが、VPN Gateway は受信したデフォルトルートを BGP ピアに広報しません。
# Route Server からデフォルトルートを受信しているにも関わらず
> Get-AzVirtualNetworkGatewayLearnedRoute -VirtualNetworkGatewayName vpngw -ResourceGroupName rstest | ft *
LocalAddress Network NextHop SourcePeer Origin AsPath Weight
------------ ------- ------- ---------- ------ ------ ------
10.1.5.4 10.1.0.0/16 10.1.5.4 Network 32768
10.1.5.4 192.168.0.0/16 10.1.5.4 Network 32768
10.1.5.4 0.0.0.0/0 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.4 0.0.0.0/0 10.1.0.4 10.1.1.5 IBgp 65001 32768
(中略)
10.1.5.4 172.16.10.132/32 10.1.5.4 Network 32768
10.1.5.5 10.1.0.0/16 10.1.5.5 Network 32768
10.1.5.5 192.168.0.0/16 10.1.5.5 Network 32768
10.1.5.5 0.0.0.0/0 10.1.0.4 10.1.1.4 IBgp 65001 32768
10.1.5.5 0.0.0.0/0 10.1.0.4 10.1.1.5 IBgp 65001 32768
(中略)
10.1.5.5 172.16.10.132/32 10.1.5.4 10.1.5.4 IBgp 32768
# S2S VPN の BGP ピアにデフォルトルートを広報していない
> Get-AzVirtualNetworkGatewayAdvertisedRoute -VirtualNetworkGatewayName vpngw -ResourceGroupName rstest -Peer 172.16.10.132 | ft *
LocalAddress Network NextHop SourcePeer Origin AsPath Weight
------------ ------- ------- ---------- ------ ------ ------
10.1.5.4 10.1.0.0/16 10.1.5.4 Igp 65515 0
10.1.5.4 192.168.0.0/16 10.1.5.4 Igp 65515 0
10.1.5.4 10.100.3.0/24 10.1.5.4 Igp 65515-65001 0
10.1.5.4 10.100.2.0/24 10.1.5.4 Igp 65515-65001 0
10.1.5.4 10.100.1.0/24 10.1.5.4 Igp 65515-65001 0
デフォルトルートを S2S VPN の先の BGP ピアに広報したい場合には、0.0.0.0/0 を 0.0.0.0/1 と 128.0.0.0/1 に分割する必要があります。Quagga が広報するルートを2つに分けると、VPN 先の FortiGate は2つのルートを受信できました。
fgt1Vm # get router info bgp network
Network Next Hop Metric LocPrf Weight RouteTag Path
*> 0.0.0.0/1 10.1.5.4 0 0 0 65515 65001 i <-/1>
*> 10.1.0.0/16 10.1.5.4 0 0 0 65515 i <-/1>
*> 10.100.1.0/24 10.1.5.4 0 0 0 65515 65001 i <-/1>
*> 10.100.2.0/24 10.1.5.4 0 0 0 65515 65001 i <-/1>
*> 10.100.3.0/24 10.1.5.4 0 0 0 65515 65001 i <-/1>
*> 128.0.0.0/1 10.1.5.4 0 0 0 65515 65001 i <-/1>
*> 192.168.0.0/16 10.1.5.4 0 0 0 65515 i <-/1>
注意点
Azure Firewall 向けのデフォルトルートを受け取りたくないセグメントには、Route Server にデフォルトルートを広報する前に「UDR でデフォルトルートを Internet に向けたルートテーブル」か「ルート伝搬を無効にしたルートテーブル」を割り当ててください。Route Server に広報したルートは問答無用で VNet に伝搬されます。その結果、ネクストホップが Internet なデフォルトルートを必要とするシステムのサブネットであってもインターネットへの通信が Azure Firewall 経由となってしまい、非対称ルーティングによる通信不可や送信元グローバル IP アドレスの変更といった影響が発生します。
また、Availability Zone や Availability Set を利用して複数台の BGP ルータ用 VM を起動することで、Route Server にデフォルトルートを広報する VM の可用性を高めてください。BGP ルータな VM が停止すると Route Server へのデフォルトルートの広報も停止してしまい、Route Server が VNet に広報していた Azure Firewall 向けのデフォルトルートが消失します。そして、ネクストホップが Internet な規定のデフォルトルートが有効になります。その結果、仮想マシンが Azure Firewall を経由せずにインターネットにアクセスできるようになり、本来は許可されていない宛先への通信や送信元グローバル IP アドレスの変化といった影響が発生します。
まとめ
本エントリでは、新しく追加された Route Server の NEXT-HOP 属性を利用して、Azure Firewall 向けのデフォルトルートを生成する方法を試してみました。いずれ Azure Firewall 自身が Route Server にデフォルトルートを広報する日がくるかもしれませんし、そもそも利用する機会はかなり限定的ですが、痒い所に手が届くアップデートでした。