昨天我們認識了 VPC、Subnet 和 CIDR,也知道 EC2 的 Private IP 是從所在的 Subnet 中取得的。
不過,知道主機放在哪個網路裡之後,還有一件事要弄清楚:當 EC2 要下載套件,或把網頁回傳給自己的瀏覽器時,封包(packet)要從哪裡送出去?
所以今天就來講講 Route table(路由表) 和 Internet Gateway(網際網路閘道),把整條路接起來ㄅ!
我們先把路由表想成一份指路規則:要先看封包的目的地的 IP,再找出對應的去向。
前幾天有提到,資料會以封包的形式在網路上傳送。例如,瀏覽器送出的請求、EC2 回傳的網頁,都會透過封包傳遞。這些在網路上往來的資料,統稱為 網路流量(network traffic)。所以下面說「把流量送往哪裡」,就是在說這些封包要往哪裡送。
每條 route 會有兩個主要欄位:
| 欄位 | 用來表示什麼 |
|---|---|
| Destination(目的地範圍) | 用來比對封包目的地 IP 的範圍 |
| Target(目標) | 選用這條路由時,要把封包送往哪個目標,例如 Internet Gateway |
延續昨天的範例,假設 VPC 是 10.0.0.0/16,EC2 放在 10.0.1.0/24,而這個 Subnet 使用的 Route table 中,設定了以下兩條 route:
| Destination | Target |
|---|---|
10.0.0.0/16 |
local |
0.0.0.0/0 |
igw-... |
第一條的 local 表示使用 VPC 內部 route。這裡寫的是整個 VPC 的範圍,所以也就會包含去同一個 VPC 裡其他 Subnet 的流量(traffic)。
而第二條的 0.0.0.0/0 則是涵蓋所有 IPv4 位址,igw-... 則是 Internet Gateway 的資源 ID。所以這條 route 提供通往 IGW 的去向。
等等,既然 0.0.0.0/0 包含所有 IPv4,連 VPC 內的 IP 也包含了,那封包該如何選哪條 route 呢?
昨天有提到,CIDR 斜線後面的數字越大,表示範圍越小。而 Route table 比對目的地 IP 時,會優先選擇符合的 route 中,前綴最長、範圍最精確的那條,稱為 longest prefix match(最長前綴比對)。
用例子來看:
| EC2 要送往哪個目的地 | 符合的範圍 | 選擇的 route |
|---|---|---|
同一個 VPC 裡的 10.0.2.20 |
/16 和 /0 都符合 |
較精確的 10.0.0.0/16 → local |
網際網路上的某個公開 IPv4,且不在 10.0.0.0/16 內 |
只有 /0 符合 |
0.0.0.0/0 → igw-... |
因此,0.0.0.0/0 常被稱為 default route(預設路由):在沒有更精確的 route 符合時,就會使用它。
這也表示,不能只看表格上哪一條排在前面。像 10.0.2.20 同時符合兩條範圍,選 local 的原因是 /16 比 /0 更精確。
這裡只是先判斷封包的去向;但是否能成功連線,還需要看 Security Group 等網路規則是否允許,以及目的端的 server 是否正常運作。
Route table 會建立在 VPC 中,再透過 association(關聯) 讓 Subnet 使用它。同一個 Subnet 同一時間只能關聯一張 Route table,但多個 Subnet 可以共用同一張。
如果沒有替 Subnet 明確指定 Route table 的話,它就會使用該 VPC 的 main route table(主要路由表)。因此,即使沒有手動選過,Subnet 也已經在使用 Route table了。
如果你回 Console 查設定的話,要先從 EC2 找到所在的 Subnet,才能確認這個 Subnet 實際使用哪一張表喔~
Internet Gateway 簡稱 IGW,是附加在 VPC 上的網路元件。Subnet 透過 Route table 裡指向 IGW 的 route 來使用它。
以這次 EC2 直接透過 IGW 進行 IPv4 公網通訊的方式來說,EC2 也需要公網 IPv4。IGW 會替它的私有(Private)與公網(Public) IPv4 做位址轉換,讓回覆能送回來。
假設 EC2 的 Private IP 是 10.0.1.10,而 Public IP 是 203.0.113.10,它連到外部網站時,可以簡化成:
箭頭呈現的是封包送出的方向。而當外部網站把回覆送到 EC2 的 Public IP 時,IGW 會把目的 IP 轉回對應的 Private IP,再送入 VPC。
這樣接回我們之前看到的兩個位址:EC2 在 VPC 裡使用 Private IP;而透過 IGW 與網際網路通訊時,則會用到 Public IP 的對應。
了解 IGW 後,接著來分清楚 Public subnet(公有子網路) 和 Private subnet(私有子網路):
| 類型 | 路由上的差別 |
|---|---|
| Public subnet | 使用的 Route table 有直接通往 IGW 的 route |
| Private subnet | 使用的 Route table 沒有直接通往 IGW 的 route |
在一般常見的 IPv4 設定裡,Public subnet 會有 0.0.0.0/0 → igw-...。但判斷的重點還是 route 設定;不管是 Subnet 的名稱,或是否開啟自動指派 Public IP,都不能單獨決定它是哪一種。
即使是在 Public subnet,裡面的 EC2 仍然有 Private IP,也可能另外指派 Public IP。而這個「Public」描述的是 Subnet 有直接通往 IGW 的 route;至於 EC2 是否有 Public IP,則是另一項設定。
之前我們是使用 default VPC,這是 AWS 已經替它準備了 IGW,以及在 main route table 裡設定了 0.0.0.0/0 → IGW。因此我們能先沿用這些設定開 EC2。
但要從自己的瀏覽器直接開啟我們建的網站,除了這段 route,還需要 EC2 的 Public IPv4、Security Group 等網路規則允許,以及 Docker 與 Next.js 正常提供服務。
之前我們設定的 Security Group 中,HTTP 80 使用 My IP 作為來源。這項規則允許的是自己當時的對外 Public IP;把主機放在 Public subnet,也不會替這條規則增加其他來源。
這邊有個容易搞混的地方,就是 Route table 和 Security Group 都有可能出現 0.0.0.0/0:
| 設定位置 | 0.0.0.0/0 在這裡的意思 |
|---|---|
| Route table 的 Destination,Target 是 IGW | 沒有更精確 route 符合的 IPv4 目的地,送往 IGW |
| Security Group inbound 的 Source | 允許所有 IPv4 來源使用這條規則指定的協定與 port |
所以我們可以把它們想成:一個指定流量的去向,一個指定允許的來源。
例如 inbound 的 TCP 80 配上 0.0.0.0/0,就是允許所有 IPv4 來源連到 TCP 80;而之前在 inbound rules 中我們使用的則是較小範圍的 My IP。
因此,route table 裡有 0.0.0.0/0,不能直接解讀成「網站已開放給所有人」。
local 的route ,以及是否有 0.0.0.0/0 → igw-...。若另外開啟 Route table 頁面,記得核對它與這個 Subnet 的關聯;未明確關聯時會使用 main route table。igw-... 找到 IGW,確認它附加到同一個 VPC。到這裡,從建立 EC2、跑起容器,到理解背後的網路設定,就接起來了!接下來會先用 Elastic IP 固定對外位址,再往網域、Caddy 反向代理和 HTTPS 前進。