AWS 網路基礎:Public 和 Private Subnet 到底差在哪?

Published October 31, 2025 by 徐培鈞
架構

剛開始學 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 就能直接連上網路。

快速判斷表

Route Table 特徵有 0.0.0.0/0 → IGW
用途放需要被外網直接存取的服務(如 Web Server)
Route Table 特徵沒有指向 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如果要對外連線,需要透過 NAT Gateway

Route Table 和 Public IP 是兩回事

很多初學者會以為:「只要把 EC2 放在 Public Subnet,它就能被外網連線了」

但其實這是兩件獨立的事:

  • Route Table(決定 Subnet 類型):管「能不能主動出去上網」
  • Public IP(EC2 的設定):管「外面能不能主動連進來」
決定什麼EC2 能不能主動連上外網
決定什麼外部能不能主動連進 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 不會強制你怎麼命名,但好的命名習慣會讓你的架構一目了然,尤其是團隊協作或日後維護時。

推薦命名方式

說明Public Subnet,位於 AZ a(可用區域 a)
說明Public Subnet,位於 AZ b
說明Private Subnet,位於 AZ a
說明Private Subnet,位於 AZ b
說明專門放資料庫的 Private Subnet,AZ a
說明專門放 Redis/快取的 Private Subnet,AZ b

為什麼要這樣命名?

  1. 一眼看出是 Public 還是 Private:不用去查 Route Table
  2. 知道在哪個 AZ:方便做高可用性配置
  3. 用途明確dbcacheapp 等前綴讓架構更清楚
  4. 團隊協作友善:新人看到名字就懂,不用一直問

常見迷思破解

❌ 迷思 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 了:

  1. AWS 沒有內建的 Public/Private 分類,這只是命名慣例
  2. 真正的差別在於 Route Table:有 0.0.0.0/0 → IGW 就是 Public
  3. Route Table 和 Public IP 要搭配:前者決定「能不能出去」,後者決定「能不能被進來」

下次當你在 AWS Console 建立 Subnet 時,記得先想清楚:

  • 這個 Subnet 需要連外網嗎?→ 決定 Route Table 要不要加 IGW
  • 裡面的 EC2 需要被外面連進來嗎?→ 決定要不要配 Public IP

這樣一來,你的 AWS 網路架構就會清清楚楚,不會搞混了!