OCI シングル・テナンシで複数エンドユーザー共同利用のSaaSモデル -- ネットワーク設計編

本ブログは、[オラクル・クラウドの個人ブログ](https://qiita.com/letian/items/10152a4fec813c1b7d98)の1つです。

# 初めに

:::note
本記事は、<strong>上級レベルのクラウド・アーキテクト</strong>向けのネットワーク設計ガイドです。OCIの初心者は、まずネットワークの基本から学習することをお勧めします。
:::

ISV様 (Independent Software Vendorの略称、SaaS提供者)が、オラクル・クラウドを使用する際、シングルテナンシで複数のエンドユーザーによる共同利用は一般的なビジネスモデルです。本シリーズの記事は、こうした共同利用型のISV/SaaS事業者向けです。

ネットワーク構成は、全システム構成の中でも非常に重要な部分です。本記事では、OCIでネットワーク構成を設計する際にSaaS提供者が直面する共通の課題とその解決方法について紹介いたします。少しでもお役に立てれば幸いです。

__索引__

- [ISVモデルのネットワーク設計の課題と解決方法](#isvモデルのネットワーク設計の課題と解決方法)
  - [ネットワーク設計の課題](#ネットワーク設計の課題) 
  - [解決方法](#解決方法)
- [検証環境の構成](#検証環境の構成)
- [検証作業の流れ](#検証作業の流れ)
  - [STEP1-事前準備 (On-P/OCI両側)](#step1-事前準備-on-poci両側)
  - [STEP2-サイト間VPNの作成 (OCI)](#step2-サイト間vpnの作成-oci)
  - [STEP3-VCNアタッチメントの作成 (OCI)](#step3-vcnアタッチメントの作成-oci)
  - [STEP4-ルート・ディストリビューションのインポートの作成 (OCI)](#step4-ルートディストリビューションのインポートの作成-oci) 
  - [STEP5-DRGルート表の作成 (OCI)](#step5-drgルート表の作成-oci)
  - [STEP6-VCNアタッチメントの編集 (OCI)](#step6-vcnアタッチメントの編集-oci)
  - [STEP7-IPSecトンネル・アタッチメントの編集 (OCI)](#step7-ipsecトンネルアタッチメントの編集-oci)
  - [STEP8-Libreswanの構成 (On-P)](#step8-libreswanの構成-on-p)
  - [STEP9-接続テスト (On-P/OCI両側)](#step9-接続テスト-on-poci両側)
- [DRGルート表のサービス制限を超えた時](#drgルート表のサービス制限を超えた時)
- [付録](#付録)
  - [DRGv2のエンハンスメント](#drgv2のエンハンスメント)
  - [サービス制限](#サービス制限)

# ISVモデルのネットワーク設計の課題と解決方法
## ネットワーク設計の課題
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/745e01c4-45e5-a1c6-e9c0-4dac145b61af.png", width="850">

__課題-1 (LPG数の制限)__
VCNで各エンドユーザー様を分けて、それぞれ管理用VCNと接続するのは、ISV様にとって一般的な構成方法です。ただ、1個の管理用VCNに対し、<font color=blue>10個のLPG</font>(Local Peering Gateway)まで作成できるというサービス制限があります。SR(サービス・リクエスト)で引き上げるのは可能ですが、やはり限界（20個ぐらい）があります。

ビジネスの規模拡張と伴い、エンドユーザーの数が増えてくると、LPG数の制限がボルトネックになります。

__課題-2 (エンドユーザー間のCIDRブロックの独立性)__
On-PとOCIの間、IPSec VPN/Fastconnectで接続する場合、各ユーザーのCIDRブロックは重複できないという制限があります。

利用者は、他社のCIDRを意識しなくてもよいのは当然であり。CIDR重複の制限は、ISV様にもエンドユーザーにも不便です。

## 解決方法
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ceffd472-831d-a12e-b30e-758203857d7e.png", width="850">

__課題解決-1 (LPG→DRGv2)__
LPG接続ではなく、<font color=blue>DRGv2</font>でVCN間の接続を集約します。従来のDRGとVCNの対応関係は、1:1でしたが、<font color=blue>1:N</font>になりました。１つDRGに対し、<font color=blue>最大300個</font>のVCNをアタッチするのは可能であり、LPGの制限を乗り越えます。

__課題解決-2 (DRGv2のルーティング機能)__
DRGv2のルーティング機能を利用すれば、IPSec VPN/FastConnect接続の時、エンドユーザーごと、それぞれのルートを分けることは可能です。なお、管理用VCNから、各エンドユーザー用VCNへの経路を振り分けることができます。

OnP側、各エンドユーザーとISVは、<font color=blue>他社のCIDRを意識しなくてもよい</font>です。クラウド側、各エンドユーザのCIDDRは重複してもよいが、<strong>管理と運用の利便性</strong>の考慮で、重複しないように設計するのを<font color=blue>推奨</font>します。

これから、検証方法と結果を紹介します。

# 検証環境の構成
Libreswanを利用し、On-PとOCIの間、IPSec VPNの複数接続をシミュレーションします。
On-P: 大阪リージョン (LibreswanをVMにインストール)
OCI:  東京リージョン
ISV様とエンドユーザーのA社、C社 (On-PとOCI両側、CIDRの重複があります。)
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/b6058b21-fe2a-0441-50d3-c3321d5fa7dc.png", width="850">

# 検証作業の流れ
## STEP1-事前準備 (On-P/OCI両側)
__1. 関連リソースの作成__
関連リソースをOn-P/OCI両側で作成しておきます。必要なリソース数は、以下となります。
- VCN: 6個 (On-PとOCI側は、３個ずつ)
- サブネット: 6 個 (On-PとOCI側は、３個ずつ。この例は、全部パブリック・サブネットを使用）)
On-P側：各サブネットのCIDR(<font color=blue>192.168.0.0/24</font>)は、全部重複している。
OCI側：A社のC社のCIDR(<font color=blue>10.0.0.0/24</font>)は、重複しているが、ISVの保守環境のCIDRは、各エンドユーザと重複しない。
- Compute インスタンス (Linux): 9 個  = (OnP側の端末 + CPE + OCI側の端末) * 3
- DRG: 1個
- CPE: 3個
- IPSec接続: 3個

両側にセキュリティ・リストとルート・テーブルの設定も必要です。設定内容の詳細は、以下の記事のSTEP-1をご参照ください。
[On-PとOCI間のIPSec VPN接続のシミュレーション (Libreswanを利用)](https://qiita.com/liu-wei/items/4d6c4c9e3662f1ffbf58#1-事前準備)

__2. ISV様の管理環境向けの追加設定__
上記のシミュレーションの構成例に、ISV様の管理用VCNを含めていません。管理VCNからエンドユーザー用VCNに接続するため、以下の追加設定は必要です。

__2-1. ルート・テーブル__
ISV様用サブネットのルート・テーブル：
エンドユーザーのCIDR (192.168.0.0/24) を追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/247c470f-6102-ff25-ea47-ee520575b024.png", width="550">

エンドユーザー用サブネットのルート・テーブル：
ISV様のCIDR (172.16.0.0/24) を追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c95fa4e4-7b61-2ce8-7db2-8b6f05c77f66.png", width="550">

__2-2. セキュリティ・リスト (SL)__
エンドユーザー用サブネットのSLに、ISV様から (172.16.0.0/24) の入力ルールを許可します。
エンドユーザーからISV様の環境にアクセスしないので（<font color=blue>片道通行</font>）、ISV様の SL の入力ルールにエンドユーザーのCIDR追加する必要がありません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/10af2e6d-0f36-c22e-00e1-10a61fa30cbd.png)

## STEP2-サイト間VPNの作成 (OCI)
__1. 顧客構内機器(CPE)の作成__
ネットワーキング -> 顧客接続性 -> 顧客構内機器 -> 「顧客構内機器の作成」ボタンを押す

<strong>名前</strong>: CPE名を入力
<strong>Public IP アドレス</strong>: LibreswanインスタンスのパブリックIPを入力
<strong>ベンダー</strong>: `Libreswan`を選択
<strong>Platform Version</strong>: リストから選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/37aee15a-39a3-4c50-1e5f-34b66a438b92.png", width="450">
作成後：
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/54445af4-3620-4725-82e7-46b8b570617f.png", width="600">

__2. IPSec接続の作成__
ネットワーキング -> 顧客接続性 -> サイト間VPN ->「IPSec接続の作成」ボタンを押す

以下のように必要な情報を入力し、「IPSec接続の作成」ボタンを押します。
<strong>名前</strong>: IPSec接続名を入力
<strong>CPE</strong>: リストから作成したCPEを選択
<strong>DRG</strong>: リストから既存のDRGを選択。
<strong>オンプレミス・ネットワークへのルート</strong>: On-P側のサブネットの CIDR ブロックを入力
<strong>トンネル１と２のルーティング・タイプ</strong>: `静的ルーティング`を指定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/acb3a952-2497-d4d1-938f-676f36fbf19f.png", width="600">

作成後：
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c9ab00c0-3c89-12f4-0523-597e067de7e3.png", width="600">

## STEP3-VCNアタッチメントの作成 (OCI)
ネットワーキング → 顧客接続性 → 動的ルーティング・ゲートウェイ → DRG → 仮想クラウド・ネットワーク・アタッチメント →  「仮想クラウド・ネットワーク・アタッチメントの作成」を押す

DRGルート表：デフォルトのままでよい
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e02d56f1-fb1f-f851-4f79-5a611e7fb104.png", width="600">

作成後：
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/70e3e291-86e5-f329-a5f4-181597fb84fd.png", width="700">

## STEP4-ルート・ディストリビューションのインポートの作成 (OCI)
ネットワーキング → 顧客接続性 → 動的ルーティング・ゲートウェイ → DRG → ルート・ディストリビューションのインポート → 「ルート・ディストリビューションのインポートの作成」を押す

__入力情報  (各エンドユーザー用)__
- 優先度：<font color=blue>1~3</font>を入力 (３行)
- 一致タイプ："<font color=blue>Attachment</font>"を選択
- アタッチメント・タイプ・フィルタ
1～2行目："<font color=blue>IPSec Tunnel</font>"を選択。
3行目："<font color=blue>Virtual Cloud Network</font>"を選択
- DRGアタッチメント
1～2行目：IPSec接続が作成された時、２個のDRGアタッチメントが自動に作成されたので、それらを選択。
3行目：STEP3で作成したISV用のアタッチメントを選択 (ISV様からのアクセス)。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4be07ed0-2efc-bf55-a080-dc060ecc4ba1.png", width="650">

__入力情報  (ISV様用)__
ISV様用の場合、"IPSec Tunnel"の2行だけでOKです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/6dbaf48a-01c0-e958-9111-0167561cddea.png", width="650">

作成後：
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e3b0f831-56cf-de1a-3269-18cb277eed97.png", width="650">

## STEP5-DRGルート表の作成 (OCI)
ネットワーキング → 顧客接続性 → 動的ルーティング・ゲートウェイ → DRG → DRGルート表 → 「DRGルート表の作成」を押す

__入力情報  (各エンドユーザー用)__
- 宛先CDIR：各エンドユーザーのサブネットのCIDR
- アタッチメント："<font color=blue>Virtual Cloud Network</font>"を選択  (同一リージョンの場合)
- 次のホップ・アタッチメント：STEP3で作成したアタッチメントを選択
- ルート・ディストリビューションのインポートの有効化：<font color=blue>チェック</font>する
- ルート・ディストリビューションのインポート：STEP4で作成したものを選択
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1f5c29c0-9ed0-1412-3525-959057f34723.png", width="600">

__入力情報  (ISV様用)__
- 宛先CDIR：
　1行目：ISV用サブネットのCIDR
　2行目以降：<font color=blue>接続先(VM)のプライベートIP</font>
- アタッチメント："Virtual Cloud Network"を選択
- 次のホップ・アタッチメント：
　1行目：ISV用アタッチメント
　2行目以降：各エンドユーザー用アタッチメント
- ルート・ディストリビューションのインポートの有効化：チェックする
- ルート・ディストリビューションのインポート：STEP4で作成したものを選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e774ad97-d041-f78b-6b71-e0b8ce4c6ff8.png)
上記の"10.0.0.23"は、<font color=blue>A社のVM（Client A2）</font>のIPアドレスで、"10.0.0.58"は、<font color=blue>C社のVM（Client C2）</font>のIPアドレスです。

作成後：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/daeaa720-3d26-9bb0-f5d2-97605c5a408b.png)

## STEP6-VCNアタッチメントの編集 (OCI)
VCNアタッチメントを編集し、STEP5で作成したDRGルート表を選択します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ad86d25e-cfd2-6dbb-19f8-02f991d2a24b.png", width="650">

編集後：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f1b2cc51-f067-5212-d1e6-c2ca00c4dd48.png)

## STEP7-IPSecトンネル・アタッチメントの編集 (OCI)
IPSecトンネル・アタッチメントを編集し、STEP5で作成したDRGルート表を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2147a75f-3a35-0dc0-fba1-3c3170d2a0b6.png)

編集後：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2a938d64-4343-f9cc-95cc-e1a576231830.png)

## STEP8-Libreswanの構成 (On-P)
On-P(大阪リージョン)側のVMで、Libreswanのインストールと構成を実施してから、サービスを起動します。実施方法の詳細は、以下の記事のSTEP-3とSTEP-4をご参照ください。
[On-PとOCI間のIPSec VPN接続のシミュレーション (Libreswanを利用)](https://qiita.com/liu-wei/items/4d6c4c9e3662f1ffbf58#3-libreswanのインストール-左)

## STEP9-接続テスト (On-P/OCI両側)
接続タイプ：SSH接続 (左右双方向)
前提条件：TCP(22ポート)を両側のセキュリティ・リスト（或いはNSG）に許可しておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/f57eb263-9338-6854-89be-923208a285c9.png)
結果は予定通り、各エンドユーザーは自分のネットワーク内のVMしか接続できないで、エンドユーザー間のネットワーク隔離性を確保できます。

ISV様は、OnPとOCIの間、双方通信できます。なお、クラウド保守環境 (Client ISV2)から、エンドユーザーのOCI上のVMにアクセスできます（片道のみ）。

# DRGルート表のサービス制限を超えた時
一つのDRGに対し、最大<font color=blue>100個</font>のルート表を作成できす。この制限は<font color=blue>ハードリミット</font>で、増やすことができません。各エンドユーザーが、IPSec VPNでOCIに接続する時、ユーザーごと、DRGルート表を作成しますので、100社の場合、1個のDRGに100個のルート表は必要です。もし100社を超えたら、どう対応するかといいますと、もう1個DRGを追加すればOKです。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/75f2d997-6ab1-5964-da94-005c4b5586f7.png", width="650">

# 付録
## DRGv2のエンハンスメント
従来のDRGv1と比較し、大きなエンハンスメントがあります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c09732a2-7783-0fd6-9e47-387e213843e6.png)
詳細は、以下のアナウンス記事をご参照ください。
[Introducing global connectivity and enhanced cloud networking with the dynamic routing gateway](https://blogs.oracle.com/cloud-infrastructure/post/introducing-global-connectivity-and-enhanced-cloud-networking-with-the-dynamic-routing-gateway)

## サービス制限
サービス制限は、リソースに対して設定される割当てまたは許容量です。これらの制限は、OCIリソースの使用状況およびアカウントの存続期間に基づいて自動的に増加する場合があります。サービス制限の増加をリクエストすることもできます 。下記以外のリソースに係るサービス制限は[マニュアル](https://docs.oracle.com/ja-jp/iaas/Content/General/Concepts/servicelimits.htm)を参照。

__ネットワーク関連__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/629889d5-07de-949d-a234-93afae84d802.png)
※ 1. 一つリージョンに、最大300個のVCNまで増やすのは可能です。
※ 2. このリソースの制限を増やすことはできません。

__DRG関連__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/bbae79fb-501e-a81d-987c-27c51e5f2359.png)
※、このリソースの制限を増やすことはできません。

以上です。

__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[On-PとOCI間のIPSec VPN接続のシミュレーション (Libreswanを利用)](https://qiita.com/liu-wei/items/4d6c4c9e3662f1ffbf58)
[OCI 各種GWのまとめ](https://qiita.com/liu-wei/items/967e9790cb9f18345f56)

----
__オフィシャル資料__
アーキテクチャ・センター/参照アーキテクチャ (日本語)
[動的ルーティング・ゲートウェイを使用したハブ・アンド・スポーク・ネットワーク・トポロジの設定](https://docs.oracle.com/ja/solutions/hub-spoke-network-drg/index.html)