AWS VPCはAWS内にプライベートな仮想ネットワーク空間を作成できるサービスです。
VPCを利用することで、「VPN経由や専用線でしか接続できないセキュアな環境」を構築することができます。
今回は、VPCを使用してどのようにセキュアな環境を構築すればよいか、構築の具体的な手順を紹介します。
今回構築するアーキテクチャ
今回はVPC空間に「パブリックサブネット」と「プライベートサブネット」を構築し、パブリックサブネットにある「VPNサーバー」を経由しないと「VPN接続テスト用サーバー」にアクセスできないような構成とします。
VPCやサブネットの空間を考えるときに重要なのは「サブネットのIPゾーン」です。
あらかじめ接続元となる環境(社内環境等)で使用しているプライベートIPのIPゾーンを確認しておき、VPCに設定するゾーンと被らないようにする必要があります。
今回は接続元が「192.168.1.0/24」を使用しており、パブリックサブネットには「192.168.11.0/24」、プライベートサブネットには「192.168.12.0/24」を設定します。

(クリックすると画像が拡大されます。)
AWSで構築するもの
上記で紹介したのは概念的なアーキテクチャ構成でしたが、AWS内部に注目すると以下のように何を構築すればよいかが見えてきます。

(クリックすると画像が拡大されます。)
こちらの図からAWSで構築するものを抽出すると以下のようになります。
- VPC
- パブリックサブネット
- プライベートサブネット
- インターネットゲートウェイ
- NATゲートウェイ
- ルートテーブル
- VPNサーバー
- VPN接続テスト用サーバー
「インターネットゲートウェイ」はインターネットからパブリックサブネットにアクセスするために必要です。
また、「NATゲートウェイ」はプライベートサブネットからインターネットにアクセスするために必要です。
(これがないとインターネットからyumパッケージをインストールできなくなります。)
さらに、「ルートテーブル」は各サブネットの通信先を設定するために必要です。
「AWSで構築するもの」にリストアップしたものを1つずつ構築していけば「今回構築するアーキテクチャ」が出来上がります。それでは、早速それぞれの構築手順を紹介していきます。
VPCの作成
まずはVPCの作成を行います。
VPCコンソール画面の「VPCダッシュボード」から「VPC」をクリックし、「VPCを作成」をクリックします。

(クリックすると画像が拡大されます。)
名前を入力し、CIDRブロックにはパブリックサブネットかプライベートサブネットどちらかのCIDRブロックを入力します。今回はパブリックサブネットのCIDRブロック「192.168.11.0/24」を入力しています。
入力できたら「VPCを作成」をクリックします。

(クリックすると画像が拡大されます。)
VPCが作成出来たら、先ほど追加していないCIDRブロックを追加していきます。
VPCコンソール画面の「VPC」から先ほど作成したVPCを選択し、「アクション」から「CIDRの編集」をクリックします。
「新しいIPv4 CIDRを追加」をクリックし先ほど入力しなかったサブネットのCIDRを入力し、「保存」ボタンをクリックし「閉じる」をクリックします。
先ほどはパブリックサブネットのCIDRブロック「192.168.11.0/24」を入力していたため、プライベートサブネットのCIDRブロック「192.168.12.0/24」を入力します。

(クリックすると画像が拡大されます。)
サブネットの作成
作成したVPCに「パブリックサブネット」と「プライベートサブネット」を作成していきます。
インターネットゲートウェイの作成
「インターネットゲートウェイ」を作成していきます。
VPCコンソール画面から「インターネットゲートウェイ」を選択し「インターネットゲートウェイの作成」をクリックします。
インターネットゲートウェイの作成画面では「名前」を入力し「インターネットゲートウェイの作成」をクリックします。

(クリックすると画像が拡大されます。)
ここまででインターネットゲートウェイ自体はできたのですが、VPCにアタッチする必要があります。
VPCコンソール画面の「インターネットゲートウェイ」で作成したインターネットゲートウェイを選択し「アクション」から「VPCにアタッチ」を選択します。
VPCにアタッチ画面では作成したVPCを選択し「インターネットゲートウェイのアタッチ」をクリックします。

(クリックすると画像が拡大されます。)
NATゲートウェイの作成
「NATゲートウェイ」を作成していきます。
ルートテーブルの作成
「ルートテーブル」を作成し、サブネットに関連付けます。
VPCコンソール画面で「ルートテーブル」を選択し「ルートテーブルを作成」をクリックします。
パブリックサブネット用のルートテーブルを「名前」と作成したVPCを選択して「ルートテーブルを作成」から作成します。
また、プライベートサブネット用のルートテーブルも「名前」と作成したVPCを選択して「ルートテーブルを作成」から作成します。

(クリックすると画像が拡大されます。)
ルートテーブルを作成したら、それぞれのサブネットを関連付ける必要があります。
まずはパブリックサブネットにルートテーブルを関連付けていきます。
「ルートテーブル」でパブリックサブネットを選択し「サブネットの関連付け」から「サブネットの関連付けを編集」をクリックします。
サブネットの関連付けを編集画面ではパブリックサブネットを選択し、「関連付けを保存」ボタンをクリックします。

(クリックすると画像が拡大されます。)
プライベートサブネットも同様にルートテーブルを関連付けます。

(クリックすると画像が拡大されます。)
ルートテーブルにルートを設定
ルートテーブルが作成出来たら、「パブリックサブネットのインターネットゲートウェイへのルーティング」と「プライベートサブネットにNATゲートウェイのルーティング」を設定します。
パブリックサブネットのルーティング設定
パブリックサブネットにインターネットゲートウェイへのルーティングを設定します。
「ルートテーブル」からパブリックサブネットを選択し、「ルート」の「ルート編集」をクリックします。
ルートを編集画面では送信先に「0.0.0.0/0」を、ターゲットに作成したインターネットゲートウェイを選択し「変更を保存」ボタンをクリックします。

(クリックすると画像が拡大されます。)
プライベートサブネットのルーティング設定
つぎにプライベートサブネットにNATゲートウェイへのルーティングを設定します。
「ルートテーブル」からプライベートサブネットを選択し、「ルート」の「ルート編集」をクリックします。
ルートを編集画面では送信先に「0.0.0.0/0」を、ターゲットに作成したNATゲートウェイを選択し「変更を保存」ボタンをクリックします。

(クリックすると画像が拡大されます。)
VPNサーバーの構築・接続確認
ここまででVPC関連の構築はすべて完了しています。
あとは各サブネットにサーバーを構築し、通信を確認していきます。
EC2自体は作成出来たので、さっそくSSHで接続してみます。
セキュリティグループに「0.0.0.0/0」のポート22を許可していれば、パブリックサブネットにあるサーバーなので接続できるはずです。
以下のように、パブリックサブネットのサーバーへはインターネット経由でアクセスできることがわかります。

(クリックすると画像が拡大されます。)
SSH接続できたら、VPNの設定をしていきます。こちらは別記事にまとめているのでそちらの内容を参考にしてください。
VPNサーバーをWindowsサーバーで構築している場合は以下の手順になります。
また、EC2の接続では起動するごとにパブリックIPが変わってしまうので、以下を参考に名前解決できるようにすると便利です。
VPN接続テスト用サーバーの構築・接続確認
VPNサーバーが構築できたら、VPNサーバー経由でアクセスするプライベートサブネットのサーバーを構築します。
通常のEC2構築と比較し意識するところだけ抜粋してお伝えします。
サーバーを構築したら早速VPN経由でアクセスできるか確認します。
VPNを繋いだ状態でVPN接続テスト用サーバーのプライベートIPにSSHします。
無事SSHでアクセスできることが確認できたはずです。また、curlコマンドなどを叩いてみるとインターネットにアクセスできることを確認できます。

(クリックすると画像が拡大されます。)
以上でVPCを使用した「パブリックサブネット」「プライベートサブネット」および接続用サーバーの構築が完了です。