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

# 目的

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

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

# お試し環境
![image-20201126103202461.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/078f47ca-481f-2a1a-00fd-42a08bee7344.png)

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

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

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

  

## 準備

SSHの主な認証方式としては、パスワード認証方式と公開鍵認証方式がありますが、今回は公開鍵認証方式を使います。公開鍵と秘密鍵の２つの鍵(キーペア)が必要になるので、キーペアがない場合には、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キー]**の項目についてのみ記述します。

![image-20201124132321110.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/c10fbf25-5879-fdcc-9a61-16e2b6e82257.png)

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

![image-20201124133651841.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/f1162e0c-4866-5593-0f9b-06ca3970aa44.png)


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

![image-20201126094947334.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/0188946b-43ba-0b6f-540e-20d824f5b478.png)

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

## プライベートwebサーバーの作成（private-web01）
同様に、webサーバー用のインスタンスを作成します。踏み台との違いは、プライベート・サブネットでインスタンスを作成し、パブリックなIPアドレスを持たないことです。
![image-20201124133741922.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/3e31d09a-512a-e674-349e-9703d5c5d0cb.png)

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

![image-20201124134005256.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/8e816a70-9116-8473-975c-353a2813e72c.png)
プライベート・サブネットにプライベートIPアドレスをだけを持つインスタンスが作成されました。

# 接続テスト
## 1. クライアントから踏み台サーバーへの接続
### sshコマンド

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

```
ssh -i ~/.ssh/id_rsa user@hostname
```

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

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

コマンド・プロンプトで実行します。
![image-20201126095403274.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/05603f7b-43a6-31ae-18b7-281a589d56bd.png)
接続を継続するか？ とのメッセージが表示されるので、**yes** を入力します。

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

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

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

```
scp ./id_rsa opc@168.138.xxx.xxx:~/.ssh
```

踏み台サーバーに秘密鍵（id_rsa）がコピーされました。
![image-20201124151356126.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/59900ae6-ee11-9caa-0531-f45e53a24b4e.png)

### 秘密鍵のパーミッション
続いて、プライベートwebサーバーへ接続を試みますが、秘密鍵のパーミッションに関して警告が表示されて接続に失敗します。
![image-20201124151945643.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/61bfb895-b156-1d2b-d23a-4cc4592c9b51.png)
この対策としては、オーナーのみが読み書き可能なパーミッションに変更することで解決できます。

```
chmod 600 ~/.ssh/id_rsa
ssh -i ~/.ssh/id_rsa opc@192.168.100.3 ← プライベート・サブネットのwebサーバー
```

再度、接続を試みると今度は成功しました。
![image-20201124153234133.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/9826262e-21c1-5cd2-c52c-a42044593cb6.png)

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

```
[opc@private-web01 ~]$ 
```
## 3. プライベートwebサーバーからインターネットへの接続

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

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

- NATゲートウェイはパブリックIPを持たないインスタンスにインターネットへのアクセスを提供するゲートウェイ
- インスタンスからインターネットへ向けての通信とその応答は受信するが、その逆のインターネットからプライベート・サブネット内のプライベートIPへの接続は許さない
- NATゲートウェイは仮想ネットワーク（VCN）に紐づいており、ルート表のターゲットにNATゲートウェイを設定しておく必要がある
![image-20201126104201888.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/c4839e28-558b-caf5-5358-290152197b61.png)

### インターネットへの接続

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

ここでは既に作成済みのNATゲートウェイが使用可能と表示されています。
![image-20201124163122669.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/f274b1bc-fc46-ca33-090f-5679abfe8ff4.png)


また、[プライベート・サブネット]のルート表も確認すると、ターゲットにNATゲートウェイが設定されています。
![image-20201124163355245.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/5e349646-61fb-47a4-4066-40dd3aa61448.png)


この状態で、パブリックIPアドレスを持たないインスタンスからインターネットに繋がるかを確認してみます。
インターネットの接続確認でよく使用される ping 8.8.8.8 に5回 ping を送ってみます。
![image-20201124163605913.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/2debb212-6ac8-619f-9228-33e00d9b7af4.png)
ちゃんと、インターネットに繋がっているようです。これで APサーバーやデータベースのインストール／セットアップもできそうです。ちなみに Nginx のインストールも正常にできました。

```
sudo yum install -y nginx
```



### トラフィックの遮断
NATゲートウェイの設定で、[トラフィックのブロック]を選択し無効化すれば、インターネットとの接続を遮断することができます。
![image-20201124163811118.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/d75f352d-ec25-fe42-a841-a23f90e644ba.png)

トラフィックのブロックが有効になりました。
![image-20201124163920995.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/b998d67b-9a3b-c0da-7035-3c00d33425c1.png)

この状態で先ほどと同じように ping を発しても、インターネットからは応答なしとなります。
![image-20201124164032839.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/496842/649816e6-8284-06cf-4063-6b24b3b3f18e.png)
# 参考URL

[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識](https://qiita.com/tag1216/items/5d06bad7468f731f590e)

[Oracle Cloud：プライベートサブネットからインターネットへアクセスさせてみてみた](https://qiita.com/shirok/items/e9466d9698899c8ab7d9)