はじめに
AWSの学習を進める中で、
基本的なネットワークアーキテクチャとしてよく登場する
- Public Subnet と Private Subnet の違い
- なぜ踏み台(Bastion Host)や NAT Gateway が必要なのか
といった点を、
机上の理解ではなく、実際に構築して理解したい と思い、本構成を作成しました。
本記事では、VPCの基本構成としてよく用いられる以下のリソースを使用します。
- Public Subnet
- Private Subnet
- Bastion Host(踏み台EC2)
- NAT Gateway
- Elastic IP(EIP)
これらを用いて環境を構築し、
自分のPCから Private Subnet 上の EC2 へ踏み台経由で SSH 接続する
ところまでをゴールとします。
構成図
※ 上記構成図は、本記事で最終的に構築する構成を表しています。
- VPC 内に Public Subnet / Private Subnet を作成
- Public Subnet には踏み台 EC2 と NAT Gateway を配置
- 踏み台 EC2 および NAT Gateway には Elastic IP を関連付け
- Private Subnet には外部公開しない EC2 を配置
- インターネットからの SSH 接続は踏み台 EC2 のみに制限
- Private Subnet 上の EC2 は踏み台経由でのみ SSH 接続可能
- Private Subnet 上の EC2 は NAT Gateway 経由でアウトバウンド通信のみ可能
対象読者
- AWS を触り始めたばかりの方
- VPC / Subnet / Route Table の関係がまだ曖昧な方
- NAT Gateway や EIP の役割を実際に構築して理解したい方
ゴール構成
- VPC を作成する
- Public / Private Subnet を分離する
- Internet Gateway / NAT Gateway を作成する
- Elastic IP(EIP)を作成し、各リソースに関連付ける
- Route Table を作成し、各 Subnet に関連付ける
- Public Subnet に踏み台 EC2 を配置する
- Private Subnet に EC2 を配置する
- PC → 踏み台 EC2 → Private EC2 の SSH 接続を確認する
- Private EC2 からインターネットへのアウトバウンド通信を確認する
構成概要
| 項目 | 内容 |
|---|---|
| リージョン | ap-northeast-1(東京) |
| VPC CIDR | 10.0.0.0/21 |
| Public Subnet | 10.0.1.0/24 |
| Private Subnet | 10.0.2.0/24 |
| EC2(Public) | 踏み台 EC2(Bastion Host) |
| EC2(Private) | アプリ用 EC2 |
| NAT Gateway | Public Subnet に配置 |
| Elastic IP | 踏み台 EC2 / NAT Gateway に使用 |
| 接続方式 | SSH(踏み台経由) |
なぜこの構成にするのか
Private Subnet 上の EC2 に直接パブリック IP を付与し、
インターネットから SSH 接続することも技術的には可能です。
しかし、その場合 EC2 が直接インターネットに晒されるため、
セキュリティリスクが高くなります。
そのため本構成では、以下の方針を採用しています。
- 外部公開が必要なリソースのみを Public Subnet に配置
- Private Subnet 上の EC2 はインターネットから直接アクセス不可
- 管理アクセス(SSH)は踏み台 EC2 に集約
- Private Subnet のアウトバウンド通信は NAT Gateway 経由に限定
- パブリック IP は Elastic IP として明示的に管理
VPCの作成
以下のように設定します。
CIDR ブロックは 10.0.0.0/21 を指定します。

サブネットの作成
Public Subnet
以下のように設定します。
- CIDR:
10.0.1.0/24 - AZ:ap-northeast-1a
- パブリック IP の自動割り当て:無効
Private Subnet
Public Subnet と同様の手順で作成します。(写真は割愛)
- CIDR:
10.0.2.0/24 - AZ:ap-northeast-1a
- パブリック IP の自動割り当て:無効
Internet Gatewayの作成
- Internet Gateway を作成
- 作成した VPC にアタッチ
ルートテーブルの作成と関連付け
ここでは、
Public Subnet 用 と Private Subnet 用 の
2 種類のルートテーブルを作成し、それぞれ適切なサブネットに関連付けます。
Public Subnet 用ルートテーブルの作成
Public Subnet からインターネットへ直接通信できるよう、
Internet Gateway を向いたルートを設定します。
Public Subnet 用のルートテーブルを作成します。
サブネットへの関連付け
作成したルートテーブルを Public Subnet に関連付け します。
また、ルートの設定を以下の通りにします。
- 宛先:
0.0.0.0/0 - ターゲット:Internet Gateway
Public Subnet 設定後のリソースマップ
この時点で、
Public Subnet は Internet Gateway 経由で
インターネット通信が可能な状態になります。
NAT Gatewayの作成
Private Subnet 上の EC2 が
インターネットへアウトバウンド通信のみ可能 となるよう、
NAT Gateway を作成します。
NAT Gateway は
Internet Gateway 経由で通信する必要があるため、必ず Public Subnet に配置 します。
設定内容
- 配置先サブネット:Public Subnet
- Elastic IP:NAT Gateway 用に割り当てた EIP を指定
NAT Gateway の作成が完了したら、
次に Private Subnet 用ルートテーブル を作成し、
この NAT Gateway をルートのターゲットとして設定します。
Private Subnet 用ルートテーブルの作成
Private Subnet 上の EC2 は
直接インターネットに出さず、
NAT Gateway 経由でアウトバウンド通信のみ を許可します。
Private Subnet 用のルートテーブルを作成します。
サブネットへの関連付け
このルートテーブルを Private Subnet に関連付け します。
またルートの設定を以下の通りにします。
- 宛先:
0.0.0.0/0 - ターゲット:NAT Gateway
Private Subnet 設定後のリソースマップ
この時点で、
- Public Subnet → Internet Gateway
- Private Subnet → NAT Gateway
という 役割分離されたネットワーク構成 が完成します。
EC2インスタンスの作成
ここから EC2 インスタンスを作成していきます。
まずは Public Subnet に配置する踏み台 EC2 を作成します。
共通設定
今回作成する EC2 は、以下の設定を共通とします。
- AMI:Amazon Linux 2023
- インスタンスタイプ:t2.micro
- キーペア:新規作成(pem形式)
Public Subnet 配置 EC2(踏み台)の作成手順
名前の設定
インスタンス名を設定します。
AMI の設定
キーペアの設定
新しいキーペアを作成します。
※ 後ほど SSH 接続で使用するため、大切に保管してください。
ネットワーク設定
- VPC:今回作成した VPC
- サブネット:Public Subnet
- パブリック IP の自動割り当て:無効
- ※ 後ほど Elastic IP を関連付けます
- セキュリティグループ:踏み台 EC2 用 SG
- SSH のソース:自分のグローバル IP
ストレージ設定
インスタンス作成完了
Private Subnet 配置 EC2 の作成
踏み台 EC2 と同様の手順で、
Private Subnet に EC2 インスタンスを作成します。
踏み台EC2(Public Subnet)
- 配置先:Public Subnet
- パブリック IP 自動割り当て:無効
- セキュリティグループ:踏み台 EC2 用 SG
- Elastic IP:踏み台 EC2 用 EIP を関連付け
アプリ用EC2(Private Subnet)
- 配置先:Private Subnet
- パブリック IP:なし
- セキュリティグループ:アプリ用 EC2 用 SG
ここまでで、
Public / Private それぞれに EC2 が配置された状態になります。
SSH接続および通信確認
以下の点を確認します。
- 自分の PC から Public Subnet 上の EC2(踏み台)へ SSH 接続できること
- 踏み台 EC2 経由で Private Subnet 上の EC2 へ SSH 接続できること
- Private Subnet 上の EC2 からインターネットへアウトバウンド通信できること
① PC → Public Subnet(踏み台EC2)への SSH 接続
まず、秘密鍵のパーミッションを変更します。
chmod 400 test-ec2-key.pem
踏み台 EC2 の Elastic IP を指定して SSH 接続します。
ssh -i test-ec2-key.pem ec2-user@<踏み台EC2のElasticIP>
→ Public Subnet 上の踏み台 EC2 に SSH ログインできることを確認
② 踏み台EC2へ秘密鍵を転送(scp)
踏み台 EC2 から Private Subnet の EC2 へ SSH 接続するため、
秘密鍵を scp で踏み台 EC2 に転送します。
scp -i test-ec2-key.pem test-ec2-key.pem ec2-user@5<踏み台EC2のElasticIP>:/tmp
[ec2-user@ip-10-0-1-143 ~]$ cd /tmp
[ec2-user@ip-10-0-1-143 tmp]$ ls
test-ec2-key.pem
→ 秘密鍵が踏み台 EC2 に転送されたことを確認
③ Public Subnet → Private Subnet EC2 への SSH 接続
踏み台 EC2 から、
Private Subnet 上の EC2(プライベート IP)へ SSH 接続します。
ssh -i test-ec2-key.pem ec2-user@<アプリ用EC2のIP>
→ Private Subnet 上の EC2 に SSH 接続できることを確認
④ Private Subnet EC2 からインターネット通信の確認
Private Subnet 上の EC2 から、
NAT Gateway 経由でインターネット通信が可能かを確認します。
curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>
ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=3.64 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=3.30 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=114 time=3.29 ms
→ Private Subnet 上の EC2 から NAT Gateway 経由で
インターネットへアウトバウンド通信できることを確認
まとめ
本記事では、AWS の基本的なネットワーク構成として、
- Public / Private Subnet の分離
- 踏み台 EC2 を用いた SSH 接続
- NAT Gateway を利用したアウトバウンド通信制御
を実際に構築し、
通信が意図した経路で行われていることを確認しました。
単にリソースを作成するだけでなく、
「なぜこの構成にするのか」「どこで通信が制御されているのか」を
理解することが重要だと感じました。
AWS 初学者の方が、
VPC や Subnet、ルートテーブルの役割を理解する一助になれば幸いです。
























