終於過半了!◝( ゚∀ ゚ )◟ 還有一半繼續加油ㄅ!
昨天搞懂了 -p 80:3000,知道瀏覽器連到 EC2 的 80 port,再由 Docker 轉送到 container 裡的 3000。
今天就把視角往外拉一點。建立 EC2 時,除了選主機規格,還選了 VPC 和 Subnet。當時先用預設值,把機器開起來;現在就來看看這兩個欄位在做什麼ㄅ!
先記住它們的關係:VPC 是虛擬網路,Subnet 是其中的一段 IP 範圍,而 EC2 的私有 IP,就從所在的 Subnet 裡取得。
VPC(Virtual Private Cloud) 是 AWS 裡邏輯隔離的虛擬網路。你可以設定這個網路的 IP 範圍、建立子網路,以及決定如何和其他網路連接。
可以把它想成在規劃蓋一棟公寓大樓時:先決定整棟大樓的空間範圍(像是要有多高),再把裡面的空間劃分成不同區域。
而我們之前選的default VPC,就是 AWS 預先準備好的 VPC。它已經搭配好預設子網路與部分網路設定,所以我們當時能直接選用。
Subnet(子網路) 是在 VPC 的 IP 範圍內劃出的一段範圍。建立 EC2 時,要指定它使用哪個 Subnet。
沿用剛剛的例子,VPC 是整棟大樓,Subnet 是劃分出來的各樓層,EC2 則是樓層裡的房間。
接著假設有下面這個網路。這裡的位址都是示意,先看包含關係,斜線後面的數字等一下再拆:
兩個 Subnet 都屬於同一個 VPC,EC2 A 和 EC2 B 則各自使用所在 Subnet 範圍內的私有 IP。
Subnet 的位址範圍必須落在 VPC 的範圍內,同一個 VPC 裡的不同 Subnet,範圍也不能互相重疊。
另外,每個 Subnet 都位於單一 Availability Zone(可用區,簡稱 AZ),不能橫跨多個 AZ;而同一個 VPC 裡可以在不同 AZ 建立 Subnet。這也是為什麼選 Subnet 時,旁邊還會看到可用區資訊。
剛才出現的 10.0.0.0/16、10.0.1.0/24,使用的是 CIDR(Classless Inter-Domain Routing) 表示法。這種「位址/數字」的寫法,可以用來描述一整段 IP 位址。
IPv4 位址總共有 32 個位元(bit)。我們平常看到的四組數字,每組各代表 8 個位元。
而 /24 的意思是:前 24 個位元固定作為網路前綴,剩下的 8 個位元可以變動。
以 10.0.1.0/24 為例,前 24 位剛好對應前三組數字,所以 10.0.1 固定,最後一組可以從 0 到 255:
因此,這個範圍有包含 10.0.1.10 和 10.0.1.20,但不包含 10.0.2.20。
如果改成 /16,固定的就只有前 16 位,也就是前兩組數字。把範例放在一起看:
| CIDR | 位址範圍 | 位址總數 |
|---|---|---|
10.0.0.0/16 |
10.0.0.0 ~ 10.0.255.255 |
65,536 |
10.0.1.0/24 |
10.0.1.0 ~ 10.0.1.255 |
256 |
位址總數的算法是 2^(32 − 前綴長度)。因此 /24 有 2^8 = 256 個位址,而 /16 有 2^16 = 65,536 個位址。
斜線後的數字越大,固定的位元越多,可以變動的空間越少,位址範圍就越小。 /16 和 /24 都是剛好切在句點的位置;但也有可能前綴長度切在一組數字的中間,要以實際的位元數為準。
如果曾在電腦的網路設定看過 255.255.255.0,那是 Subnet mask(子網路遮罩) 的一種寫法。
遮罩用二進位的 1 用來標示網路部分、0 則標示主機部分。/24 對應前面 24 個 1、後面 8 個 0,換成平常的十進位寫法,就是 255.255.255.0;/16 則對應 255.255.0.0。
今天主要讀的是 AWS 的設定,先掌握 CIDR 就夠了:之後看到 /24,就知道這一段範圍的前 24 位固定嘍~
一般 AWS IPv4 Subnet 會保留前四個位址與最後一個位址,因此 /24 的 256 個位址中,可指派給資源的是 256 − 5 = 251 個。
以圖中的 10.0.1.0/24 為例,保留的是 10.0.1.0、.1、.2、.3 和 .255;其餘可以依資源需求分配。這是 AWS 的規則,不能直接套用一般網路教材中「扣掉兩個位址」的算法。
我們在 EC2 詳細資訊中的 Private IPv4 address,就是它的私有 IPv4 位址。這個位址是來自所選 Subnet 的 IPv4 範圍;如果沒有自行指定,就由 AWS 選一個可用的位址。
所以,圖中的 EC2 A 放在 10.0.1.0/24,可以取得 10.0.1.10;10.0.2.20 則不在這個 Subnet 的範圍裡。
至於我們貼到瀏覽器的公網 IPv4,是另外指派的對外位址,不是從這段私有位址範圍裡挑出來的。
前面的 10.0.0.0/16 是方便說明的範例。而之前建立 EC2 時,我們選用的是 default VPC,所以 AWS 預設建立的 IPv4 範圍是 172.31.0.0/16,default subnet 則使用 /20。
例如:172.31.0.0/20 表示 172.31.0.0 到 172.31.15.255,總共有 2^(32 − 20) = 4,096 個位址。
這次剩下的 12 個位元中,4 位落在第三組、8 位落在最後一組,所以第三組可以從 0 到 15,最後一組則從 0 到 255。這只是其中一個可能的 Subnet 範例,自己的 EC2 使用哪一段,要回 Console 確認。
因此,看到自己的私有 IP 是 172.31...,或者 Subnet 寫 /20,都不代表前面操作錯了。VPC、Subnet、私有 IP 的包含關係仍然一樣。
如果想回 AWS Console 看的話可以在:
現在知道 EC2 被放在哪段網路裡了,接著還有一個問題:這個網路裡的封包,要怎麼走到網際網路?
下一篇就來看 Route table(路由表) 和 Internet Gateway,再接著分清楚 public subnet 與 private subnet。