OCI Bastion 経由でプライベート・サブネット内の Ubuntu インスタンスに SSH で接続

Oracle Linux と共通する部分は省略し、Ubuntu インスタンス固有の OCI Bastion 接続手順に絞ってまとめます。

前回、Oracle Linux インスタンスへ OCI Bastion 経由で SSH 接続する手順を書きました。

今回は、前回記事で触れた基本的な構成を前提に、Ubuntu インスタンスを対象とした OCI Bastion 経由の SSH 接続手順だけをまとめます。
Oracle Linux と共通する VCN / Bastion の作成や一般的なネットワーク設定は省略し、Ubuntu 固有の注意点に絞って解説します。

前提

  • ターゲット OCI インスタンスには Ubuntu のイメージを使う
  • インスタンスは プライベートサブネット に配置し、パブリックIPなし で作成する
  • Bastion サービスは事前に作成済みで、プライベートサブネットをターゲットにしている

Ubuntu でのインスタンス作成時のポイント

1. イメージに Ubuntu を選択する

インスタンス作成画面のイメージ選択で、Ubuntu を選びます。
OCI の無料枠対象であれば Always Free 適格 のマークを確認してください。
私は今回 Ubuntu 24.04 Minimal を選択しました。

2. ネットワーキング設定

ここは Oracle Linux のときと同じく以下のように設定します。

  • プライベートサブネットを選択する
  • パブリックIP の割当ては なし にする

SSH キーについても同様です。

Ubuntu での Bastion セッション作成

Bastion 自体は、Oracle Linux のときに作成済みなのでそれを使います。
ただ、セッションの作成方法が異なり、Ubuntu の場合は 管理対象 SSH セッションではなく、SSHポート転送セッションを使う のが一般的です。

Bastion セッションの設定

  1. OCI コンソールで「アイデンティティとセキュリティ」 > 「要塞(Bastion)」に移動する
  2. 作成した Bastion を選択し、「セッションの作成」をクリックする
  3. 以下のように設定する
項目内容
セッション・タイプSSHポート転送セッション を選択します。
ターゲット・ホストUbuntu インスタンスをIPアドレスまたはインスタンス名で指定します。
SSH キーご自身のPCにある SSH 公開鍵をアップロード or ペーストするか、新規に生成します。

  1. 「セッションの作成」を実行し、状態が アクティブ になるまで待つ

鍵のパーミッション

Linux の SSH では秘密鍵の権限が緩いと接続が拒否されます。 以下のように chmod 600 で制限しておきます。

# 例
chmod 600 ~/.ssh/<Ubuntuの秘密鍵>
chmod 600 ~/.ssh/<セッションの秘密鍵>

SSH での接続方法

方法1

Bastion セッションがアクティブになったら、右側のメニューから「SSH コマンドのコピー」を使います。 以下のようなコマンドがコピーされます。

ssh -i <privateKey> -N -L <localPort>:10.0.1.203:22 -p 22 ...
項目内容
<privateKey>セッション作成時の秘密鍵のパスを設定します。
<localPort>基本的には 「(1024番〜65535番の間であれば)あなたのPCで現在使われていない任意のポート番号」なら何番でも自由 です。
よく使われるのは、覚えやすい 12345 や 2222、50022 などだそうです。

上記を踏まえたうえで、まずは以下のようにコマンドを時刻します。

# 例
ssh -i ~/.ssh/bastion_id_rsa -N -L 12345:10.0.1.143:22 -p 22 ...

すると画面が止まった(待機状態)になります。
これでトンネルが維持されている状態ですので、このターミナル画面は閉じずにそのまま放置してください。

この状態で新しく別のターミナル画面を開き、以下のコマンドを実行して Ubuntu インスタンスにログインします。

ssh -i ~/.ssh/Ubuntu作成時の秘密鍵 -p 12345 ubuntu@localhost
📝 注記

あなたのPCの 12345 番ポート(localhost:12345)に接続することが、そのままトンネルを通じて向こう側のUbuntuに繋がるため、接続先は localhost となります。
OCI の Ubuntu インスタンスのユーザー名は ubuntu なので、それを指定します。

方法2

前述の方法だとターミナルを2つを使わないといけません。
これをコマンド一発でやる場合、以下のように打ちます。

ssh -i <Ubuntuの秘密鍵> -o ProxyCommand="ssh -i <セッションの秘密鍵> -W %h:%p -p 22 ... ubuntu@10.0.1.143

方法3

上記のコマンドも結局めちゃくちゃ長いので、自分のPCの ~/.ssh/config に設定を書いてしまうのが最もスマートです。

~/.ssh/config をテキストエディタで開き、以下のように追記します。

# 1. Bastion(要塞)自体の設定
Host oci-bastion
    HostName host.bastion.....oci.oraclecloud.com
    Port 22
    # ★セッションを作成するたびに、以下のUser(ocid...の部分)だけ書き換える
    User ocid1.bastionsession.oc1.....amaaaaaa...
    IdentityFile ~/.ssh/セッション作成時の秘密鍵

# 2. ターゲットとなるUbuntuの設定
Host oci-ubuntu
    HostName 10.0.1.143
    User ubuntu
    IdentityFile ~/.ssh/Ubuntu作成時の秘密鍵
    ProxyCommand ssh oci-bastion -W %h:%p

設定した後は以下のコマンドだけで接続できます。

ssh oci-ubuntu

また、3時間ごとにセッションを作り直した際も、上の User の部分(ocid1.bastionsession…)だけを書き換えるだけで済みます。

VS Code の Remote SSH もこれで使えるようになります。

Ubuntu へのログイン後に確認すること

接続に成功すると、プロンプトが次のようになります。

ubuntu@<hostname>:~$

参考

Hugo で構築されています。
テーマ StackJimmy によって設計されています。