Azure Route Server による ExpressRoute と VPN のトランジット接続

ExpressRoute と VPN のトランジット接続 (2 つの Gateway を経由した接続) は Azure Virtual WAN で利用可能でしたが、Route Server を利用する構成でもサポートされているため、実際に動作を確認してみました。

https://docs.microsoft.com/ja-jp/azure/route-server/expressroute-vpn-support


ExpressRoute/VPN を共存環境で構成済みの場合に、VPN を経由して ExpressRoute で接続されたオンプレ環境や仮想ネットワークに接続したい (逆のパターンも含む) といった要望はあるかと思います。
例えば以下のような構成の場合、左側の OnpreVM1 から VPN/ER を経由し、右側の oci-vm2 に接続することはできません。同様に自宅等から P2S で VPNGW に接続したユーザーについても oci-vm2 に接続することはできません。
これは VPN/ER 用のそれぞれの仮想ネットワークゲートウェイで経路が交換されていないためとなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/4031e525-87c8-2c04-3eb1-c5cc61ed68b5.png)
そのような構成において、Azure Route Server (ARS) をデプロイし、ブランチ間のトラフィックを許可することで、ER, VPN それぞれの仮想ネットワークゲートウェイと ARS で BGP のネイバーを張り、お互いの経路を広報できるようになります。この構成の場合、独自の NVA の構成は不要です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/7edffd62-9e18-1072-c696-fe9b3d192a7d.png)

以下に検証手順と検証結果を記載していきます。

# 1. Azure ExpressRoute と Oracle Cloud Infrastructure の接続
以下等を参照しながら、ER と OCI を閉域網で接続します。その他、いくつか参考となるブログ等もあります。
https://docs.microsoft.com/ja-jp/azure/virtual-machines/workloads/oracle/configure-azure-oci-networking
※ ER/OCI で接続できるリージョンは限られているので注意が必要です。
https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/azure.htm


# 2. VPN Gateway を ExpressRoute 用の VNet にデプロイ
<font color="Red">VPN Gateway デプロイ時の必須要件

- アクティブ/アクティブの構成
- BGP 有効
- ASN: 65515 
- Route Server より先にデプロイ</font>
- GatewaySubnet は /27 またはそれより広いアドレス空間

アクティブ/アクティブは Route Server の要件で、ASN: 65515 は ER/VPN 共存環境の要件です。

以下のような設定でデプロイします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/c574d28c-8459-fa2d-b694-b9661817ea8b.png)


デプロイ後、OnpreVM1 から接続可能か確認してみましたが、以下の通り接続はできませんでした。(想定通り)

```
[user@OnpreVM1 ~]$ ping 10.100.0.221
PING 10.100.0.221 (10.100.0.221) 56(84) bytes of data.
^C
--- 10.100.0.221 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 3999ms
```

念のため、P2S の接続も確認してみましたが、以下の通り接続はできません。※トランジット接続する場合、クライアント側で経路を手動で追加する必要があります。

```
C:\WINDOWS\system32>route add 10.0.0.0 mask 255.0.0.0 10.1.0.129
 OK!

C:\WINDOWS\system32>ping 10.100.0.221

Pinging 10.100.0.221 with 32 bytes of data:
Request timed out.
Request timed out.
Request timed out.
Request timed out.

Ping statistics for 10.100.0.221:
    Packets: Sent = 4, Received = 0, Lost = 4 (100% loss),
```

Azure ポータルから OnpreVM1 の有効なルートを確認。OCI 側のレンジ (10.100.0.0/24) が広報されていないことがわかります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/2d9650ee-e90e-6b9e-a186-4ec3f507c8f7.png)

# 3. Route Server を構成
Route Server の要件

- Standard SKU のパブリック IP アドレス 1 つ
- RouteServerSubnet という名前のサブネットが必要 (/27 またはそれより広いアドレス空間)
- VPN Gateway を先にデプロイ

## 3-1. パブリック IP を作成
Azure CLI にてリソースを作成します。

```
az network public-ip create  --name RouteServerPIP   --resource-group EREastUS --version IPv4   --sku Standard
```

## 3-2. Route Server をデプロイ
約 20 分ほどかかります。ASN は既定で 65515 となります。

```
サブネットのリソース ID を取得します。(VNet/Subnet は事前に作成)
subnet_id=$(az network vnet subnet show --name RouteServerSubnet --resource-group EREastUS --vnet-name ERVNet --query id -o tsv) 

Route Server をデプロイします。
az network routeserver create  --name RouteServer --resource-group EREastUS --hosted-subnet $subnet_id --public-ip-address RouteServerPIP
```

以下にある通り、デプロイ時にオンプレとの接続が切れるため注意が必要。

https://learn.microsoft.com/ja-jp/azure/route-server/troubleshoot-route-server#why-do-i-lose-connectivity-to-my-on-premises-network-over-expressroute-andor-azure-vpn-when-im-deploying-a-route-server-to-a-virtual-network-that-already-has-expressroute-gateway-andor-azure-vpn-gateway

:::note warn
仮想ネットワークにルート サーバーをデプロイする場合は、ゲートウェイと仮想ネットワークの間のコントロール プレーンを更新する必要があります。 **この更新中、しばらくの間、仮想ネットワーク内の VM からオンプレミス ネットワークへの接続が失われます。** 運用環境にルート サーバーを展開するメインテナントをスケジュールすることを強くお勧めします。
:::


# 4. ブランチ間のトラフィックを許可

```
az network routeserver update  --name RouteServer --resource-group EREastUS --allow-b2b-traffic true
```

# 5. 疎通確認
Azure ポータルから OnpreVM1 の有効なルートとして OCI 側のレンジ (10.100.0.0/24) が広報されていることを確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2266293/90bc11b5-ab6d-c54e-1336-b179206ff087.png)

OnpreVM1 から接続可能となってました。SSH でログインできることも確認できました。

```
[user@OnpreVM1 ~]$ ping 10.100.0.221
PING 10.100.0.221 (10.100.0.221) 56(84) bytes of data.
64 bytes from 10.100.0.221: icmp_seq=1 ttl=61 time=7.58 ms
64 bytes from 10.100.0.221: icmp_seq=2 ttl=61 time=5.27 ms
64 bytes from 10.100.0.221: icmp_seq=3 ttl=61 time=6.50 ms
64 bytes from 10.100.0.221: icmp_seq=4 ttl=61 time=5.52 ms
^C
--- 10.100.0.221 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 5.272/6.221/7.581/0.915 ms

[user@OnpreVM1 ~]$ ssh opc@10.100.0.221
Last login: Wed Nov 24 01:46:52 2021 from 10.10.1.4
[opc@oci-vm2 ~]$
```

P2S の接続も確認してみましたが、以下の通り接続可能でした。

```
C:\WINDOWS\system32>ping 10.100.0.221

Pinging 10.100.0.221 with 32 bytes of data:
Reply from 10.100.0.221: bytes=32 time=159ms TTL=60
Reply from 10.100.0.221: bytes=32 time=159ms TTL=60
Reply from 10.100.0.221: bytes=32 time=159ms TTL=60
Reply from 10.100.0.221: bytes=32 time=159ms TTL=60

Ping statistics for 10.100.0.221:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 159ms, Maximum = 159ms, Average = 159ms
```