AzureとOCIでサイト間(S2S)VPNをやってみた

AzureとOCIの間を接続するにはExpressRouteとFastConnectを使ったInterconnectがまず想起されますが、西日本やバックアップ用途を想定して、サイト間(サイト対サイト:S2S)のVPN環境を各クラウドで用意されているサービスを使って構築してみました。
# 結果
**つながるけれども使えない**

# どういうこと?
Azure側はVPNゲートウェイ、OCI側はVPN接続を、IKEv2で設定すればつながります。
![Azure-VNG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/3c6a1b5f-5699-c35d-0813-66eba35b9a82.png)
![OCI-VPN1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/282e97f6-625e-3af2-666f-b6bf28132ba6.png)
OCIはウィザードで作ると2つのトンネルを用意するので、Azureはアクティブ/スタンバイの仮想ネットワークゲートウェイから2本接続しています。
AzureのVMからルーティングテーブルを見ると、下記のようになります。
![Azure-Route.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/be62e374-4bc8-d44a-1f97-cf4871811beb.png)
pingを打ってみると、疎通します。今回はAzureは西日本リージョン、OCIは東京リージョンについないでいます。
![Azure-ping.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/0d864724-f205-2dc8-4595-8efb2f6a4c6c.png)
しかし、**接続から1時間経つとIPSecが切れてしまい、疎通しなくなります**。
![OCI-VPN2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/974ee74f-e18a-cdbd-8222-73bfd7ed44a9.png)

# なぜ切れる?
どうやら、それぞれのIPSecで使えるパラメータが異なるためのようです。
具体的には、サポートされるPFS(Perfect Forward Security)が異なっていました。

## サポートされるPFSグループ
**RouteBased**

| クラウド | サポートされるPFSグループ |
|:-:|:-:|
| Azure | 1, 2, 14, 24, なし |
| OCI | 5 |

**出典**

- Azure: [RouteBased VPN IPsec セキュリティ アソシエーション (IKE クイック モード SA) プラン](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpn-devices#routebased-vpn-ipsec-security-association-ike-quick-mode-sa-offers)
- OCI: [サポートされているIPSecパラメータ](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Network/Reference/supportedIPsecparams.htm)

**PFSの簡易表**

| PFSグループ | 内容 | Azure表記 |
|:-:|:-:|:-:|
| 1 | 768-bit, DH | PFS1 |
| 2 | 1024-bit, DH | PFS2 |
| 5 | 1536-bit, DH |  |
| 14 | 2048-bit, DH | PFS2048 |
| 19 | 256-bit, DH (Elliptic Curve) | ECP256 |
| 20 | 384-bit, DH (Elliptic Curve) | ECP384 |
| 24 | 2048-bit, DH/DSA | PFS24 |

**追加情報**

- [ポリシーでサポートされる暗号アルゴリズムとキーの強度](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-ipsecikepolicy-rm-powershell#part-2---supported-cryptographic-algorithms--key-strengths)

# 解決策
3つぐらい方法があるようです。

- サポートにSRを出す
- Libreswanを使う
- Windows Server RRASを使う

## サポートにSRを出す
Stack Overflowに[VPN between Oracle Cloud and Azure](https://stackoverflow.com/questions/60147325/vpn-between-oracle-cloud-and-azure)という投稿があり、オラクルにて対応してもらったようです。これが通常できることなのかどうかはわかりませんので、個別にサポートにSRを出して確認する必要があると思われますが、ここで紹介したクラウド側のサービスで構成できる可能性があります。
> I reached out to Oracle and they managed to change the setting for Perfect Forward Secrecy (PFS) to support the preferred Azure PFS setting (PFS 2). This stabilized the connection.

## Libreswanを使う
ここで紹介した構成ではなく、オラクルでは、その他のクラウドへのアクセスとしてLibreswanを使った構成を[こちら](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Network/Concepts/libreswan.htm)で公開しています。そして、実際にAzureとOCIを接続した例も[こちら](https://blogs.techvan.co.jp/oci/2020/01/20/oci%E3%81%A8azure%E3%81%A7vpn%E6%8E%A5%E7%B6%9A%E3%82%92%E3%81%97%E3%81%A6%E3%81%BF%E3%81%9F/)で公開されておられる方がいらっしゃいます。
この構成の場合は、パフォーマンスや運用を事前にしっかり確認しておく必要があると思われます。

## Windows Server RRASを使う
Windows ServerにRouting and Remote Access Service (RRAS)という機能があり、こちらをネットワーク仮想アプライアンスとしてOCIのVM内に構築して、IPSecのVPNを張ることができます。
[こちら](https://qiita.com/takeokams/items/4c5411290c55752e2670)に記事を書いておきました。