初めに
プライベートサブネットに配置されているOCI Computeインスタンスに接続する方法はいくつかあります。インターネット経由で接続する場合は、一般的にパブリックサブネットに設置した踏み台サーバーを経由します。
一方、OCI Bastion サービスを利用すれば、踏み台サーバーを構築や管理を行わずに、直接プライベートサブネット内のComputeインスタンスへ接続することができます。
メリット:
✅ 踏み台サーバを立てる必要がないため、コストを節約できる。
✅ SSHトンネルで通信するので、セキュアな接続を確保できる。
✅ OCI Bastion自体は無料で利用できる。
✅ 設定方法は比較的やりやすい。

では、OCI Bastion を介してプライベートな Windows/Linux インスタンス(VM) に接続する方法を紹介したいと思います。
1. 事前準備
1-1. 関連する OCI リソースの作成
| タイプ | 項目 | 値 | コメント |
|---|---|---|---|
| VCN | CIDR | 10.0.0.0/16 | |
| Private Subnet | CIDR | 10.0.1.0/24 | 接続先サーバ |
| サービスGW | (※1) | ||
| ルート表 | ルール | ターゲット: サービスGW 宛先: All Services in Oracle Services Network | ターゲットVMのサブネットに紐づける (※1) |
| Security List | Egress | 0.0.0.0/0, 全てのプロトコル | 同上 (※1) |
| Compute (VM) | OS | Oracle Linux 9 | プライベート IP: 10.0.1.8 |
| OS | Windows サーバ 2022 | プライベート IP: 10.0.1.138 |
※1、管理対象SSHセッションを指定する場合、作成必要。
1-2. OpenSSH のインストール
OCI Bastionサービスの本質はSSHトンネルです。クライアント側からSSHトンネルを経由して接続先サーバにアクセスするため、事前にSSHソフトのインストールが必要です。
この例ではOpenSSHを使用します。まだインストールされていない場合は、PowerShellを起動し、以下のコマンドでインストールしてください(管理者ユーザで実行)。
コマンド:Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
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. Bastionの作成
Identity & Security → Bastion → Create Bastion
Bastion名を入力し、ターゲットVCNとサブネットを選択してから、CIDRブロック許可リストを入力します。
注意
1. このテストでは、CIDRブロックの許可リストを「0.0.0.0/0」に設定しています。運用時には範囲を絞り込むことが推奨されます。例えば、接続元(クライアント)のIPアドレス範囲のみを許可するのが良いでしょう。
2. OCI Bastionを作成する際には、ターゲットのVCNとサブネットを指定する必要がありますが、Bastion自体に対し、配置場所を指定する必要はありません(誤解されることがよくあります)。
Bastionがアクティブの状態になると、「プライベート・エンドポイントIP」は次の画面から確認できます。このIPはターゲット・サブネット内で自動的に割り当てられます。次のステップで、このIPをセキュリティ・リストの入力ルールに追加します。「CIDRブロック許可リスト」を編集したい場合は、「編集」ボタンをクリックすれば大丈夫です。

3. セキュリティ・リストに入力ルールを追加
プライベート・サブネット内のインスタンスにアクセスするため、TCPポート(3389, 22)を入力ルールに追加するのは必要です。設定方法は、以下のどちらでもよいです:
- プライベート・サブネットに紐づけられるセキュリティ・リストに、ルールを追加
- Computeインスタンスに紐づけられるNSGに、ルールを追加
セキュリティ・リストを例にして設定します。
"Source CIDR"は、Bastionの「プライベート・エンドポイントIP」です(STEP-2の Bastionの詳細情報画面に表示されます)。
追加後
ポート 3389: Remote Desktop Protocol (Windows VM 接続用)
ポート 22: SSH (Linux VM 接続用)
4. Linux VMに接続する
Windows VMに接続する場合、このステップを飛ばして、次のステップを実施してください。
4-1. セッションの選択
セッション・タイプは、以下の2種類があります:
- 管理対象SSHセッション (Managed SSH session)
- ポート転送セッション (SSH port forwarding session)
セッション・タイプの差異比較
| タイプ | 前提条件 | 対応OS | リソース・タイプ | 備考 |
|---|---|---|---|---|
| 管理対象SSHセッション | 1.Bastionプラグインは有効化(Enabled)されている、かつ稼働中(Running)になっている。 2.サービスGWが作成され、ルート表に追加済。 | Linux | Compute | セッションを立てる時点、ターゲットVMに接続できる。 |
| ポート転送セッション | BastionプラグインとサービスGWは不要 | Linux/Windows | Compute, Oracle Base DB, Autonomous AI DB, MySQL DB, OAC | SSHトンネルを立てた後、SSH/RDPで接続 |
※、Bastionラグインの状態は、インスタンスの詳細画面(Oracle Cloud Agentタブ)から確認できます。Oracle Linuxインスタンスを作成した直後、Bastionラグインの状態は"Disabled"となっています。管理対象SSHセッションを選択する場合、Bastionセッションを作成する前、次のBastionラグインを有効化にする必要があります。

4-2. 管理対象SSHセッションで接続
Bastion → Sessions → Create session
| 項目 | 内容 |
|---|---|
| セッション・タイプ | "Managed SSH session"を選択 |
| ユーザー名 | opc |
| Computeインスタンス | 対象コンパートメントの下から選択する |
| SSHキー | 既存のキーファイルを利用するか、新しいキーペアを作成する。 (秘密キーをクライアント側に保存してください) |

セッションはアクティブの状態になりましたら、次のように、3ドットのメニューをクリックしてSSHコマンドをコピーします。
SSHセッションの作成
接続元のクライアントでコピーしたコマンドを実行してセッションを作成します。
コマンド
ssh -i <privateKey> -o ProxyCommand="ssh -i <privateKey> -W %h:%p -p 22 <OCID_of_Bastionsession>@host.bastion.ap-tokyo-1.oci.oraclecloud.com" -p 22 opc@<Private_IP_of_Target_VM>※、<privateKey>を秘密キーのパスとファイル名に置き換えます。
PowerShellでの接続例:
PS C:\users\opc> ssh -i $home\.ssh\id_rsa -o ProxyCommand="ssh -i $home\.ssh\id_rsa -W %h:%p -p 22 ocid1.bastionsession.oc1.ap-tokyo-1.amaaaaaakv6tzsaagj47utdtn5vqisr5bvin7yz3f5livaqjzi2e2k3oos6a@host.bastion.ap-tokyo-1.oci.oraclecloud.com" -p 22 opc@10.0.1.15
The authenticity of host '10.0.1.15 (<no hostip for proxy command>)' 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 '10.0.1.15' (ECDSA) to the list of known hosts.
[opc@linux9-private ~]$4-3. ポート転送セッションで接続
Bastion → Sessions → Create session
| 項目 | 内容 |
|---|---|
| セッション・タイプ | "SSH port forwarding session"を選択 |
| ターゲット・ホストに接続する方法 | "IPアドレス"を選択 (デフォルト) |
| IPアドレス | 接続先VMのプライベートIP |
| ポート | 22 |
| SSHキー | 既存のキーファイルを利用するか、新しいキーペアを作成する。(秘密キーをクライアント側に保存してください) |

セッションはアクティブの状態になりましたら、次のように、3ドットのメニューをクリックしてSSHコマンドをコピーします。
SSHトンネルの作成
接続元のクライアントでSSHコマンドを実行してトンネルを作成します。
コマンド:
ssh -i <privateKey> -N -L <localPort>:<Private_IP_of_VM>:22 -p 22 <OCID_of_Bastionsession>@host.bastion.ap-tokyo-1.oci.oraclecloud.com<privateKey>を秘密キーのパスとファイル名に置き換えます。
Windowsの例(PowerShell):$home\.ssh\id_rsa<localPort>を22に置き換えます。<Private_IP_of_VM>は自動に実のIPが埋められるので、変更する必要はありません。
PS C:\Users\opc> ssh -i $home\.ssh\id_rsa -N -L 22:10.0.1.8:22 -p 22 <OCID_of_Bastionsession>@host.bastion.ap-tokyo-1.oci.oraclecloud.com
The authenticity of host 'host.bastion.ap-tokyo-1.oci.oraclecloud.com (192.29.38.223)' can't be established.
RSA key fingerprint is SHA256:<fingerprint>.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'host.bastion.ap-tokyo-1.oci.oraclecloud.com,192.29.38.223' (RSA) to the list of known hosts.
SSHトンネルができたら、セッションが保留されますので、リターンキーが戻りません。強制終了をしたい時、CTRL+Cを押してください。
SSHでログイン
もう一個PowerShell画面を起動して、次のコマンドでログインします。
コマンド:ssh -i <private_key> localhost -l <username>
例:ssh -i $home\.ssh\id_rsa localhost -l opc
PS C:\Users\opc> ssh -i $home\.ssh\id_rsa localhost -l opc
The authenticity of host 'localhost (127.0.0.1)' 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 'localhost' (ECDSA) to the list of known hosts.
[opc@linux9 ~]$5. Windows VMに接続する
5-1. セッションの作成
Bastion → Sessions → Create session
| 項目 | 内容 |
|---|---|
| セッション・タイプ | "SSH port forwarding session"を選択 |
| ターゲット・ホストに接続する方法 | "IPアドレス"を選択 (デフォルト) |
| IPアドレス | 接続先VMのプライベートIP |
| ポート | 3389 |
| SSHキー | 既存のキーファイルを利用するか、新しいキーペアを作成する。(秘密キーをクライアント側に保存してください) |

セッションはアクティブの状態になりましたら、次のように、3ドットのメニューをクリックしてSSHコマンドをコピーします。
デフォルトでは、セッションは3時間有効です。Bastionを作成する時に変更できます。
5-2. SSHトンネルの作成
接続元のクライアントでSSHコマンドを実行してトンネルを作成します。
SSHトンネルを作成するコマンド:
ssh -i <privateKey> -N -L <localPort>:<Private_IP_of_VM>:3389 -p 22 OCID_of_Bastionsession@host.bastion.ap-tokyo-1.oci.oraclecloud.comを秘密キーのパスとファイル名に置き換えます。<privateKey>
Windowsの例(PowerShell):$home\.ssh\id_rsaを13389に置き換えます。(3389を区別するため)<localPort>は自動に実のIPが埋められるので、変更する必要はありません。<Private_IP_of_VM>
PS C:\Users\opc> ssh -i $home\.ssh\id_rsa -N -L 13389:10.0.1.138:3389 -p 22 <OCID_of_Bastionsession>@host.bastion.ap-tokyo-1.oci.oraclecloud.com
上記のようにフォア・グラウンドとして実施した場合、セッションが保留されますので、リターンキーが戻りません。強制終了をしたい時、CTRL+Cを押してください。
Windows (PowerShell):
Start-Job { }でコマンドを囲むLinux OS: コマンドの最後に
&を追加※、出力メッセージを表示しませんので、ご注意ください。初回トンネル作成時、或いはトラブル・シューティングの時、フォア・グラウンド・プロセスとして実施してください。
5-3. RDPでログイン
クライアントでリモート・デスクトップを起動し、localhost:13389を入力してから接続ボタンをクリックします。
次のように、ログイン画面が表示されます。
付録
トラブル・シューティング
接続が失敗した場合、以下のような原因は一般的です:
- Computeインスタンスは、まだ起動していない。
- 秘密キーの中身或いは置き場所は不正。(例:
C:\Users\<Username>\.ssh\id_rsa) - プライベート・サブネットのセキュリティ・リストに、TCP 22か3389を公開していない。
- Bastionのプライベート・エンドポイントIPが、Ingressルールに追加されていない。
対策:セキュリティ・リストまたはNSGを確認してください。 - サービス・ゲートウェイがない、或いはルート表に追加されていない時、セッションを作成しようとしたら、次のエラーが発生した。(管理対象SSHセッションの場合のみ)
Plugin Bastion not present for instance ocid_of_instance - SSHトンネルは未作成か、作成が失敗した。
- トンネル作成失敗、或いはタイムアウトの時、次のメッセージが表示される。
Connection to host.bastion.ap-tokyo-1.oci.oraclecloud.com closed by remote host. - Bastionのセッション期限が切れた(デフォルトは3時間)。
セッション期限が切れた後、SSHトンネルを作成しようとしたら、次のエラーが発生した。<OCID_of_Bastionsession>@host.bastion.ap-tokyo-1.oci.oraclecloud.com: Permission denied (publickey)
対策:セッションの再作成は必要。
Bastionの制限
| 項目 | 内容 |
|---|---|
| 最大Bastion数 | テナンシ毎に5つ |
| 最大セッション数 | Bastionあたり20セッション |
| セッション存続時間 | 30分~3時間 |
| データ転送制限 | データ転送の制限はありません。 ただし、SSH接続あたりの接続速度は16 Mbpsに制限されます。 |
以上
改訂歴
2022年12月:初版作成
2023年05月:管理対象SSHセッションの接続例を追加
2023年05月:セッション・タイプの差異比較を追加