Study Notes - Virtual Private Cloud (VPC)


整理學習 VPC 的筆記。包含以下:

  • 基本概念、設定 VPC 過程問題與心得
  • 相關 AWS 服務
  • 常見的應用場景,包含如何規劃適當的網路架構


基本概念與功能

核心元件

分別描述 VPC 核心元件,包含:

  • VPC
    • Subnet、Route Table
    • Internet Gateway、NAT Gateway、Egress-Only Internet Gateways
    • DHCP Options Sets
    • Elastic Network Interfaces (ENI)
    • Elastic IPs (EIP)
    • VPC Peering、Inter-Region VPC Peering、Private Link
    • VPC Endpoint、VPC Endpoint Service
  • Security
    • Network ACLs
    • Security Groups
  • Virtual Private Network (VPN)
  • Transit Gateways
  • Transit VPC
  • ClassicLink

相關概念名詞:

  • AWS Account
  • Region
  • Available Zone - AZ
  • On-Prem

擴展功能

Virtual Private Cloud (VPC)

  • 虛擬資料中心 (Data Center): VPC 與 VPC 預設彼此是獨立的,無法互通的
  • SDN: Software-Defined Network
  • 以 Region 為單位
  • 設定 VPC Peering and Private DNS using Route53
  • VPC 支援 IPv4、IPv6,
    • VPC CIDR 可以使用 RFC1918,或者 Non-RFC1918
  • VPC 支援擴充多個 CIDR, 參閱 Resize VPC

Subnets

每個 VPC 可以有規劃數個子網域 (Subnet),注意事項如下:

  • 每個 Subnet 可以指定在不同的 AZ
    • VPC 裡面的 Subnet 之間預設是互通的
    • 無法修改 AZ, CIDR 大小
    • Subnet 依照路由 (Route Table) 屬性,分成 Public / Private Subnet 兩種
    • Subnet 透過 Network ACL 控管
  • Subnet 規劃
    • Subnet CIDR Space <= VPC CIDR Space
    • 每個部門都可以有自己的網段 (Subnet)
    • 每一種 Service Role (DB, Web, Storage, Cache …) 都有自己的 Subnet

Public Subnet and Private Subnet

在 VPC 裡的 Subnet 依照路由目標差異,分成 Public Subnet 與 Private Subnet:

  • Public Subnet
    • 指的是 subnet 掛的 route table, destination 到 Public Network 走 Internet Gateway
    • 裡面的機器透過 EIP 出去 / 進來。所以 這個網段的 Instance 都要有 EIP.
    • 通常是開放給外面連線的服務或者網路設備,像是 VPN, Proxy, NAT Instance … etc.
  • Private Subnet
    • 指的是 subnet 掛的 route table, destination 到 Public Network 沒有 走 Internet Gateway, 而是走 NAT Gateway
    • 可出去外面,但是外面不可進來,像是走 NAT Gateway 或者是其他 VPN Gateway.
    • 這個網段不需要有 EIP 就可以出去。
    • 通常是 DB / Application Server 等內部服務。

參閱: Your VPC with Subnets

Route Table

網路的關鍵元件,決定 Subnet 的屬性與封包路徑,也是學習 VPC 過程中關鍵的觀念。

DHCP Options Sets

提供 DHCP 設定選項,包含以下設定:

  • domain-name-servers
  • domain-name
  • ntp-servers
  • netbios-name-servers
  • netbios-node-type

相關規範:RFC2132

VPC Peering

不同的 VPC 資料交換的連線方式:

  • 允許 相同 AWS Accounts,相同 Region 互串。
  • 允許 不同 AWS Accounts,相同 Region 互串。
  • 可以跨 Region 互串,稱為 Inter-region VPC Peering,會有額外的費用與資料交換成本。

要注意 CIDR 的規劃,不可以碰撞,否則 Routing 會無法到達。

相關考量:

  • Region
  • CIDR 規劃
  • Route Table 規劃

VPC Endpoints

AWS 的 Services 都是公開對外的服務,如果 VPC 裡面的服務 (像是 EC2) 要對這些服務存取,他的路由會走 Public Network,有額外的成本與效能問題。透過 Endpoint 可以讓這些服務類似於走 Private network (實際上還是 public network),同時不用計算對外流量的費用。

  • Interface Endpoints: 實體上就是一張 ENI (Elastic Network Interface)
  • Gateway Endpoint

VPC Endpoint Service

又稱 AWS PrivateLink。允許把自己的應用程式透過 服務介面 的形式,提供給其他人使用,類似於 AWS 把 DynamoDB 透過 Interface Endpoints 封裝成 Service,給使用者使用。

背後實作原理是透過 NLB (Network Load Balancer) 的方式,將服務再透過 VPC Endpoint Service 關聯、封裝成一個介面,最後透過授權 (IAM) 方式,讓其他人可以使用。AWS 自己的 Managed Service 也是透過這樣的方式實作,像是 Private API Gateway、EKS … 等。

Network ACLs and Security Groups

詳細介紹參見:Security Groups and Network ACLs

Network Interface (ENI)

Network Interface 是個虛擬網路卡,AWS 稱為 Elastic Network Interface (ENI)。

主要透過 SDN 方式實作網路卡的特性,像是 IPv4 / IPv6、支援多個 IP 、Mac Address、Security Group … 等,是 AWS 整個服務裡非常重要的基礎核心元件之一。

除了 ENI,還有其他網路介面:

  • Enhanced Networking
    • ENA (Elastic Network Adapter): 支援速度到 100Gbps 的速度。
    • Intel 82599 VF Interface:支援 10Gbps 速度。更多參閱 Intel 82599 VF
  • EFA (Elastic Fabric Adapter):針對 HPC (High Performance Computing) 應用程式。更多參閱 EFA

官方文件:

NAT Instance and Gateway

相關經驗參見: Migrate to AWS NAT Gateway

Default VPC and Default Subnet

預設的 VPC 與 Subnet。使用 AWS CLI/SDK 的時候,如果不指定 VPC 會走這個。

無法由使用者自行建立或者指定,必須透過 Support Ticket 設定。

Bring Your Own IP (BYOIP)

2019/04/04 Release: Bring Your Own IP (BYOIP): 允許把自己的 IP 綁定到 VPC 上。

官方文件:Bring Your Own IP Addresses

Dedicated

Transit Gateways

Virtual Private Network

相關功能與名詞:

  • VGW: Virtual Private Gateways
  • CGW: Customer Gateways
  • Site-to-Site VPN Connections
  • Client VPN Endpoints

VPC Limitation

CNI for Kubernetes

依據 CNI (Container Network Interface) 的標準,AWS 針對 VPC 實作了 CNI ,讓跑在 AWS 上的 K8s pod 可以直接使用 VPC 網路,而不需要再多一層 Overlay,提供高效能的傳輸。目前的 CNI 版本支援 ENI。詳細設計文件參閱 amazon-vpc-cni-k8s, Proposal: CNI plugin for Kubernetes networking over AWS VPC


相關服務

VPC 是 AWS 非常核心的服務,所以與他相關的服務也會非常的多,以下整理比較重要的列表:

  • Route53
  • ELB: NLB / ALB / CLB
  • Direct Connect
  • Global Accelerator
  • EKS

其他只要牽涉到 Private Subnet,或者在 Privision 過程,需要選擇 VPC 的服務,基本上都脫離不了 VPC 的概念。


應用場景

規劃 VPC 的考慮項目

規劃 VPC 的考量重點在於:

  1. 存取管控 (Access Control)
  2. 資料交換 (Data Transfer)

兩個面向,整理如下:

存取控管

  • 考量公、私網域的規劃,也就是 路由 (Routing),所以必須規劃 CIDR Block,不可以碰撞。
  • 考慮服務是否讓外部存取,也就是 Public Subnet
  • 禁止外部存取的內部服務,也就是 Private Subnet
  • EKS (K8s) 可以考量使用 Non-RFC1918 (參閱 VPC)

資料交換

  • 則依照存取對象不一樣,有不同的 網路拓墣 (Network Topology) 的規劃。
  • 主要是 Network ACL、Route Table、以及 VPC Peering、VPN 等
  • 路由表的管理,包含靜態與動態路由

只要規劃多個 VPC、或者多個網段、多個資料中心,都要考量這兩點:

  1. 存取管控 (Access Control)
  2. 資料交換 (Data Transfer)

設計與規劃 Multiple VPCs in Different Regions

AWS VPC 基本上是一個資料中心 (Data Center) 的概念,所以不管是在雲端還是地端,除了傳統硬體要處理的問題,相關規劃的問題是少不了的。我最常規劃的案例官方文件中的 Scenario 3: VPC with Public and Private Subnets and Hardware VPN Access, 也就是包含:

  1. 數個 Public Subnets
  2. 數個 Private Subnets
  3. VPN to own IT infrastructure over an IPSec VPN tunnel

同時,這個規劃也考慮了 AZ 以及開發時的各種環境需求,像是 Dev / Test / Staging / Production … 等環境。

多 AWS 帳號、多 AWS Regions 的規劃與設計,完整筆記參閱:Plan and Design Multiple VPCs in Different Regions

Plan for Hybrid Cloud

針對不同的 Cloud 網路架構的規劃,以 AWS + GCP 為例,最基礎的就是要打通兩段。

GCP 也有類似於 AWS VPC 的網路,參閱底下筆記:

規劃完成之後,同樣的要思考 CIDR、Routing 的問題,也就是思考 存取管控資料交換 的問題。


VPC 系列文章


本質

網路是什麼? What is Network? 我的說法是:路由,學 VPC 整個的核心概念與關鍵在於如何控制好路由。

底下截圖是我的說法:

現在 SaaS 越來越流行,很多人會以為 IaaS 不重要、網路可以忽略。但是企業整體營運還是要面對 IT 基礎設施 (Infrastructure),而最根本的就是 Network Topology 的問題,這些問題包含了 1) 規劃、2) 可控性、3) 執行政策 三個面向,本質上是沒有改變,不會因此而 NoOps。用生活的例子來說:

  1. 規劃 (Topology):公路要先規劃有哪些主幹線、支線,哪些主幹道中哪一些會交錯?這裡的規劃會跟成本與資安有直接關係。
  2. 可控性 (Controllable):這些道路可否管控流量?閘道?紅綠燈?單行道?紅綠燈多遠距離設計一個?
  3. 執行政策 (Strategies and Policies):哪些車可以上快速道路?假日車流如何疏導?活動如何管制車輛?罰款如何?酒駕怎麼辦?

延伸閱讀

站內延伸

參考資料

建議閱讀

Deep Dive

更新紀錄

  • 2019/01/14: 重構文章結構
  • 2016/03/30: 新增 Public Subnet 的描述
  • 2016/02/21: init

Comments