AWS NAT Gateway 完全指南:讓 Private Subnet 安全地連接外網

Published November 10, 2025 by 徐培鈞
架構

NAT Gateway 是 AWS 網路架構中的重要元件,它能讓你的伺服器「既安全又能上網」。

這篇文章會用最白話的方式,帶你理解 NAT Gateway 的運作原理、使用情境,以及完整的設定步驟。

什麼是 NAT Gateway?

NAT Gateway 的核心定義

NAT Gateway 是 AWS 提供的一個網路服務,它扮演「中間人」的角色:

  • 你的伺服器可以透過它「主動上網」(下載套件、呼叫 API)
  • 但外網的人「無法反向找到」你的伺服器

簡單說:只能出去,不能進來 → 既能上網又安全

用最簡單的比喻來說:

🎭 NAT Gateway 就像是你的「代理人」

  • 你是個藝人(Private EC2),為了安全不公開私人聯絡方式(沒有 Public IP)
  • 外面的廠商、粉絲無法直接聯絡你(外網無法主動連入)
  • 但當你要叫外送、網購時,你的經紀人(NAT Gateway)會用他的名義幫你處理
  • 外送員只知道經紀人的電話(Elastic IP),不知道背後是哪個藝人下單的

為什麼需要 NAT Gateway?

在實務上,很多伺服器需要「既安全又能上網」:

說明apt update, yum update 需要連到套件伺服器
說明npm install, pip install 需要下載相依套件
說明docker pull 需要從 Docker Hub 下載
說明串接金流、簡訊、Email 等第三方服務
說明與外部服務進行資料交換

這些都是「由內往外」的主動連線,但如果伺服器放在 Public Subnet,就會暴露在網路上被掃描攻擊的風險。

NAT Gateway 的價值就是:讓你的伺服器既能主動上網,又不會被外部找到。

NAT Gateway 的核心特性

必備元件:Elastic IP

NAT Gateway 建立時,必須綁定一個 Elastic IP(EIP)。

什麼是 Elastic IP?

  • Elastic IP 是 AWS 提供的固定公開 IP 位址
  • 不會因為資源重啟而改變
  • 可以保留並重複使用
  • 就像你的門牌號碼,不會隨便變動

NAT Gateway 如何使用 Elastic IP?

當 Private Subnet 的 EC2 透過 NAT Gateway 對外連線時:

graph TB
    subgraph "Private Subnet"
        EC2["Private EC2<br/>IP: 10.0.1.100"]
    end

    subgraph "Public Subnet"
        NAT["NAT Gateway<br/>Elastic IP: 3.115.88.123"]
    end

    subgraph "外網"
        Google["Google 伺服器"]
    end

    EC2 -->|"① 發出請求<br/>來源: 10.0.1.100<br/>目的: Google"| NAT
    NAT -->|"② 轉換 IP<br/>來源: 3.115.88.123<br/>目的: Google"| Google
    Google -.->|"③ 回應<br/>目的: 3.115.88.123"| NAT
    NAT -.->|"④ 還原 IP<br/>目的: 10.0.1.100"| EC2

    style EC2 fill:#e1f5ff
    style NAT fill:#fff3e0
    style Google fill:#f3e5f5

流程說明:

  • 實線箭頭(→):請求階段(出站)
  • 虛線箭頭(⇢):回應階段(入站)
  • NAT Gateway 會記住每個連線,確保回應能正確返回

重點:外部永遠只看到 NAT Gateway 的 IP,看不到真正的 EC2。

單向流量特性

NAT Gateway 最重要的安全特性就是「只出不進」:

是否允許✅ 允許
說明Private EC2 可以主動發送請求到外網
是否允許❌ 禁止
說明外網無法主動連接到 Private EC2

這就像你家的後門:

  • 你可以從後門出去買東西(Outbound)
  • 但陌生人無法從後門闖進來(Inbound 被擋)

必須放在 Public Subnet

這是很多初學者容易忽略的重點:

⚠️ NAT Gateway 本身必須放在 Public Subnet 中

為什麼?因為:

  1. NAT Gateway 需要連接到 Internet Gateway(IGW)
  2. 只有 Public Subnet 才能連接到 IGW
  3. NAT Gateway 就像橋樑,一端連著 Private Subnet,另一端連著外網

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

完整架構解析

標準的 NAT Gateway 架構

讓我們看一個完整的 AWS 網路架構:

graph TB
    subgraph VPC["VPC (10.0.0.0/16)"]
        subgraph Public["Public Subnet"]
            NAT["NAT Gateway<br/>EIP: 3.115.88.123"]
        end

        subgraph Private["Private Subnet"]
            EC2["EC2 Instance<br/>私有 IP: 10.0.1.100"]
        end

        IGW["Internet Gateway"]
    end

    Internet["☁️ 外網<br/>(Google, AWS 服務等)"]

    EC2 -->|"透過 Route Table"| NAT
    NAT -->|"連接"| IGW
    IGW <-->|"雙向流量"| Internet

    style VPC fill:#f0f0f0,stroke:#333,stroke-width:3px
    style Public fill:#fff3e0,stroke:#ff9800,stroke-width:2px
    style Private fill:#e3f2fd,stroke:#2196f3,stroke-width:2px
    style NAT fill:#ffeb3b,stroke:#f57c00,stroke-width:2px
    style EC2 fill:#bbdefb,stroke:#1976d2,stroke-width:2px
    style IGW fill:#c8e6c9,stroke:#388e3c,stroke-width:2px
    style Internet fill:#e1bee7,stroke:#7b1fa2,stroke-width:2px

架構說明:

  • 🔵 Private Subnet:EC2 放在這裡,沒有 Public IP
  • 🟡 Public Subnet:NAT Gateway 放在這裡,有 Elastic IP
  • 🟢 Internet Gateway:連接 VPC 與外網的大門
  • EC2 的對外流量必須經過 NAT Gateway,再透過 IGW 出去

所需的配置元件

要讓 NAT Gateway 正常運作,你需要設定以下元件:

① NAT Gateway 本身

MyNATGateway
說明自訂名稱,方便識別
Public Subnet
說明⚠️ 必須選擇 Public Subnet
分配新的 EIP
說明可選擇新建或使用既有的

② Route Table(給 Private Subnet 使用)

目標(Target)NAT Gateway ID
目標(Target)local

Route Table 欄位說明:

意思我要去哪裡?
白話解釋這個封包想要到達的目標 IP 範圍
意思該透過誰去?
白話解釋要透過哪個「中繼點」才能到達

具體範例解讀:

  1. 0.0.0.0/0 → NAT Gateway
  • 意思:所有對外的流量(0.0.0.0/0 代表任何 IP)
  • 動作:都要「透過」NAT Gateway 出去
  • 白話:想上網就找 NAT Gateway
  1. 10.0.0.0/16 → local
  • 意思:目的地是 VPC 內部的 IP(10.0.0.0/16)
  • 動作:直接在本地(local)轉發,不用出去
  • 白話:同事之間講話,不用透過外人

③ Route Table(給 Public Subnet 使用)

目標(Target)Internet Gateway ID
目標(Target)local

具體範例解讀:

  1. 0.0.0.0/0 → Internet Gateway
  • 意思:所有對外的流量(0.0.0.0/0 代表任何 IP)
  • 動作:都要「透過」Internet Gateway 出去
  • 白話:NAT Gateway 要上網就直接走 IGW
  1. 10.0.0.0/16 → local
  • 意思:目的地是 VPC 內部的 IP(10.0.0.0/16)
  • 動作:直接在本地(local)轉發,不用出去
  • 白話:VPC 內部的流量不用出外網

④ Security Group(給 Private EC2 使用)

Outbound 規則(出站):

目的地0.0.0.0/0
說明允許 EC2 主動對外連線

Inbound 規則(入站):

來源內部服務的 Security Group
說明通常只開給 VPC 內部的其他服務

完整的請求流程

讓我們用一個實際例子,看看當 Private EC2 執行 curl https://www.google.com 時發生什麼:

步驟 1:Private EC2 發起請求

  • 來源 IP:10.0.1.100(私有 IP)
  • 目標 IP:Google 的 Public IP

步驟 2:檢查 Security Group

  • Outbound 規則:✅ 允許對外連線
  • 請求通過

步驟 3:檢查 Route Table

  • 查詢路由表:0.0.0.0/0 → NAT Gateway
  • 將封包送到 NAT Gateway

步驟 4:NAT Gateway 處理

  • 收到來自 10.0.1.100 的請求
  • 將來源 IP 改寫成 NAT Gateway 的 Elastic IP(3.115.88.123)
  • 透過 Internet Gateway 送到外網
  • 建立 NAT 轉換表(記住這個連線)

步驟 5:Google 回應

  • Google 看到的來源 IP:3.115.88.123(NAT Gateway)
  • 回應送回到 3.115.88.123
  • NAT Gateway 收到回應

步驟 6:NAT Gateway 轉發回應

  • 查詢 NAT 轉換表
  • 將目的地 IP 改回 10.0.1.100
  • 送回給 Private EC2

步驟 7:Private EC2 收到回應

  • 完成整個請求流程 ✅

NAT Gateway vs 其他方案比較

NAT Gateway vs Internet Gateway

NAT Gateway單向(只能出)
Internet Gateway (IGW)雙向(進出都可)
NAT Gateway放在 Public Subnet
Internet Gateway (IGW)綁定在整個 VPC
NAT Gateway需要 Elastic IP
Internet Gateway (IGW)使用資源自己的 Public IP
NAT GatewayPrivate Subnet 的資源
Internet Gateway (IGW)Public Subnet 的資源
NAT Gateway高(外部無法連入)
Internet Gateway (IGW)較低(外部可連入)
NAT Gateway按小時 + 流量計費
Internet Gateway (IGW)免費
NAT Gateway後端服務、資料庫
Internet Gateway (IGW)前端服務、Load Balancer

NAT Gateway vs NAT Instance

AWS 提供兩種 NAT 解決方案:

NAT Gateway(推薦)AWS 完全託管
NAT Instance你要自己管理 EC2
NAT Gateway(推薦)高可用(AWS 保證)
NAT Instance需自行設定備援
NAT Gateway(推薦)自動擴展(最高 100 Gbps)
NAT Instance受限於 EC2 規格
NAT Gateway(推薦)無需維護
NAT Instance需要更新、打補丁
NAT Gateway(推薦)較高但省事
NAT Instance較低但需人力
NAT Gateway(推薦)穩定高效
NAT Instance取決於 EC2 規格

建議:除非有特殊需求,否則優先選擇 NAT Gateway。

NAT Gateway vs Public Subnet + Security Group

這是一個常見的誤解:「我可以把 EC2 放在 Public Subnet,然後用 Security Group 擋住 Inbound,效果不是一樣嗎?」

讓我們比較這兩種做法:

Public Subnet + SG✅ 可以
Private Subnet + NAT Gateway✅ 可以
Public Subnet + SG✅ 可以(有 Public IP)
Private Subnet + NAT Gateway❌ 不行(沒 Public IP)
Public Subnet + SG❌ 暴露在網路上
Private Subnet + NAT Gateway✅ 完全隱藏
Public Subnet + SG❌ 高(會被掃到)
Private Subnet + NAT Gateway✅ 低(找不到)
Public Subnet + SG必須嚴格控制
Private Subnet + NAT Gateway相對寬鬆也安全
Public Subnet + SG測試環境、臨時用途
Private Subnet + NAT Gateway生產環境、機密服務

關鍵差異:

即使你用 Security Group 封鎖所有 Inbound 連線,你的 EC2 仍然有 Public IP,表示:

  • 它會出現在網路掃描中
  • 駭客可以看到這個 IP 存在
  • 如果 Security Group 設定錯誤或有漏洞,風險更高
  • 未來可能被針對性攻擊

而使用 Private Subnet + NAT Gateway:

  • EC2 完全沒有 Public IP
  • 外網根本不知道它的存在
  • 即使 Security Group 設定寬鬆,外網也無法連入

白話比喻:

  • Public Subnet + SG:你家在馬路邊,裝了很厚的大門和監視器(SG),但別人還是看得到你家、可以來敲門測試
  • Private Subnet + NAT:你家在封閉社區深處,外人連你家在哪都不知道,根本走不到你家門口

常見問題與誤區

為什麼開了 Security Group Outbound 還是無法上網?

這是最常見的誤解。讓我們用比喻說明:

Security Group 是「門禁系統」

  • 控制你能不能出門(Outbound)
  • 控制誰能進來(Inbound)

NAT Gateway 是「社區大門」

  • 真正讓你能走到外面世界的通道

流程圖:

你想出門
   
門禁檢查(Security Group)
   ├─ Outbound 開啟   允許出門
   └─ Outbound 關閉   門禁擋住

(假設通過門禁)
   
找出口(Route Table)
   ├─ 有設定到 NAT Gateway   知道怎麼走
   └─ 沒有設定   找不到出口

(假設找到出口)
   
NAT Gateway 存在嗎?
   ├─ 存在   可以出去
   └─ 不存在   走到死路

(假設 NAT Gateway 存在)
   
NAT Gateway  Elastic IP 嗎?
   ├─    可以用它的身分對外
   └─ 沒有   無法連外網

結論:Security Group、Route Table、NAT Gateway 三者缺一不可!

延伸閱讀:AWS 網路安全雙防線:NACL 與 Security Group 完全指南

NAT Gateway 放在哪個 Subnet?

錯誤:放在 Private Subnet

Private Subnet
└─ NAT Gateway  錯誤!
   └─ 無法連到 Internet Gateway

正確:放在 Public Subnet

Public Subnet
└─ NAT Gateway  正確
   └─ 可以連到 Internet Gateway
      └─ 連到外網

一個 VPC 需要幾個 NAT Gateway?

這取決於你的架構需求:

方案一:單一 NAT Gateway(成本優化)

VPC
├─ Public Subnet (AZ-1)
  └─ NAT Gateway
├─ Private Subnet (AZ-1) ──→ 使用上面的 NAT
└─ Private Subnet (AZ-2) ──→ 使用上面的 NAT

優點:

  • 成本最低(只付一個 NAT Gateway)

缺點:

  • 跨 AZ 流量會產生額外費用
  • 如果 AZ-1 故障,所有 Private Subnet 都無法上網

方案二:每個 AZ 一個 NAT Gateway(高可用)

VPC
├─ Public Subnet (AZ-1)
  └─ NAT Gateway-1
├─ Private Subnet (AZ-1) ──→ 使用 NAT Gateway-1
├─ Public Subnet (AZ-2)
  └─ NAT Gateway-2
└─ Private Subnet (AZ-2) ──→ 使用 NAT Gateway-2

優點:

  • 高可用性(一個 AZ 掛掉不影響另一個)
  • 無跨 AZ 流量費用

缺點:

  • 成本較高(多個 NAT Gateway)

建議:

  • 開發/測試環境:使用方案一
  • 生產環境:使用方案二

NAT Gateway 的費用如何計算?

NAT Gateway 的計費包含兩部分:

計費方式按小時計費(即使沒流量)
參考價格(us-east-1)$0.045/小時 ≈ $32.4/月
計費方式按處理的資料量計費
參考價格(us-east-1)$0.045/GB

範例計算:

假設一個月:

  • NAT Gateway 運行 24/7:$0.045 × 24 × 30 = $32.4
  • 處理了 100GB 資料:$0.045 × 100 = $4.5
  • 總費用:$36.9

省錢建議:

  • 開發環境可以在下班時間刪除 NAT Gateway
  • 定期檢查是否有未使用的 NAT Gateway
  • 評估是否真的需要每個 AZ 都有 NAT Gateway

實戰設定步驟

建立 NAT Gateway 的完整流程

步驟 1:準備 Public Subnet

確保你有一個 Public Subnet,它的 Route Table 要指向 Internet Gateway:

TargetInternet Gateway
Targetlocal

步驟 2:建立 Elastic IP

  1. 進入 AWS Console → VPC → Elastic IPs
  2. 點選「Allocate Elastic IP address」
  3. 記下分配到的 EIP(例如:3.115.88.123)

步驟 3:建立 NAT Gateway

  1. 進入 VPC → NAT Gateways
  2. 點選「Create NAT Gateway」
  3. 設定:
  • Name:MyNATGateway
  • Subnet:選擇 Public Subnet
  • Elastic IP:選擇剛才建立的 EIP
  1. 點選「Create NAT Gateway」
  2. 等待狀態變成「Available」(約需 5 分鐘)

步驟 4:設定 Private Subnet 的 Route Table

  1. 進入 VPC → Route Tables
  2. 找到 Private Subnet 使用的 Route Table
  3. 編輯 Routes:
Targetnat-xxxxxxxxx (你的 NAT Gateway ID)
Targetlocal
  1. 儲存變更

步驟 5:驗證設定

登入 Private Subnet 的 EC2(透過 Bastion Host 或 Session Manager),執行:

# 測試是否能連到外網
curl https://www.google.com

# 查看對外 IP(應該會顯示 NAT Gateway 的 Elastic IP)
curl https://ifconfig.me

檢查清單(Checklist)

在設定完成後,用這個清單檢查:

  • [ ] NAT Gateway 狀態是「Available」
  • [ ] NAT Gateway 綁定了 Elastic IP
  • [ ] NAT Gateway 放在 Public Subnet
  • [ ] Public Subnet 的 Route Table 指向 Internet Gateway
  • [ ] Private Subnet 的 Route Table 指向 NAT Gateway
  • [ ] Private EC2 的 Security Group 允許 Outbound
  • [ ] 測試從 Private EC2 可以 curl 外網
  • [ ] 測試從 Private EC2 執行 apt update 或 yum update

總結

核心重點回顧

讓我們用一張總結表格複習 NAT Gateway 的關鍵概念:

答案讓 Private Subnet 的資源能主動連外網,但外網無法反向連入
答案提供安全的對外連線方式,避免直接暴露在網路上
答案必須放在 Public Subnet
答案綁定一個 Elastic IP(Public IP)
答案單向(只能出,不能進)
答案IGW 是雙向,NAT 是單向
答案小時費 + 資料處理費
答案每個 AZ 建立一個 NAT Gateway

何時使用 NAT Gateway?

適合使用的情境:

  • 後端應用伺服器需要下載套件或更新
  • 資料庫需要連接外部資料源
  • 批次處理需要呼叫外部 API
  • Lambda 在 VPC 內需要存取外網
  • 任何需要「安全對外連線」的場景

不需要使用的情境:

  • 已經在 Public Subnet(直接用 IGW)
  • 完全不需要對外連線(內部服務)
  • 只需要存取 AWS 服務(用 VPC Endpoint)
  • 預算極度有限且安全要求不高(考慮 NAT Instance)

希望這篇文章能幫助你完全理解 NAT Gateway!🚀