VPC(Virtual Private Cloud)
VPC(Virtual Private Cloud)
AWS VPC(AWS::EC2::VPC)について記載します。
ゴール
パブリックサブネットとプライベートサブネットにそれぞれインスタンスを作成して、パブリックなインスタンス経由でプライベートなインスタンスにSSH接続します。
用語
- リージョン
- リージョンは複数のアベイラビリティゾーンを持ちます
- アベイラビリティゾーン
- VPC
- サブネット
- インターネットゲートウェイ
- NAT(Network Address Translation)ゲートウェイ
- プライベートIPとグローバルIPを変換します
- サブネットに配置します(サブネットと1対1とは限らない)。
- NATゲートウェイを配置したサブネッは
パブリックサブネットになります - NATゲートウェイは厳密には
NAPTになります - NATゲートウェイとインターネットゲートウェイの違いは以下を参照してください
https://milestone-of-se.nesuke.com/sv-advanced/aws/internet-nat-gateway/
- ルートテーブル
- ルートはステートフルではない
- セキュリティグループ
- セキュリティグループは、複数組み合わせて適用するのが一般的です
- VPCのデフォルト(セキュリティグループ ID (sg-xxxxxxxx))のセキュリティグループ
同じセキュリティグループに割り当てられているネットワークインターフェイス(および関連付けられているインスタンス)からのインバウンドトラフィックを許可します。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_SecurityGroups.html#DefaultSecurityGroup
- セキュリティグループはステートフルです(ACLはステートレスです)
ref. https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_SecurityGroups.html
NAT(Network Address Translation)はIPアドレスを変換する技術です。一般的には、プライベート IPアドレスをグローバルIPアドレスに変換する技術とされています。
NATには1つ大きな問題があります。
それはNATにはブロードバンドルータが保持しているグローバルIPアドレスの
数しか同時に接続が出来ないという事です。
LAN側に接続されている複数のPCを1つのグローバルIPアドレスに変換して、
インターネットにパケットを送信した場合、そのパケットの返信はすべて
ブロードバンドルータのグローバルIPアドレス宛に返ってきます。
この時にブロードバンドルータはNATテーブルを見ても、どのPCのアドレスに
置き換えればよいのかを判断することが出来ないわけです。
そんな問題を解決するために考え出されたのが、
NAPT(IPマスカレード)という機能です。https://www.itbook.info/study/nat4.html
作成手順
概要
- VPCを構成
- インスタンス作成
作成手順
- VPC作成
- ターゲットに
localが設定されたルートを持つルートテーブルが自動で作成されます
- ターゲットに
- インターネットゲートウェイを作成&VPCにアタッチします
パブリックサブネット用のルートテーブルを作成します- デフォルトルートにインターネットゲートウェイを指定します
- パブリックサブネットを作成
- サブネットを作成します
- サブネットを
パブリックサブネッ用ルートテーブルに関連付けます
ルートテーブルにインターネットゲートウェイを設定したルートテーブルに関連付けたサブネットをパブリックサブネットと呼びます
パブリックサブネットにNATゲートウェイを作成しますプライベートサブネット用ルートテーブルを作成します- ターゲットにNATゲートウェイを指定したルートを作成します
- プライベートサブネットを作成
プライベートサブネット用ルートテーブルに関連付けます
プライベートサブネットにEC2インスタンス配置します- パブリックIPは割り当てない
- セキュリティグループにVPCの
defaultを指定します
- パブリックサブネットにEC2インスタンスを作成します(踏み台サーバ:bastion)
- パブリックIPを割り当てます
- インバウンドルールでSSHを許可したセキュリティグループを設定します(セキュリティグループはステートフル)
- セキュリティグループにVPCの
defaultを設定(プライベートサブネットのインスタンスに接続するため)
サブネット
- パブリックサブネット
- パブリックサブネットのルートテーブルはインターネットゲートウェイへのルートを持ちます
- パブリックサブネットのインスタンスは(原則)グローバルIPを持ちます
- プライベートサブネット
- プライベートサブネットのインスタンスはパブリックIPを持ちません
- インターネットと通信する場合はNATゲートウェイを経由します
※ NATゲートウェイはインターネットゲートウェイ作成後でなければ、作成に失敗する。
プライベートサブネット
プライベートサブネットのインスタンスにSSH接続
プライベートサブネットにSSHで接続するにはパブリックサブネットの踏み台サーバーを経由します。
前提としてpublic/private両方に同じ秘密鍵(/path/to/private/key`)でアクセスします可能でなければいけません。
ssh -oProxyCommand='ssh -W %h:%p public@example.com' private@192.168.xxx.xxx
~/.ssh/configの例です。
# public
Host bastion
HostName example.com
IdentityFile /path/to/private/key
User public
# private
Host app
HostName 192.168.xxx.xxx
IdentityFile /path/to/private/key
User private
ProxyCommand ssh -W %h:%p bastion
プライベートサブネットのインスタンスからインターネットにアクセス
NATゲートウェイを使用します。
NATゲートウェイはプライベートサブネットからインターネットに接続するためにパブリックサブネットに配置します。
- NATゲートウェイをパブリックサブネットに設置して、それを経由してインターネットゲートウェイへアクセスします
- NATゲートウェイを設定していない
プライベートサブネットのインスタンスからはインターネットにアクセスできません(sudo yum updateなども実行できません)
セキュリティグループ
セキュリティグループとネットワークACLの違い
アクセス制御を担当するセキュリティグループとネットワークACLの違いをまとめます。
セキュリティグループはインスタンスのアクセスを制御しますステートフル
ネットワークACLはサブネットのアクセスを制御しますステートレス
VPCのdefaultセキュリティグループ
同じセキュリティグループに属したインスタンスからの接続を許可します。
※ defaultセキュリティグループはVPC単位。
Egress Only インターネットゲートウェイ
IP v6用のNATゲートウェイです。
料金
以下サービスは有料。
- VPN接続
- AWS Private Link
- NATゲートウェイ
チェックリスト
踏み台サーバーを経由してSSHに接続
- VPCにインターネットゲートウェイを作成しましたか
- 踏み台サーバー用パブリックサブネットを作成しましたか
- パブリックサブネット用ルートテーブルを作成しましたか
- パブリックサブネット用ルートテーブルにインターネットゲートウェイへのルートを作成しましたか
- パブリックサブネットにNATゲートウェイを作成しましたか
- 踏み台サーバーにVPCデフォルト(
default)セキュリティグループを適用しましたか - 踏み台サーバーにSSHを許可するセキュリティグループを適用しましたか
- プライベートサブネットを作成しましたか
- プライベートサブネット用ルートテーブルを作成しましたか
- プライベートサブネット用ルートテーブルにNATゲートウェイへのルートを作成しましたか
- プライベートサブネットに配置したサーバーにVPCデフォルト(
default)セキュリティグループを適用しましたか
参考
Appendix
- ファイアーウォール:VPCのセキュリティグループ
- ネットワークACL(Access Control List)
- AWS Private Link:インターネとを経由することなくVPCに配置された他のサービスと通信するのに必要
- DHCP オプションセット:【要調査】