AWSのVPCを用いた仮想ネットワークの構築(SSH：踏み台サーバー→バッチサーバー)

# はじめに
インフラエンジニアを勧められ、AWSのVPCを用いた仮想ネットワーク構築してインフラ関係の勉強中。

# 目次
- VPCとサブネットワークの作成
- ルートテーブル、インターネットゲートウェイの作成とメインルートの設定
- 踏み台サーバーとバッチサーバーの作成
- 踏み台サーバーへSSHログイン
- 踏み台サーバーからバッチサーバーへSSHログイン
- バッチサーバーへのアクセス制限

# インフラ構築図
![infra.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581621/062aebbb-82f6-8baa-6709-b620dd031df5.png)


##  VPCとサブネットワークの作成

VPC IPv4 CIDR
`192.168.0.0/16`

サブネットを作成したVPC範囲内で作成
今回は、下記の値で作成

Public subnet　
`192.168.1.0/24`
Private subnet
`192.168.2.0/24`
## ルートテーブル、インターネットゲートウェイの作成とメインルートの設定
### ルートテーブルの作成
ルートテーブルとは、どのサブネットとどのサブネットを通信させるのかを設定するためのものになります。

今回は、作成したVPCと関連付けさせたルートテーブルをPublic subnet用とPrivate subnet用の2つ作成します。

### インターネットゲートウェイの作成
インターネットゲートウェイは、サブネットをパブリック（メインルート）に設定するために必要になります。

任意の名前を設定し作成した後、先ほど作成したVPCにアタッチします。

### メインルートの設定
今回は、Public subnet　をメインルートに設定したいので、先ほど作成したPublic subnet用ルートテーブルの設定を行います。

Public subnet用ルートテーブルのルート編集から、ルートの追加で「送信先」に「0.0.0.0/0」を入力し、「ターゲット」で先ほど作成したインターネットゲートウェイIDを設定して、保存します。

「送信先」に「0.0.0.0/0」にすることで、Public subnetがインターネットとの通信が行えるようになります。

Private subnet用ルートテーブルの設定は、インフラ構築図にあるように今回はVPCのCIDRのルートだけ良いので、特に設定はしません。

## 踏み台サーバーとバッチサーバーの作成（EC2インスタンス）
### 踏み台サーバーの作成
EC2インスタンス作成時のインスタンスの詳細の設定で、どのネットワーク（VPC）のどのサブネットに置くかを選択する欄があります。


**〜インスタンスの詳細の設定〜**
**ネットワーク**　"作成したVPCを選択"
**サブネット**　"public subnet（メインルートに設定したサブネット）"
**自動割り当てパブリックIP**　”サブネット設定を使用（有効）or有効”

**〜セキュリティグループの設定〜**
デフォルトでSSHでのアクセスはできるようになっているので、ルールを追加でHTTPを追加します。
ソースは「0.0.0.0/0」のままでどこからでもアクセスできるようにします。

**〜SSH認証用キーペア〜**
新しいキーペアを作成もしくは、既存のキーがあればそちらを設定します。
新しいキーペアを作成した場合は、ダウンロードも忘れずに！

以上の設定で踏み台サーバー（EC2インスタンス）を作成します。



### バッチサーバーの作成

**〜インスタンスの詳細の設定〜**
**ネットワーク**　"作成したVPCを選択"
**サブネット**　"private subnet"
**自動割り当てパブリックIP**　”サブネット設定を使用（無効）or無効”

既存のキーペアを選択で、踏み台サーバーで選択したキーペアと同じものを選択します。
※ここで作成したキー名を`「vpc-practice.pem」`として説明を進めていきます。

以上の設定でバッチサーバー（EC2インスタンス）を作成します。

## 踏み台サーバーへSSHログイン
キーをローカルの　~/.ssh/へ格納したいので、`vpc-practice.pem`をホームディレクトリへ保存し、
ホームディレクトリにある`vpc-practice.pem`を~/.ssh/へ移動する以下のコマンドを実行します。
```:ローカル
ec2-user:~/environment $ mv vpc-practice.pem ~/.ssh/
```
次にキーペアファイルの権限を変更する以下のコマンドを実行します。
```:ローカル
ec2-user:~/environment $　sudo chmod 600 ~/.ssh/vpc-practice.pem
```
これでキーが使用できるようになり、踏み台サーバーへSSHログインできるようになります。
- chmod 600について

https://qiita.com/aaabb6211/items/30ddad48773f37affcb9

SSHログインのコマンドを実行
```:ローカル
ec2-user:~/environment $ ssh -i ~/.ssh/vpc-practice.pem ec2-user@xxx.xxx.xxx.xxx（パブリックIP）
```
ログインできます。

## 踏み台サーバーからバッチサーバーへSSHログイン
２種類のやり方を紹介します。
①ローカルのキーを使って踏み台サーバーを中継し、バッチサーバーへ１つのコマンドでアクセスする方法
②ローカルから踏み台サーバーへSSHログインした後に、バッチサーバーへSSHログインする方法

#### ①ローカルのキーを使って踏み台サーバーを中継し、バッチサーバーへ１つのコマンドでアクセスする方法
オプションのProxyCommandを使うことで、ローカルにあるキーを使って踏み台サーバーを経由してバッチサーバーへアクセスできます。
セキュリティ観点からも、キーを踏み台サーバーに置かなくても良いので安全なのかなと思います。

```:ローカル
ec2-user:~/environment $ ssh -o ProxyCommand='ssh -i ~/.ssh/vpc-practice.pem ec2-user@xxx.xxx.xxx.xxx（踏み台サーバーのパブリックIP） -W xxx.xxx.xxx.xxx（バッチサーバーのプライベートIP）:22' -i ~/.ssh/vpc-practice.pem ec2-user@xxx.xxx.xxx.xxx（バッチサーバーのプライベートIP）
```

#### ②ローカルから踏み台サーバーへSSHログインした後に、バッチサーバーへSSHログインする方法

踏み台サーバーにもローカル同様にキーを格納し、権限を付与させるだけ

まずは、下記のコマンドで`ローカルにあるキーを踏み台サーバーへコピー`します。
```:ローカル
ec2-user:~/environment $ scp -i ~/.ssh/vpc-practice.pem ~/.ssh/vpc-practice.pem ec2-user@xxx.xxx.xxx.xxx（踏み台サーバーのパブリックIP):
vpc-practice.pem(コピーができればコピーしたファイル名がコマンド実行結果に表示されます。)
```
**※パブリックIPの後ろに:（コロン）をつけるのを忘れないように！**

次に、`踏み台サーバーへSSHログイン`します。
```:ローカル
ec2-user:~/environment $ ssh -i ~/.ssh/vpc-practice.pem ec2-user@xxx.xxx.xxx.xxx（パブリックIP）
```
ls コマンドでキー（vpc-practice.pem）がコピーできていることが確認できます。

次に、踏み台サーバーのホームディレクトリにある`vpc-practice.pem`を~/.ssh/へ移動する以下のコマンドを実行します。
```:踏み台サーバー
[ec2-user@ip-xx-xx-xx-xx ~]$ mv vpc-practice.pem ~/.ssh/
```
cdコマンド、lsコマンドで移動できているか、確認できます。

次にキーペアファイルの権限を変更する以下のコマンドを実行します。
```:踏み台サーバー
[ec2-user@ip-xx-xx-xx-xx ~]$ sudo chmod 600 ~/.ssh/vpc-practice.pem
```
これでキーが使用できるようになり、バッチサーバーへSSHログインできるようになります。

```:踏み台サーバー
ec2-user:~/environment $ ssh -i ~/.ssh/vpc-practice.pem ec2-user@xxx.xxx.xxx.xxx（バッチサーバープライベートIP）
```
これでアクセスできます。

最後に、バッチサーバーへのアクセスを踏み台サーバーのみに制限します。


## バッチサーバーへのアクセス制限

バッチサーバーインスタンスのインバウンドルールを設定します。
現在SSHのソースが「0.0.0.0/0」になっているものを踏み台サーバーのプライベートIP/32へ変更します。

以上で簡単な仮想ネットワークの構築できました。

![infra.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2581621/27f7882c-7ea3-63f9-09cf-6b6aacc8afe7.png)