Azure Route Server を利用して Azure Firewall へのデフォルトルートを生成する

azure
Published: 2022-07-20

はじめに

Azure Route Server の NEXT-HOP 属性に関するドキュメントが公開されました。

Next Hop IP support

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 のルーティングテーブルにデフォルトルートが乗ります。

Express Route と接続している 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 にデフォルトルートを広報する日がくるかもしれませんし、そもそも利用する機会はかなり限定的ですが、痒い所に手が届くアップデートでした。