#
ドキュメント

Document

自分のための備忘録です。

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/
  • ルートテーブル
    • ルートはステートフルではない
  • セキュリティグループ

NAT(Network Address Translation)はIPアドレスを変換する技術です。一般的には、プライベート  IPアドレスをグローバルIPアドレスに変換する技術とされています。

https://www.infraexpert.com/study/ip10.html

NATには1つ大きな問題があります。
それはNATにはブロードバンドルータが保持しているグローバルIPアドレスの
数しか同時に接続が出来ないという事です。
LAN側に接続されている複数のPCを1つのグローバルIPアドレスに変換して、
インターネットにパケットを送信した場合、そのパケットの返信はすべて
ブロードバンドルータのグローバルIPアドレス宛に返ってきます。
この時にブロードバンドルータはNATテーブルを見ても、どのPCのアドレスに
置き換えればよいのかを判断することが出来ないわけです。
そんな問題を解決するために考え出されたのが、
NAPT(IPマスカレード)という機能です。

https://www.itbook.info/study/nat4.html

作成手順

概要

  1. VPCを構成
  2. インスタンス作成

作成手順

  1. VPC作成
    • ターゲットにlocalが設定されたルートを持つルートテーブルが自動で作成されます
  2. インターネットゲートウェイを作成&VPCにアタッチします
  3. パブリックサブネット用のルートテーブルを作成します
    • デフォルトルートにインターネットゲートウェイを指定します
  4. パブリックサブネットを作成
    1. サブネットを作成します
    2. サブネットをパブリックサブネッ用ルートテーブルに関連付けます
      ルートテーブルにインターネットゲートウェイを設定したルートテーブルに関連付けたサブネットをパブリックサブネットと呼びます
  5. パブリックサブネットにNATゲートウェイを作成します
  6. プライベートサブネット用ルートテーブルを作成します
    • ターゲットにNATゲートウェイを指定したルートを作成します
  7. プライベートサブネットを作成
    • プライベートサブネット用ルートテーブルに関連付けます
  8. プライベートサブネットにEC2インスタンス配置します
    • パブリックIPは割り当てない
    • セキュリティグループにVPCのdefaultを指定します
  9. パブリックサブネットに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 オプションセット:【要調査】