[OCI] 踏み台サーバーからSSHでプライベート・サブネットのインスタンスへの接続と、NATゲートウェイを試してみる


目的

プライベートなサブネット内のコンピュートインスタンスはプライベートIPしか持たないため、このインスタンスに対してインターネット経由で作業をおこなう場合には、パブリックなIPを持つ踏み台サーバーを使う必要がある。とは聞いていたものの、これまで踏み台サーバーを使ってプライベート・サブネット内にあるインスタンスに接続したことがなかったので、実際にはどのように接続できるのかを今回試してみました。

また、プライベート・サブネット内のインスタンスの運用に際しては、安全にwebサーバーやデータベースをインストールしてセットアップする必要もあります。その際に利用可能なNATゲートウェイについても確認してみました。

お試し環境

  • Oracle Cloud(OCI) の仮想ネットワーク(VCN)に踏み台サーバー(図中:bastion01)と、プライベート・サブネット内のコンピュートインスタンス(図中:private-web01)を作成。共にOSはOpenSSLが使えるLinux(Oracle Linux)で構成。
  • 踏み台サーバーはプライベートIPとインターネットからアクセスできるパブリックIPを持ちます。

  • 自分のNote PC(windows10)からはインターネット経由で踏み台サーバーへの接続が可能な状態。踏み台へのアクセスはSSHプロトコルを介しておこないます。TeratermやPutty などのターミナルツールでも可能ですがSSHコマンドを再学習する意味もあり、今回はシンプルにコマンド・プロンプトを使って試してみます。

  • 踏み台からパブリックのIPを持たないインスタンスへの接続が確認できたら、次にNATゲートウェイからインターネットに接続できるかを試してみます。

準備

SSHの主な認証方式としては、パスワード認証方式と公開鍵認証方式がありますが、今回は公開鍵認証方式を使います。公開鍵と秘密鍵の2つの鍵(キーペア)が必要になるので、キーペアがない場合には、ssh-keygenコマンドで作成しておきます。公開鍵はコンピュートインスタンスを作成する際にも指定します。

windows10 のコマンド・プロンプトで作成したものを使用します。(パスフレームは何も指定せず)

C:\Users\SHASAI>ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\SHASAI/.ssh/id_rsa): <- 秘密鍵を生成するディレクトリを指定
Created directory 'C:\Users\SHASAI/.ssh'.
Enter passphrase (empty for no passphrase): <- パスフレーズを入力
Enter same passphrase again:
Your identification has been saved in C:\Users\SHASAI/.ssh/id_rsa.
Your public key has been saved in C:\Users\SHASAI/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:tGCQTham6t06zOxgXBZqtjH8jspaggM8JmozPjy402s shasai@SHASAI-JP
The key's randomart image is:
+---[RSA 2048]----+
|    +o           |
|   o+.           |
|  .=  o .        |
|o.. o. o .       |
|+@ o    S        |
|@ X .            |
|B@=o .           |
|BBE=.            |
|*B==.            |
+----[SHA256]-----+

指定のディレクトリに、秘密鍵(id_rsa)と、公開鍵(id_rsa.pub)が作成されます。

踏み台サーバーの作成(bastion01)

踏み台サーバーをパブリック・サブネットに作成します。ここでは、[ネットワーキングの構成][SSHキー]の項目についてのみ記述します。

ネットワーキングの構成
[ネットワーク] 既存のVCNを選択
[サブネット] パブリック・サブネットを選択
[パブリックIPアドレス] ”パブリックIPV4アドレスの割当て”を選択

SSHキーの追加
公開キーファイルの選択 を選択し、作成した公開鍵(id_rsa.pub)を指定します。作成をクリックしインスタンスを作成します。

パブリックIPアドレスと、プライベートIPアドレスを持つ踏み台サーバーが作成されました。

プライベートwebサーバーの作成(private-web01)

同様に、webサーバー用のインスタンスを作成します。踏み台との違いは、プライベート・サブネットでインスタンスを作成し、パブリックなIPアドレスを持たないことです。

ネットワーキングの構成
[ネットワーク] 既存のVCNを選択
[サブネット] プライベート・サブネットを選択
[パブリックIPアドレス] ”パブリックIPV4アドレスを割り当てないでください”を選択


プライベート・サブネットにプライベートIPアドレスをだけを持つインスタンスが作成されました。

接続テスト

1. クライアントから踏み台サーバーへの接続

sshコマンド

公開鍵認証方式では、サーバーに公開鍵、クライアントに秘密鍵を置いてsshコマンドを使用します。サーバー側には、インスタンス作成時に公開鍵が渡されているので、クライアントからは秘密鍵を指定して踏み台サーバーに接続します。

ssh -i ~/.ssh/id_rsa user@hostname
  • -i オプション
    公開鍵認証で使用する秘密鍵ファイルを指定します。ssh-keygenコマンドでキーペアを作成した際の秘密鍵( デフォルト ~/.ssh/id_rsa など)

  • user@hostname
    user:opc を指定します。
    hostname:踏み台サーバーのホストネーム、またはパブリックIPアドレスを指定します。

コマンド・プロンプトで実行します。

接続を継続するか? とのメッセージが表示されるので、yes を入力します。

プロンプトが下記のとおり踏み台サーバー(bastion01)となり、踏み台サーバーへの接続が成功しました。

[opc@bastion01 ~]$ 

2. 踏み台サーバーからプライベートwebサーバーへの接続

続いて、踏み台サーバーからプライベート・サブネットのwebサーバーへの接続を試行します。1.と同様にsshコマンドを使い接続します。今度は踏み台サーバーがクライアントとなるので秘密鍵が必要です。

秘密鍵のコピー

キーペアのあるディレクトリから、秘密鍵を踏み台サーバーにscpコマンドなどでコピーします。

scp ./id_rsa [email protected]:~/.ssh

踏み台サーバーに秘密鍵(id_rsa)がコピーされました。

秘密鍵のパーミッション

続いて、プライベートwebサーバーへ接続を試みますが、秘密鍵のパーミッションに関して警告が表示されて接続に失敗します。

この対策としては、オーナーのみが読み書き可能なパーミッションに変更することで解決できます。

chmod 600 ~/.ssh/id_rsa
ssh -i ~/.ssh/id_rsa [email protected] ← プライベート・サブネットのwebサーバー

再度、接続を試みると今度は成功しました。

以下のプロンプトが表示され、踏み台サーバーからプライベート・サブネットのwebサーバーに接続できたことが確認できました。これにより、自分のPCのコマンド・プロンプトからOCIのプライベート・サブネットにあるwebサーバーを構成することができるようになりました。

[opc@private-web01 ~]$ 

3. プライベートwebサーバーからインターネットへの接続

踏み台を経由して、sshコマンドでプライベートIPしか持たないインスタンスに接続することが確認できましたが、依然 インターネットとは接続できません。このインスタンスに継続してwebサーバーやデータベースをインストールしセットアップしていくことを考えれば、当然インターネットにつながる方が数段便利です。

そのための解決策がNATゲートウェイです。

NAT ゲートウェイ

  • NATゲートウェイはパブリックIPを持たないインスタンスにインターネットへのアクセスを提供するゲートウェイ
  • インスタンスからインターネットへ向けての通信とその応答は受信するが、その逆のインターネットからプライベート・サブネット内のプライベートIPへの接続は許さない
  • NATゲートウェイは仮想ネットワーク(VCN)に紐づいており、ルート表のターゲットにNATゲートウェイを設定しておく必要がある

インターネットへの接続

左上のナビゲーションメニューから[ネットワーキング]-[仮想クラウド・ネットワーク]を選択し、使用しているVCNをクリックします。左下のリソース項目からNATゲートウェイを選択します。

ここでは既に作成済みのNATゲートウェイが使用可能と表示されています。

また、[プライベート・サブネット]のルート表も確認すると、ターゲットにNATゲートウェイが設定されています。

この状態で、パブリックIPアドレスを持たないインスタンスからインターネットに繋がるかを確認してみます。
インターネットの接続確認でよく使用される ping 8.8.8.8 に5回 ping を送ってみます。

ちゃんと、インターネットに繋がっているようです。これで APサーバーやデータベースのインストール/セットアップもできそうです。ちなみに Nginx のインストールも正常にできました。

sudo yum install -y nginx

トラフィックの遮断

NATゲートウェイの設定で、[トラフィックのブロック]を選択し無効化すれば、インターネットとの接続を遮断することができます。

トラフィックのブロックが有効になりました。

この状態で先ほどと同じように ping を発しても、インターネットからは応答なしとなります。

参考URL

インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識

Oracle Cloud:プライベートサブネットからインターネットへアクセスさせてみてみた