踏み台サーバを使ってOCIプライベートComputeインスタンスに接続する方法

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

# 初めに
オンプレミス環境からプライベートサブネット内のOCI（Oracle Cloud Infrastructure）Computeインスタンスに接続する方法はいくつかあります。その中でも、踏み台サーバを経由する方法は最も一般的です。接続方法としては、主に以下の2つのパターンがあります。

- [方法-1. 二段階のログイン](#方法-1-二段階のログイン)
- [方法-2. SSHポート転送](#方法-2-sshポート転送)

# 方法-1. 二段階のログイン
- 踏み台サーバは<strong>Linux</strong>の場合：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/75dd5f12-cc73-c665-df04-ad6f9af420ba.png)
- 踏み台サーバは<strong>Windows</strong>の場合：
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/1645fa4a-2bb2-77bb-1c89-fff17ec5ce96.png)

メリット：
✅ 非常にシンプル。
✅ 踏み台サーバーへのログインが必要な作業に適している。

デメリット：
- ２回のログインが必要で、<strong>手間</strong>がかかる。
- <strong>3389</strong>番ポートなどをパブリックに公開する必要がある。
- 接続先がLinuxの場合、秘密鍵を踏み台サーバに配置する必要がある。

## NSGの関連設定
| 紐づいているインスタンス | 方向 | ソース・宛先CIDR | プロトコル |宛先ポート|説明|
|:-:|:-:|:-|:-:|:-:|:--|
| 踏み台<br>(Linux)  |Ingress|ソース: Client Public IP|TCP|22|接続端末から踏み台へのSSHを許可|
| 踏み台<br>(Linux)  |Egress|宛先: 接続先のPrivate IP|TCP|22|踏み台から接続先へのアクセスを許可|
| 踏み台<br>(Windows)  |Ingress|ソース: Client Public IP|TCP|3389|踏み台から接続先へのアクセスを許可|
| 踏み台<br>(Windows)  |Egress|宛先: 接続先のPrivate IP|TCP|3389|踏み台から接続先へのアクセスを許可|
| ターゲット(Linux)|Ingress|ソース: 踏み台のPrivate IP|TCP|22|踏み台からのアクセス(SSH)を許可|
| ターゲット<br>(Windows)|Ingress|ソース: 踏み台のPrivate IP|TCP|3389|踏み台からのアクセス(RDP)を許可|

# 方法-2. SSHポート転送
踏み台サーバは<strong> Linux </strong>の場合、SSHポート転送の手段もあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/32df8816-91d6-1f9b-0697-d9305563ad79.png)

メリット：
✅ 二段階のログインが不要になり、作業の手間を軽減できる。
✅ 公開する必要があるポートは<font color=blue>22</font>番のみで済むため、よりセキュアな接続が可能
✅ 接続先がLinuxの場合、秘密鍵を踏み台サーバに配置する必要がない。
✅ 踏み台サーバをLinuxで構築すれば、Windowsサーバを使用するよりコストを抑えられる。

## a) Linux サーバにSSH接続する場合
- Step-1) 踏み台サーバとターゲットVMの秘密キーをローカル端末に保存する。
※、ターゲットVMの秘密キーを<font color=blue>踏み台サーバに保存しない</font>ことを推奨する。
- Step-2) 次のコマンドを使用してSSHポート転送を実行する。（Tera Termの画面からも実行できるが、個人的にはコマンドの方が好み）

```bat
ssh -L 22:<linux_private_ip>:22 opc@<bastion_public_ip> -i C:\Users\<username>\.ssh\<bastion_private_key>
```
 - Step-3) 上記のステップが成功したら、別のセッションを開いて、次のコマンドでターゲットに接続する。
```bat
ssh localhost -l opc -i C:\Users\<username>\.ssh\<target_private_key>
```

## b) Windows サーバにRDP接続する場合
- Step-1) 踏み台サーバの秘密キーをローカル端末に保存する。
- step-2) 次のコマンドでSSHポート転送を実施する（上記のLinuxの方法と同様ですが、ポートのところを<font color=blue>3389</font>に変更してください）。
```bat
ssh -L 3389:<windows_private_ip>:3389 opc@<bastion_public_ip> -i C:\Users\<username>\.ssh\<bastion_private_key>
```
- step-3) 上記のステップが成功したら、ローカル端末からRDPを開いて、ホスト名に<strong>localhost</strong>を入力して接続する。

__次のエラーが発生した場合__
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1121622/30150bc5-88d5-bd44-98dc-ee260a795651.png", width="550">

エラー現象：step-3を実施すると、上記エラーが表示される。
エラーメッセージ：「既に進行中のコンソールセッションがあるため、リモートコンピューター上の他のコンソールセッションに接続できませんでした。」
原因：ローカルポート番号3389が既に使われています。
対策：次のようにローカルのポートを13389の番号に置き換えてください。
  - step-2) `ssh -L  13389:<windows_private_ip>:3389 opc@<bastion_public_ip> -i C:\Users\<username>\.ssh\<bastion_private_key>`
  - step-3) ローカル端末からRDPを開いて、ホスト名に<strong>localhost:13389</strong>を入力して接続する。

## NSGの関連設定
| 紐づいているインスタンス | 方向 | ソース・宛先CIDR | プロトコル |宛先ポート|説明|
|:-:|:-:|:-|:-:|:-:|:--|
| 踏み台<br>(Linux)  |Ingress|ソース: Client Public IP|TCP|22|接続端末から踏み台へのSSHを許可|
| 踏み台<br>(Linux)  |Egress|宛先: Private Subnet CIDR|TCP|22<br>3389|踏み台から接続先へのアクセスを許可|
| ターゲット(Linux)|Ingress|ソース: 踏み台のPrivate IP|TCP|22|踏み台から接続先へのアクセス(SSH)を許可|
| ターゲット<br>(Windows)|Ingress|ソース: 踏み台のPrivate IP|TCP|3389|踏み台から接続先へのアクセス(RDP)を許可|

:::note
踏み台サーバを経由する方法以外にも、さまざまな手段があります。詳細については、次の記事をご参照ください。
[プライベート・サブネット内のOCI Computeインスタンスに接続する方法のまとめ](https://qiita.com/letian/items/e0376fd71433d243bce0)
:::

以上