剛開始學 AWS 的時候,你一定會看到「Public Subnet」和「Private Subnet」這兩個名詞,可能會以為 AWS 有兩種不同的子網路可以選。
但真相是:AWS 根本沒有分什麼 Public 或 Private Subnet!
這兩個名字只是我們自己取的,方便記憶而已。
真正決定一個 Subnet 是「Public」還是「Private」的關鍵,其實是看它的 Route Table(路由表)怎麼設定。
這篇文章會用最白話的方式,讓你搞懂這兩者的差別,以及實務上該怎麼命名和使用。
核心觀念:什麼決定 Subnet 是 Public 還是 Private?
graph TB
Internet((Internet))
subgraph Region["AWS Region"]
IGW["☁️ IGW<br/>Internet Gateway"]
Router["🔀 Router"]
subgraph VPC["VPC - 10.0.0.0/16"]
direction TB
PublicSubnet1["🔓 Public Subnet 1<br/>10.0.0.0/24"]
PublicSubnet2["🔓 Public Subnet 2<br/>10.0.1.0/24<br/>────────<br/>NAT Gateway<br/>Elastic IP: X.X.X.1<br/>Private IP: 10.0.1.22"]
PrivateSubnet["🔒 Private Subnet<br/>10.0.2.0/24"]
end
subgraph Tables["Route Tables"]
direction LR
subgraph MainRT["Main Route Table"]
direction TB
MRT_Header["Destination | Target"]
MRT_Rule1["10.0.0.0/16 → Local"]
MRT_Rule2["0.0.0.0/0 → igw-id"]
end
subgraph CustomRT["Custom Route Table"]
direction TB
CRT_Header["Destination | Target"]
CRT_Rule1["10.0.0.0/16 → Local"]
CRT_Rule2["0.0.0.0/0 → nat-gw-id"]
end
end
end
Internet <--> IGW
IGW <--> Router
Router --> PublicSubnet1
Router --> PublicSubnet2
Router --> PrivateSubnet
PublicSubnet2 -.NAT 位於此.-> Router
MainRT -.綁定.-> PublicSubnet1
MainRT -.綁定.-> PublicSubnet2
CustomRT -.綁定.-> PrivateSubnet
style Region fill:#f5f5f5,stroke:#9e9e9e,stroke-width:2px
style VPC fill:#fff8e1,stroke:#f57c00,stroke-width:3px
style PublicSubnet1 fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style PublicSubnet2 fill:#e8f5e9,stroke:#4caf50,stroke-width:2px
style PrivateSubnet fill:#ffebee,stroke:#f44336,stroke-width:2px
style IGW fill:#81d4fa,stroke:#01579b,stroke-width:2px
style Router fill:#e0e0e0,stroke:#616161,stroke-width:2px
style MainRT fill:#c8e6c9,stroke:#2e7d32,stroke-width:2px
style CustomRT fill:#ffcdd2,stroke:#c62828,stroke-width:2px
style MRT_Rule2 fill:#a5d6a7
style CRT_Rule2 fill:#ef9a9a
style Tables fill:#fafafa,stroke:#bdbdbd,stroke-width:1px關鍵就是這一條路由規則
一個 Subnet 之所以被稱為「Public」,是因為它的 Route Table 裡面有這樣一條規則:
Destination: 0.0.0.0/0 → Target: IGW (Internet Gateway)白話文翻譯:
0.0.0.0/0= 所有網際網路的流量IGW= 網際網路閘道,就是通往外網的大門
有這條規則,裡面的 EC2 就能直接連上網路。
快速判斷表
| Subnet 類型 | Route Table 特徵 | 用途 |
|---|---|---|
| Public Subnet | 有 0.0.0.0/0 → IGW | 放需要被外網直接存取的服務(如 Web Server) |
| Private Subnet | 沒有指向 IGW 的路由,或是走 NAT Gateway | 放不想被外網直接碰到的服務(如資料庫、內部 API) |
另一個關鍵角色:Public IP
前面我們說了,Subnet 是不是 Public,關鍵在於 Route Table 有沒有指向 IGW。但光這樣還不夠完整,因為實際運作時,還有另一個重要角色:EC2 的 Public IP。
什麼是 Public IP?
Public IP 就是一個「公開的網路地址」,讓外面的人可以透過網際網路找到你的 EC2。
想像一下:
- Private IP:就像公司內部分機號碼(例如分機 123),只有公司內部的人打得通
- Public IP:就像你的手機號碼,任何人都可以從外面打電話給你
Public IP 的作用
| 有 Public IP | 沒有 Public IP |
|---|---|
| 外部的人可以主動連進你的 EC2(例如瀏覽器連你的網站) | 外部的人無法主動連進來 |
| 你的 EC2 對外連線時,外面看到的是這個 Public IP | 如果要對外連線,需要透過 NAT Gateway |
Route Table 和 Public IP 是兩回事
很多初學者會以為:「只要把 EC2 放在 Public Subnet,它就能被外網連線了」
但其實這是兩件獨立的事:
- Route Table(決定 Subnet 類型):管「能不能主動出去上網」
- Public IP(EC2 的設定):管「外面能不能主動連進來」
| 要素 | 決定什麼 |
|---|---|
| Route Table 有 IGW | EC2 能不能主動連上外網 |
| EC2 有 Public IP | 外部能不能主動連進 EC2 |
| 兩者都要有 | 才能做到「雙向連線」 |
實際情境:不同組合會怎樣?
現在我們知道 Route Table 和 Public IP 是兩件事了,接下來看看它們組合起來會有什麼效果:
graph TB
Internet((🌐 Internet))
subgraph VPC["Amazon VPC"]
IGW["🚪 Internet Gateway"]
subgraph Public["🟢 Public Subnet - Route Table 有 0.0.0.0/0 到 IGW"]
direction TB
HiddenPub[" "]
subgraph PublicContent[" "]
direction LR
NAT["🔀 NAT Gateway"]
EC2_1["💻 情境1<br/>EC2有PublicIP"]
EC2_2["💻 情境2<br/>EC2無PublicIP"]
end
HiddenPub --> PublicContent
end
subgraph Private["🔴 Private Subnet - Route Table 無 IGW"]
direction TB
HiddenPri[" "]
subgraph PrivateContent[" "]
direction LR
EC2_3["💻 情境3<br/>EC2有PublicIP"]
EC2_4["💻 情境4<br/>EC2無PublicIP"]
end
HiddenPri --> PrivateContent
end
end
%% 情境 1:雙向流量
Internet ==>|外部請求| IGW
IGW ==>|轉發| EC2_1
EC2_1 -->|請求| IGW
IGW -->|回應| Internet
%% 情境 2:只能出去
EC2_2 -.->|經NAT| NAT
NAT -.->|轉發| IGW
IGW -.->|出去| Internet
%% 情境 3:完全不通
EC2_3 x-.-x|不通| IGW
%% 情境 4:透過NAT出去
EC2_4 -.->|經NAT| NAT
%% 隱藏節點和連線
class HiddenPub,HiddenPri,PublicContent,PrivateContent hidden
classDef hidden fill:none,stroke:none,color:transparent
linkStyle 0 display:none
linkStyle 1 display:none
style Public fill:#e8f5e9,stroke:#4caf50,stroke-width:3px
style Private fill:#ffebee,stroke:#f44336,stroke-width:3px
style EC2_1 fill:#a5d6a7,stroke:#2e7d32,stroke-width:4px
style EC2_2 fill:#fff59d,stroke:#f57f17,stroke-width:3px
style EC2_3 fill:#ef9a9a,stroke:#c62828,stroke-width:4px
style EC2_4 fill:#a5d6a7,stroke:#2e7d32,stroke-width:3px
style NAT fill:#ffcc80,stroke:#e65100,stroke-width:3px
style IGW fill:#81d4fa,stroke:#01579b,stroke-width:3px情境 1:EC2 在 Public Subnet + 有 Public IP
✅ 可以上網(因為 Route Table 有 IGW)
✅ 外部可以直接連進來(因為有 Public IP,例如 SSH、HTTP)
👉 這是最常見的 Web Server 配置
情境 2:EC2 在 Public Subnet + 沒有 Public IP
✅ 可以主動上網(透過 NAT Gateway)
❌ 外部無法主動連進來(沒有 Public IP)
👉 適合需要下載更新,但不想暴露在外的服務
情境 3:EC2 在 Private Subnet + 有 Public IP
❌ 無法上網(Route Table 沒有指向 IGW)
❌ 外部也連不進來(雖然有 Public IP,但 Route 不通)
👉 Public IP 在這裡完全沒用,浪費了
情境 4:EC2 在 Private Subnet + 沒有 Public IP
❌ 無法直接上網
✅ 如果有 NAT Gateway,可以主動出去下載東西
❌ 外部完全連不進來
👉 這是資料庫、Redis 等服務的標準配置
一句話記重點
Route Table 決定「能不能出去」,Public IP 決定「能不能被進來」。兩個要搭配對,才能達到你要的效果。
實務命名建議
雖然 AWS 不會強制你怎麼命名,但好的命名習慣會讓你的架構一目了然,尤其是團隊協作或日後維護時。
推薦命名方式
| 命名範例 | 說明 |
|---|---|
subnet-public-a | Public Subnet,位於 AZ a(可用區域 a) |
subnet-public-b | Public Subnet,位於 AZ b |
subnet-private-a | Private Subnet,位於 AZ a |
subnet-private-b | Private Subnet,位於 AZ b |
subnet-db-private-a | 專門放資料庫的 Private Subnet,AZ a |
subnet-cache-private-b | 專門放 Redis/快取的 Private Subnet,AZ b |
為什麼要這樣命名?
- 一眼看出是 Public 還是 Private:不用去查 Route Table
- 知道在哪個 AZ:方便做高可用性配置
- 用途明確:
db、cache、app等前綴讓架構更清楚 - 團隊協作友善:新人看到名字就懂,不用一直問
常見迷思破解
❌ 迷思 1:「Public Subnet 一定要給 EC2 配 Public IP」
真相:不一定。你可以在 Public Subnet 裡放沒有 Public IP 的 EC2,它依然能透過 NAT Gateway 上網。
❌ 迷思 2:「Private Subnet 裡的 EC2 完全不能上網」
真相:如果你設定了 NAT Gateway,Private Subnet 的 EC2 可以主動連外(例如下載套件、呼叫外部 API),只是外部無法主動連進來。
❌ 迷思 3:「Subnet 的名字改成 Private 就會變成 Private」
真相:名字只是給人看的標籤。真正決定性質的是 Route Table 的設定。
總結
記住這三個重點,你就搞懂 Public 和 Private Subnet 了:
- AWS 沒有內建的 Public/Private 分類,這只是命名慣例
- 真正的差別在於 Route Table:有
0.0.0.0/0 → IGW就是 Public - Route Table 和 Public IP 要搭配:前者決定「能不能出去」,後者決定「能不能被進來」
下次當你在 AWS Console 建立 Subnet 時,記得先想清楚:
- 這個 Subnet 需要連外網嗎?→ 決定 Route Table 要不要加 IGW
- 裡面的 EC2 需要被外面連進來嗎?→ 決定要不要配 Public IP
這樣一來,你的 AWS 網路架構就會清清楚楚,不會搞混了!