ネットワーク・ロード・バランサ (NLB) の経由でプライベート・サブネット内の OCI VMに接続する

__初めに__
この記事の位置付けは、次のシリーズ記事の1つです。
[プライベート・サブネット内の OCI Compute に接続](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98#3-%E3%83%97%E3%83%A9%E3%82%A4%E3%83%99%E3%83%BC%E3%83%88%E3%82%B5%E3%83%96%E3%83%8D%E3%83%83%E3%83%88%E5%86%85%E3%81%AE-oci-compute-%E3%81%AB%E6%8E%A5%E7%B6%9A)

プライベート・サブネットに格納されるOCI Computeインスタンス(<strong>VM</strong>)に接続するのに、いろいろな方法があります。踏み台サーバを立てず、インターネットから接続したい場合、パブリック・サブネット内のネットワーク・ロード・バランサ(<strong>NLB</strong>)を経由するのは、選択肢のひとつです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8726d6df-3a08-8954-db6a-fafc1f33c99f.png)

接続先のインスタンスをパブリック NLB のバックエンドとして追加し、関連するリスナー・ポート (3389、22) を開くと、NLB を介してプライベート・サブネット内のインスタンスに接続できます。

なお、一つ NLB に<strong>複数のバックエンドセット</strong>を追加できます。例えば、Windows VM 用に 1 つ、Linux VM 用に 1 つ、各バックエンドセットは独自のリスナー・ポートを使用します。それで共通のNLBを経由し、それぞれのポートでターゲットVMに接続できます。

__メリット__
✅ 踏み台サーバを立てる必要がないため、コストを節約できる。
✅ 設定方法は簡単で、<strong>管理者</strong>の一時作業に向く（数分間で設定OK）。
✅ レイヤー4通信であり、可用性が高くて、レイテンシが低い。
✅ OCI Bastionと比べて、セッションタイムアウト（最大３時間）の心配がない。
✅ バックエンドをオフラインに切り替えると、接続の一時停止ができる。
✅ NLB自体は"[Always Free](https://www.oracle.com/jp/cloud/free/#always-free)"でカバーできるので、無料で使用できる。

:::note
NLB自体は停止できませんが、バックエンドをオフラインにすることは可能です。使用しないときにオフラインに切り替えることで、踏み台サーバーを一時停止するのと同じような効果が得られます。
:::

__目次__

- [1. 事前準備](#1-事前準備)
  - [1-1. 関連する OCI リソースの作成](#1-1-関連する-oci-リソースの作成)
  - [1-2. OpenSSH のインストール](#1-2-openssh-のインストール)
- [2. NLBの作成](#2-nlbの作成)
- [3. Windows VMに接続する](#3-windows-vmに接続する)
- [4. Linux VMに接続する](#4-linux-vmに接続する)
  - [4-1. NLBを新規作成する場合](#4-1-nlbを新規作成する場合)
  - [4-2. 既存NLBを使用する場合](#4-2-既存nlbを使用する場合)
  - [4-3. SSHでLinux VMにログイン](#4-3-sshでlinux-vmにログイン)

# 1. 事前準備
## 1-1. 関連する OCI リソースの作成
|タイプ|項目|値|コメント|
|:--|:--|:--|:--|
|VCN|CIDR|10.0.0.0/16|
|パブリック・サブネット|CIDR|10.0.0.0/24|NLB|
|プライベート・サブネット|CIDR|10.0.1.0/24|接続先サーバ|
|インターネット・ゲートウェイ|||ルート表に追加する|
|セキュリティ・リスト (<strong>パブリック</strong>・サブネット用)|Ingress|ソース側のIP, TCP <font color=blue>3389,22</font>|接続元の IP アドレスを指定する|
||Egress|0.0.0.0/0, 全てのプロトコル||
|セキュリティ・リスト (<strong>プライベート</strong>・サブネット用)|Ingress|10.0.0.0/24, TCP All|<strong>NLBからのアクセス</strong>を許可|
||Ingress|ソース側のIP, TCP <font color=blue>3389,22</font>|"<font color=blue>Preserve source IP</font>"をチェックする時、バックエンド・サーバがソース側のIPを識別できるので、許可しないとアクセスできない。|
||Egress|0.0.0.0/0, 全てのプロトコル||
|ルート表 (<strong>パブリック</strong>・サブネット用)|ルール|ターゲット: インターネット・ゲートウェイ<br>宛先: 0.0.0.0/0||
|Compute インスタンス|OS|Windows サーバ <strong>2022</strong>|プライベート IP: 10.0.1.167|
||OS|Oracle Linux <strong>9</strong>|プライベート IP: 10.0.1.213|

## 1-2. OpenSSH のインストール
この例では、OpenSSHを使ってLinux VMに接続します。まだインストールされていない場合、PowerShellを起動して、以下のコマンドでインストールしてください（管理者ユーザで実行）。

コマンド：`Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'`
```powershell
PS C:\windows\system32> Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'


Name  : OpenSSH.Client~~~~0.0.1.0
State : Installed

Name  : OpenSSH.Server~~~~0.0.1.0
State : NotPresent



PS C:\windows\system32>
```
# 2. NLBの作成
Networking → Load Balancers → Create Load Balancer
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/cceed7b9-22f0-7adf-ff88-5479daff21c4.png", width="650">

__タイプの選択__
<font color=blue>レイヤー４</font>の"ネットワーク・ロード・バランサ"を選択し、進んでください。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/548155a3-b535-f68b-53b5-f4d93b40beee.png", width="600">
__詳細情報の追加__
NLBの名前：適当な名前を入力
可視性タイプ：<font color=blue>パブリック</font> (デフォルト)
パブリックIPの割当て：エフェメラル IPv4 (デフォルト)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/08de6d09-95d0-4a2e-c0a3-f2bdec7149e2.png)

VCNとパブリック・サブネットを指定し、次へをクリックします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/07f99f2c-315a-cdac-b7bb-9327a4537788.png)

__リスナーの構成__
リスナー名前：適当な名前を入力
トラフィックのタイプ：<font color=blue>TCP</font>
イングレス・トラフィック・ポート：デフォルトは、「任意のポートを使用」となっているが、この例では、Windows リモート・デスクトップ用のポート(<font color=blue>3389</font>)を指定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/096c56b0-6fd1-3fe1-b23b-3627e236e5f7.png)

__バックエンドの選択__
バックエンド名：適当な名前を入力する。
"<font color=blue>Preserve source IP (ソースIPの保持)</font>"：デフォルトはチェックしているので、そのままでOK。
この場合、バックエンド・サーバがクライアント側のIPを識別できるので、許可しないとアクセスできない。セキュリティ・リスト(or NSG)の Ingress ルールには、<strong>ソースIPを追加</strong>してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e536b388-90c5-4ec5-5b6c-ed2b6fe60d59.png)

「バックエンドの追加」をクリックし、接続先のインスタンスを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/93565be3-61df-17cb-3a3e-b465fc6d2712.png)

ヘルス・チェック・ポリシーの部分で、<font color=blue>TCP</font>プロトコルを指定し、次へをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/4a6520b5-bab8-43ae-64c8-fb3a7f8b8f1d.png)

__確認および作成__
情報を確認した後、作成ボタンをクリックし、作成を開始します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/55ecddc8-be35-cdbe-eeb2-0e450a5f1811.png)

__作成後__
ロード・バランサの状態は、"<font color=blue>ACTIVE</font>"になったら、ヘルス・チェックは「<font color=blue>OK</font>」であることを確認します。

次のステップで、NLBの<strong>パブリックIP</strong>を使いますので、メモしておいてください。![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/c8806625-5003-a9a8-0e7d-f2f0d94eead3.png)

# 3. Windows VMに接続する
ローカル クライアントから「リモート デスクトップ接続」を起動します。<font color=blue>NLBのパブリックIP</font>を入力して、接続をクリックします。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/8b228f6d-125c-f7bf-4e99-3214de2842fb.png", width="450">

「このコンピュータへの接続について今後確認しない」にチェックを入れ、「はい」をクリックして続行します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/3b1fe8b1-90ce-7d96-1b3a-ec31de2cd20a.png", width="450">

接続先サーバのユーザー名とパスワードを入力します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ebf1d555-507e-ab45-e199-32d43192bd55.png", width="550">

接続先のサーバにログインできました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/80683182-8f71-78e9-b5db-aa3e4bc0ec32.png", width="550">

# 4. Linux VMに接続する
## 4-1. NLBを新規作成する場合
上記の[STEP 2](#2-nlbの作成)を従って、作成していただければと思います。作成後、[STEP 4-3](#4-3-sshでlinux-vmにログイン)を実施してください。

注意点は以下の２か所だけです。
- リスナーの構成画面：ポート3389 (RDP)をポート<font color=blue>22</font> (SSH)に変更する。
- バックエンドの選択画面：接続先サーバをLinuxに指定する。

## 4-2. 既存NLBを使用する場合
1. バックエンド・セットの追加作成
Networking → Load Balancers → Load Balancer Details → Backend Sets → Create Backend Set
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/732df360-72a7-0bd2-f17e-3a4d6d1a7e14.png)
ヘルス・チェック・ポリシーの部分に、<font color=blue>TCP</font>プロトコルを指定します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/50714c6b-ec2d-e230-a8d1-663636cfd6e4.png", width="500">
2. バックエンドの追加
作成されたバックエンド・セットをクリックし、詳細画面に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e8227e00-590c-b1d4-1605-d1385c2550f2.png)
「バックエンドの追加」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2529a6b1-d4e1-1fd4-a292-d9d6fad14b9c.png)
接続先サーバを選択し、追加ボタンをクリックします（ポートを <font color=blue>22</font>に指定）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/2c4ffbcf-4890-9558-194c-9a8ef688ca37.png)
追加後、次のように確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/375de7b3-ecd7-07ea-efb7-ede00827fa0e.png)
3. リスナーの追加
Networking → Load Balancers → Load Balancer Details → Listeners -> Create Listener 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/a84b9c6c-e6fc-abd9-e999-b9b23738f68e.png)
リスナーの名前：適当な名前を入力
プロトコル：<font color=blue>TCP</font>
ポート：<font color=blue>22</font>を指定
バックエンド・セット：追加した`BackendSet02`を指定
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/e69194c7-d6e9-ab10-b779-0b7b503ffaa5.png", width="400">
追加後、次のように確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/ecb28ead-f57e-d0a1-ca64-58cea7d991ca.png)

## 4-3. SSHでLinux VMにログイン
PowerShell画面を起動して、次のコマンドでログインします。

<strong>コマンド</strong>：`ssh -i <private_key> <NLB_Public_IP> -l <username>`
例：`ssh -i $home\.ssh\id_rsa XXX.XXX.168.36 -l opc`
```powershell
PS C:\Users\Wei> ssh -i $home\.ssh\id_rsa XXX.XXX.168.36 -l opc
The authenticity of host 'XXX.XXX.168.36 (XXX.XXX.168.36)' can't be established.
ECDSA key fingerprint is SHA256:<fingerprint>.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'XXX.XXX.168.36' (ECDSA) to the list of known hosts.
Last login: Sun Dec  4 11:01:33 2022 from 10.0.0.237
[opc@linux9 ~]$
```
__サマリー__
ここまで、一つのNLBを経由し、Window/Linuxの２つインスタンスに接続できました。設定方法は簡単で、管理者の一時作業に向きます。セキュリティ・リスト(or NSG)にソース側のIPアドレスを絞り込み、NLBのリスナー・ポートを限定するのを推奨します。

以上です。

----
__関連記事__
[オラクル・クラウドの個人ブログ一覧](https://qiita.com/liu-wei/items/10152a4fec813c1b7d98)
[OCI ロードバランサとOCI NLBの比較](https://qiita.com/liu-wei/items/d2d1f1f9b882bb99cee6)
[ネットワーク・ロード・バランサ (NLB) の経由でプライベート・サブネット内の Oracle Base DB と Autonomous DB に接続する](https://qiita.com/liu-wei/items/e0288f3027271f1a14ff)