AzureとOCIをS2S VPNでつないでみた (Windows Server RRAS)

AzureとOCIを接続するために、Azureのサイト間(S2S) VPNと、OCI上に立てたWindows ServerのRouting and Remote Access Service (RRAS)を使ってみました。
ただし、[Azure VM上ではRRASをサポートしていないことを明示](https://docs.microsoft.com/ja-jp/troubleshoot/azure/virtual-machines/server-software-support)していますので、この構成もサポートされない可能性があることにご注意ください。

# 構成図
![Diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/5745d4b4-7787-83b7-c0e4-8450b99dce32.png)

# パフォーマンス
```shell-session
[azureuser@Azure-Linux ~]$ ping 10.0.1.2
PING 10.0.1.2 (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2: icmp_seq=1 ttl=63 time=10.9 ms
64 bytes from 10.0.1.2: icmp_seq=2 ttl=63 time=10.4 ms
64 bytes from 10.0.1.2: icmp_seq=3 ttl=63 time=10.7 ms
64 bytes from 10.0.1.2: icmp_seq=4 ttl=63 time=10.7 ms
64 bytes from 10.0.1.2: icmp_seq=5 ttl=63 time=10.5 ms
64 bytes from 10.0.1.2: icmp_seq=6 ttl=63 time=10.7 ms
64 bytes from 10.0.1.2: icmp_seq=7 ttl=63 time=10.7 ms
64 bytes from 10.0.1.2: icmp_seq=8 ttl=63 time=10.8 ms
64 bytes from 10.0.1.2: icmp_seq=9 ttl=63 time=10.9 ms
64 bytes from 10.0.1.2: icmp_seq=10 ttl=63 time=11.1 ms
64 bytes from 10.0.1.2: icmp_seq=11 ttl=63 time=10.8 ms
64 bytes from 10.0.1.2: icmp_seq=12 ttl=63 time=10.8 ms
^C
--- 10.0.1.2 ping statistics ---
12 packets transmitted, 12 received, 0% packet loss, time 11017ms
rtt min/avg/max/mdev = 10.454/10.796/11.132/0.179 ms
[azureuser@Azure-Linux ~]$
```
- 1本計測

```shell-session
[azureuser@Azure-Linux ~]$ iperf3 -c 10.0.1.2
Connecting to host 10.0.1.2, port 5201
[  4] local 192.168.0.4 port 54122 connected to 10.0.1.2 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  13.8 MBytes   116 Mbits/sec    0    825 KBytes
[  4]   1.00-2.00   sec  15.3 MBytes   128 Mbits/sec    9    680 KBytes
[  4]   2.00-3.00   sec  15.5 MBytes   130 Mbits/sec    0    760 KBytes
[  4]   3.00-4.00   sec  13.7 MBytes   115 Mbits/sec    0    816 KBytes
[  4]   4.00-5.00   sec  14.5 MBytes   122 Mbits/sec   34    616 KBytes
[  4]   5.00-6.00   sec  15.3 MBytes   128 Mbits/sec    0    654 KBytes
[  4]   6.00-7.00   sec  8.73 MBytes  73.2 Mbits/sec    0    679 KBytes
[  4]   7.00-8.00   sec  16.1 MBytes   135 Mbits/sec    0    694 KBytes
[  4]   8.00-9.00   sec  15.9 MBytes   133 Mbits/sec    0    699 KBytes
[  4]   9.00-10.00  sec  14.7 MBytes   123 Mbits/sec    0    700 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   144 MBytes   120 Mbits/sec   43             sender
[  4]   0.00-10.00  sec   141 MBytes   119 Mbits/sec                  receiver

iperf Done.
[azureuser@Azure-Linux ~]$
```

- 2本同時計測

```shell-session
[azureuser@Azure-Linux ~]$ iperf3 -c 10.0.1.2
Connecting to host 10.0.1.2, port 5201
[  4] local 192.168.0.4 port 35698 connected to 10.0.1.2 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  6.49 MBytes  54.4 Mbits/sec    0    392 KBytes
[  4]   1.00-2.00   sec  7.14 MBytes  59.9 Mbits/sec    2    659 KBytes
[  4]   2.00-3.00   sec  4.66 MBytes  39.1 Mbits/sec    0    662 KBytes
[  4]   3.00-4.00   sec  4.78 MBytes  40.1 Mbits/sec    0    667 KBytes
[  4]   4.00-5.00   sec  4.84 MBytes  40.6 Mbits/sec    3    668 KBytes
[  4]   5.00-6.00   sec  3.66 MBytes  30.7 Mbits/sec    3    477 KBytes
[  4]   6.00-7.00   sec  2.48 MBytes  20.8 Mbits/sec    1    533 KBytes
[  4]   7.00-8.00   sec  3.95 MBytes  33.2 Mbits/sec    1    537 KBytes
[  4]   8.00-9.00   sec  2.54 MBytes  21.3 Mbits/sec    0    540 KBytes
[  4]   9.00-10.00  sec  4.07 MBytes  34.1 Mbits/sec    1    541 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  44.6 MBytes  37.4 Mbits/sec   11             sender
[  4]   0.00-10.00  sec  43.1 MBytes  36.1 Mbits/sec                  receiver

iperf Done.
[azureuser@Azure-Linux ~]$
```
```shell-session
[azureuser@Azure-Linux2 ~]$ iperf3 -c 10.0.1.3
Connecting to host 10.0.1.3, port 5201
[  4] local 192.168.0.5 port 50236 connected to 10.0.1.3 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  2.71 MBytes  22.7 Mbits/sec    0    215 KBytes
[  4]   1.00-2.00   sec  3.83 MBytes  32.2 Mbits/sec    0    374 KBytes
[  4]   2.00-3.00   sec  4.01 MBytes  33.6 Mbits/sec   19    306 KBytes
[  4]   3.00-4.00   sec  3.01 MBytes  25.2 Mbits/sec    0    342 KBytes
[  4]   4.00-5.00   sec  3.83 MBytes  32.2 Mbits/sec    1    356 KBytes
[  4]   5.00-6.00   sec  5.31 MBytes  44.5 Mbits/sec    0    366 KBytes
[  4]   6.00-7.00   sec  4.78 MBytes  40.1 Mbits/sec    1    373 KBytes
[  4]   7.00-8.00   sec  5.84 MBytes  49.0 Mbits/sec    0    382 KBytes
[  4]   8.00-9.00   sec  5.37 MBytes  45.0 Mbits/sec    0    392 KBytes
[  4]   9.00-10.00  sec  5.60 MBytes  47.0 Mbits/sec    0    401 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec  44.3 MBytes  37.2 Mbits/sec   21             sender
[  4]   0.00-10.00  sec  43.4 MBytes  36.4 Mbits/sec                  receiver

iperf Done.
[azureuser@Azure-Linux2 ~]$
```

- VPNを通さないパブリック同士

```shell-session
[azureuser@Azure-Linux2 ~]$ iperf3 -c 168.138.42.98
Connecting to host 168.138.42.98, port 5201
[  4] local 192.168.0.5 port 38456 connected to 168.138.42.98 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  86.6 MBytes   726 Mbits/sec  990   1.19 MBytes
[  4]   1.00-2.00   sec  52.5 MBytes   440 Mbits/sec  287    482 KBytes
[  4]   2.00-3.00   sec  57.5 MBytes   482 Mbits/sec    0    567 KBytes
[  4]   3.00-4.00   sec  66.2 MBytes   556 Mbits/sec    0    650 KBytes
[  4]   4.00-5.00   sec  58.8 MBytes   493 Mbits/sec  113    530 KBytes
[  4]   5.00-6.00   sec  61.2 MBytes   514 Mbits/sec    0    614 KBytes
[  4]   6.00-7.00   sec  51.2 MBytes   430 Mbits/sec   48    505 KBytes
[  4]   7.00-8.00   sec  58.8 MBytes   493 Mbits/sec    0    587 KBytes
[  4]   8.00-9.00   sec  67.5 MBytes   566 Mbits/sec   66    469 KBytes
[  4]   9.00-10.00  sec  53.8 MBytes   451 Mbits/sec    0    549 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   614 MBytes   515 Mbits/sec  1504             sender
[  4]   0.00-10.00  sec   611 MBytes   513 Mbits/sec                  receiver

iperf Done.
[azureuser@Azure-Linux2 ~]$
```
計測は、2020年11月15日(日) 午後のものです。

# セットアップ
## Azure
### Azure S2S VPN Gateway
[Docsの手順](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-site-to-site-resource-manager-portal)に従ってAzure側をセットアップします。
VPN Gatewayの[SKU](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpngateways#gateway-skus)で帯域幅が決まるので、今回は1.25 GbpsのGeneration2 VpnGw2を選択しましたが、上のパフォーマンスを見るとVpnGw1でもよいかもしれません。
ローカルネットワークゲートウェイの作成はOCIのパートを作成してから行います。

## OCI
### VCN
今回は簡単に、インターネット接続性を持つVCNをウイザードで作成します。
![VCN1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/e58728d8-1f47-593c-938b-c02f7099cfaa.png)

### Windows Server VM
Windows Server 2016で作成します。デフォルトのシェイプを選択します。
![OCI-VM1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/7fd4fa5f-2275-870f-fba0-1bab0491a56b.png)
> 2020年11月15日現在、Windows Server 2019の"Windows-Server-2019-Standard-Edition-VM-E3-2020.10.20-0"をイメージを使うと、RRASの設定でエラーとなることが多いようなので、Windows Server 2016を今回は使っています。

ネットワークはパブリックサブネットに接続します。
リモートデスクトップでつなぐため、パブリックサブネットのセキュリティリスト、イングレスにRDPを追加します。この時、[接続元として利用しているIPアドレス](https://www.cman.jp/network/support/go_access.cgi)を指定するなどしてもよいと思います。
![OCI-VM2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/74250905-b818-8a4d-8562-85ace6ebfacc.png)
リモートデスクトップで接続したら、パスワードを設定し、ネットワーク探索はNoで設定します。

### RRAS
#### インストール
サーバーマネージャーからAdd Roles and Featuresを起動します。
![OCI-RRAS1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/3c2eb0f1-6f01-efcf-6939-c3433ba7267b.png)
![OCI-RRAS2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/bc05729f-f6a6-4054-04cb-a1b1f70e29f1.png)
![OCI-RRAS3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/7c1d5dd8-0c91-da39-c7ff-020e5946dd09.png)
![OCI-RRAS4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/d81f1a7f-ce39-60c3-de52-eecfd60e7ebf.png)

#### 設定
サーバーマネージャーからRouting and Remote Accessを起動します。
![OCI-RRAS5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/67362d99-b654-867c-9b18-0c1fe3e7f4d2.png)
![OCI-RRAS6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/d60bd5e4-e7e3-ebb5-8f7d-ca7ffd27ee63.png)
![OCI-RRAS7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/53c14754-63b4-05b8-1a7a-1ebf3d4c7376.png)
![OCI-RRAS8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/6e5a1a4e-b931-a298-ec38-11dc2525b175.png)
![OCI-RRAS9.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/d4f47dd1-9f79-da30-14bd-0cdca660ee87.png)
![OCI-RRAS10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/26e0e59e-bb5c-4da4-ae8c-7d3b890c5691.png)
![OCI-RRAS11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/bff94ca4-2765-6f9e-f690-06efeddf74fa.png)
![OCI-RRAS12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/1acb58e9-8153-61a2-91b9-f16ee3f382da.png)
![OCI-RRAS13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/1625346e-0da1-5e16-4cb5-f43831d8caa3.png)
![OCI-RRAS14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/475ceafe-b683-228b-f81e-6ad10cb58639.png)
![OCI-RRAS15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/c994cf9f-3322-f50a-9d6c-d3d7e2aaf05d.png)
![OCI-RRAS16.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/723b1010-6e4c-5a71-0faa-5d22b72078c6.png)
![OCI-RRAS17.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/0a1c2902-dd85-8955-86a1-f3ae0d61faee.png)
![OCI-RRAS18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/332b079f-7539-2cbb-1609-23bb3e779849.png)
![OCI-RRAS19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/85f82642-2cb5-c6aa-57a4-d8caaad7ccab.png)
![OCI-RRAS20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/9202146e-4800-6d0e-b75b-696bbd8312dd.png)
![OCI-RRAS21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/e24dcf0a-9da5-8185-8f8c-1ec6f66ba928.png)
Azure VNetのアドレス空間
![OCI-RRAS22.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/684f614d-3d0f-cb22-ed05-5f9394071911.png)
![OCI-RRAS23.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/b70a207b-8a8f-01e4-c10d-ada6833c31c5.png)

### ルーティング設定
#### 仮想NICでのパケット転送許可 (自分のものでないパケットも送受信可能にする)
![OCI-VM3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/b7504a2c-c1bc-78bb-8f41-366c78e89c0e.png)

### ルート表
#### パブリックサブネット
![OCI-Route1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/cc93a438-7544-b7bf-54b7-36286c24088c.png)

#### プライベートサブネット
![OCI-Route2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/c0365ffe-6261-4fa9-3a1e-e74bb70a0b69.png)

### セキュリティリスト
#### パブリックサブネット
![OCI-Ingress1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/e25cf98f-8b00-645d-52c0-ea270b6e1453.png)

#### プライベートサブネット
![OCI-Ingress2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/46d917d7-e70b-2a89-3adb-c25e40d566f4.png)

## Azure
### 接続の作成
[Docsの手順](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-site-to-site-resource-manager-portal)に従ってローカルネットワークゲートウェイ、およびVPN接続を作成します。接続するIPアドレスにOCI側に立てたWindows Server RRASのパブリックIPアドレス、アドレス空間にOCIのVCNのネットワークを指定します。
接続を作成する際、共有キーを指定して、IKEv2であることを確認して作成します。
![Azure-Connect1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/c0e22e05-0932-12d9-a229-e51f1c4d32e9.png)

## OCI
### RRAS
#### 接続設定
![OCI-RRAS24.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/5314daf4-198d-ba8c-07c5-d9903e9c8df5.png)
![OCI-RRAS24-2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/9fef57df-d0e3-430a-ef51-0da7873fbf06.png)
![OCI-RRAS25.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/5ca8cee2-f1c3-fe70-4add-f0582b198bff.png)

#### 接続
![OCI-RRAS26.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/692c9d08-9dc0-3077-6daa-28b13d076ba8.png)

#### 接続確認
問題なくつながると、下記のようにステータスが`Connected`に替わります。
![OCI-RRAS27.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/a707c456-fa91-75c9-0b33-dccb052c8b03.png)

## Azure
### 接続確認
ステータスのアップデートに少し時間がかかります。
![Azure-Connect2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/23738c44-47aa-34d2-623e-143898c693fc.png)

## 測定用VM
Azure、OCIそれぞれにOracle LinuxのVMを立てて、[こちらの手順](https://docs.cloud.oracle.com/ja-jp/iaas/Content/Network/Concepts/networkperformance.htm)で計測環境をセットアップします。

# 考察
## パフォーマンス
Azure VPN Gatewayのパフォーマンスについては、[Docs](https://docs.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-vpngateways#gateway-skus-by-tunnel-connection-and-throughput)に解説があります。
これによると、IPsec 暗号化と整合性のアルゴリズムがスループットに大きく影響を与えていることがわかります。
Windows Server RRASのポリシーを調べてみると、下記のものが使われているようです。(これ以外を指定すると、RRASがポリシーエラーでつながりません)
![Azure-IPSec1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/af7bcce1-9c1a-516b-7776-d98f0fa4941a.png)
iperf3を実行中のRRASのCPU
![OCI-RRAS28.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684720/521f86d5-a35c-7915-0fdc-8bdcb1ad3647.png)

## 設定
OCIでIPSecパケットのイングレスの設定をしなくてもつながっています。