Start learning AWS VPC
VPC 在 AWS 的網路中扮演很重要的角色。
什麼是 VPC?
來看一段 Amazon 官方的定義:
Amazon Virtual Private Cloud (Amazon VPC) enables you to launch AWS resources into a virtual network that you’ve defined.
VPC 全名為 Virtual Private Cloud,顧名思義是讓你能在 AWS 中定義自己的私有虛擬網路,並在這隔離的環境中啟動 AWS 資源。
例如你可以為自己的 website 建立能夠連接至 Internet 的 public subnet,並將資料庫等後端系統放在不能被 Internet 存取的 private subnet。
VPC 中主要的 Component 可以分為以下幾種:
1. VPC
設定自己 IP Address 的範圍,可支援 IPv4 和 IPv6,以 CIDR 格式來表示。
什麼是 CIDR 呢 ?
CIDR 全名為 Classless Inter-Domain Routing,基於可變長子網路遮罩(VLSM)來進行任意長度的分配。
舉個例子:192.168.0.0/16,後面的 24 代表遮罩,是二進制的表示方法,代表前面有 16 個 1,而後面 16 個 0 為可變動的 bit,因此此 ip 範圍總共有 2¹⁶個 ip 可使用。
2. Subnet
設定好 VPC 的 ip 後,可以在 VPC 的網段下,再細分切割不同的子網路,同樣是以 CIDR 來指定範圍。
要注意的是,Subnet 有預留 5 個 ip 是留給 AWS 做使用的:
- 10.0.0.0:Network address
- 10.0.0.1:VPC router
- 10.0.0.2:Mapping to the Amazon-provided DNS
- 10.0.0.3:Reserved for future use
- 10.0.0.255:Network broadcast
3. Internet Gateway (IGW)
提供 IP 存取 Internet 的能力。
也就是說,將 IGW attach 到 IP 上後,此 IP 就是 Public IP。
4. NAT Gateway
允許 Private IP 的資源透過 Net Address Translation 間接訪問 Internet。
NAT Gateway 必須放在 Public Subnet 底下。
提供一個情境:通常我們會將 Database 等內部伺服器放在 Private Subnet 不讓外人存取,然而有時系統更新時需要將其連上網路,此時就可以透過 NAT Gateway 扮演一個 proxy 的角色,讓私有網路的資源連向 Internet。
另外要注意的是,NAT Gateway 是單向的,只提供由內向外的連網方式,若是外面的 IP 想訪問內部 private IP 的資源,則需透過類似「跳板機」的方式來存取。
5. Route Tables
用來控制傳出子網路的流量,每個路由表都會指定目的地(Destination)和目標(Target),Destination 代表要將流量傳出的 IP 位址範圍,Target 代表要傳送到的目標閘道。

!!! Route Tables 很重要,不要 IP address 和 gateway 都設好後,卻發現沒設定將他們連接起來的 route table,那一切都是白費工夫。
6. Elastic IP Address
預設 VPC 的 Public IP 都是浮動的,像是 EC2 關機再開機後 IP 會改變,透過 Elastic IP 可以向 AWS 申請一個固定 IP。
7. Security Group
EC2 的防火牆,控制多個 instance 的流量。
預設為 Deny,所有流量均不可進入,設定 rule 之後,符合規則的流量才允許進入。
- Stateful 有狀態的防火牆
只須設定入站規則(inbound rule),會追蹤 request 的來源,自動將 response 回傳給來源位址。
簡而言之就是,你進得來就出的去~
8. Network ACLs (NACL)
Subnet 的防火牆,控制對子網路的存取流量,全名為 Network Access Control Lists。
預設為 Allow 所有 inbound & outbound 流量,除非要抵擋特定流量,否則不需設定。
- Stateless 無狀態的防火牆
需要設定入站和出站規則(inbound & outbound rule)。
VPC Flow
用一個流程圖來結合上述所說的 Component 在 VPC 中怎麼搭配的。

有一個使用者想存取 EC2
- 透過 IGW 連進來後
- 經過 Route Table 做轉導
- 第一關會先在 Subnet 外面做檢查是否符合入站規則(NACL)
- 通過後會再經過第二關 EC2 的防火牆做入站的檢查(Security Group)
再來要出去時
- 由於 Security Group 只有檢查 inbound rule,因此可以直接出去
- 到了 NACL,它會再檢查你的 outbound rule,符合了才可以離開
以上,就是當流量想進出時的大致流程。
Architecture & Implement
最後,試著利用 AWS console 實作出一個 VPC 網路的架構。
情境是這樣的,有一台 instance 具有連網功能,但只允許 Protocol 為 HTTP/HTTPs 和 SSH 的流量進入;另外有一台 Database 只可透過 NAT Gateway 存取網路。

Step 1: 選擇 Region
在設定 VPC 前,都必須先選擇一個 Region,可以從右上角上選擇。這邊以 US East (N. Virginia) 做示範。
Step 2: Create VPC
進入主控台,選擇 VPC 的服務,左邊 navbar 選擇 Your VPCs,點選 Create VPC。隨便設定一組以 CIDR 表示的 IP 範圍。

Step 3: Create Subnet
在此架構中需要分割出兩個子網域(public & private),並分別在不同的 AZ 中。
如何切割子網域?
ex: 10.10.0.0 / 24
IP 由 32 bits 組成 (8+8+8+8),以 . 做分割並用十進制表示,每個數字最大是 2⁸= 255。
後面的 24 代表遮罩,前面有 24 個 1、後面有 8 個 0,代表前面 24 bits 不動,只可更改後面 8 bits。
因此這個 subnet 的可用 ip 數為 2⁸,範圍從 10.10.0.0~10.10.0.255
若要切割下一個 subnet,則從 10.10.1.0 開始。


Step 4: Create Internet Gateway

Step 5: Attach IGW to VPC
剛設定完 IGW 會顯示 Detached 的狀態,把它 Attach 到剛設定的 VPC 上。

Step 6: Create Route Table (Public)

Step 7: Edit Routes (Public)
找到剛剛建立的 Public Subnet Route Table,在 Routes 找到 Edit routes,將 Destination 設為 0.0.0.0/0、Target 設為 igw。

Step 8: Subnet Associations (Public)
找到剛剛建立的 Public Subnet Route Table,在 Subnet Associations 中,將 Public Subnet 加進來,代表此 IP 真的可以連接網路了。

Step 9: Create NAT Gateway
選擇要將 NAT Gateway 放到哪個 Public Subnet 中(此 public subnet 必須先 attach 到有 igw 的 route table),並注意必須要註冊一個 Elastic IP。
按下 Create 後,等 NAT Gateway 的 Status 變成 Available 就代表成功了

Step 10: Create Route Table (Private)

Step 11: Edit Routes (Private)
找到剛剛建立的 Private Subnet Route Table,在 Routes 找到 Edit routes,將 Destination 設為 0.0.0.0/0、Target 設為 nat。

Step 12: Subnet Associations (Private)
找到剛剛建立的 Private Subnet Route Table,在 Subnet Associations 中,將 Private Subnet 加進來。

Step 13: Create Security Group
在左邊 navbar Security 的地方找到 Security Groups,設定只有 HTTP/HTTPS 和 SSH 的流量可存取 EC2。
