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 下載 |
| 外部 API | 串接金流、簡訊、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 最重要的安全特性就是「只出不進」:
| 流量方向 | 是否允許 | 說明 |
|---|---|---|
| Outbound(出站) | ✅ 允許 | Private EC2 可以主動發送請求到外網 |
| Inbound(入站) | ❌ 禁止 | 外網無法主動連接到 Private EC2 |
這就像你家的後門:
- 你可以從後門出去買東西(Outbound)
- 但陌生人無法從後門闖進來(Inbound 被擋)
必須放在 Public Subnet
這是很多初學者容易忽略的重點:
⚠️ NAT Gateway 本身必須放在 Public Subnet 中
為什麼?因為:
- NAT Gateway 需要連接到 Internet Gateway(IGW)
- 只有 Public Subnet 才能連接到 IGW
- 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 | 自訂名稱,方便識別 |
| Subnet | Public Subnet | ⚠️ 必須選擇 Public Subnet |
| Elastic IP | 分配新的 EIP | 可選擇新建或使用既有的 |
② Route Table(給 Private Subnet 使用)
| 目的地(Destination) | 目標(Target) |
|---|---|
| 0.0.0.0/0 | NAT Gateway ID |
| 10.0.0.0/16 | local |
Route Table 欄位說明:
| 欄位 | 意思 | 白話解釋 |
|---|---|---|
| Destination(目的地) | 我要去哪裡? | 這個封包想要到達的目標 IP 範圍 |
| Target(目標/路徑) | 該透過誰去? | 要透過哪個「中繼點」才能到達 |
具體範例解讀:
0.0.0.0/0 → NAT Gateway
- 意思:所有對外的流量(0.0.0.0/0 代表任何 IP)
- 動作:都要「透過」NAT Gateway 出去
- 白話:想上網就找 NAT Gateway
10.0.0.0/16 → local
- 意思:目的地是 VPC 內部的 IP(10.0.0.0/16)
- 動作:直接在本地(local)轉發,不用出去
- 白話:同事之間講話,不用透過外人
③ Route Table(給 Public Subnet 使用)
| 目的地(Destination) | 目標(Target) |
|---|---|
| 0.0.0.0/0 | Internet Gateway ID |
| 10.0.0.0/16 | local |
具體範例解讀:
0.0.0.0/0 → Internet Gateway
- 意思:所有對外的流量(0.0.0.0/0 代表任何 IP)
- 動作:都要「透過」Internet Gateway 出去
- 白話:NAT Gateway 要上網就直接走 IGW
10.0.0.0/16 → local
- 意思:目的地是 VPC 內部的 IP(10.0.0.0/16)
- 動作:直接在本地(local)轉發,不用出去
- 白話:VPC 內部的流量不用出外網
④ Security Group(給 Private EC2 使用)
Outbound 規則(出站):
| 類型 | 目的地 | 說明 |
|---|---|---|
| All traffic | 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) |
|---|---|---|
| 流量方向 | 單向(只能出) | 雙向(進出都可) |
| 位置 | 放在 Public Subnet | 綁定在整個 VPC |
| Public IP | 需要 Elastic IP | 使用資源自己的 Public IP |
| 使用對象 | Private Subnet 的資源 | Public Subnet 的資源 |
| 安全性 | 高(外部無法連入) | 較低(外部可連入) |
| 成本 | 按小時 + 流量計費 | 免費 |
| 使用情境 | 後端服務、資料庫 | 前端服務、Load Balancer |
NAT Gateway vs NAT Instance
AWS 提供兩種 NAT 解決方案:
| 比較項目 | NAT Gateway(推薦) | NAT Instance |
|---|---|---|
| 管理方式 | AWS 完全託管 | 你要自己管理 EC2 |
| 可用性 | 高可用(AWS 保證) | 需自行設定備援 |
| 頻寬 | 自動擴展(最高 100 Gbps) | 受限於 EC2 規格 |
| 維護 | 無需維護 | 需要更新、打補丁 |
| 成本 | 較高但省事 | 較低但需人力 |
| 效能 | 穩定高效 | 取決於 EC2 規格 |
建議:除非有特殊需求,否則優先選擇 NAT Gateway。
NAT Gateway vs Public Subnet + Security Group
這是一個常見的誤解:「我可以把 EC2 放在 Public Subnet,然後用 Security Group 擋住 Inbound,效果不是一樣嗎?」
讓我們比較這兩種做法:
| 方案 | Public Subnet + SG | Private Subnet + NAT Gateway |
|---|---|---|
| 能否上網 | ✅ 可以 | ✅ 可以 |
| 能否被外部連入 | ✅ 可以(有 Public IP) | ❌ 不行(沒 Public IP) |
| 外部可見性 | ❌ 暴露在網路上 | ✅ 完全隱藏 |
| 被掃描風險 | ❌ 高(會被掃到) | ✅ 低(找不到) |
| SG 規則 | 必須嚴格控制 | 相對寬鬆也安全 |
| 適用情境 | 測試環境、臨時用途 | 生產環境、機密服務 |
關鍵差異:
即使你用 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/月 |
| 資料處理費 | 按處理的資料量計費 | $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:
| Destination | Target |
|---|---|
| 0.0.0.0/0 | Internet Gateway |
| 10.0.0.0/16 | local |
步驟 2:建立 Elastic IP
- 進入 AWS Console → VPC → Elastic IPs
- 點選「Allocate Elastic IP address」
- 記下分配到的 EIP(例如:3.115.88.123)
步驟 3:建立 NAT Gateway
- 進入 VPC → NAT Gateways
- 點選「Create NAT Gateway」
- 設定:
- Name:MyNATGateway
- Subnet:選擇 Public Subnet
- Elastic IP:選擇剛才建立的 EIP
- 點選「Create NAT Gateway」
- 等待狀態變成「Available」(約需 5 分鐘)
步驟 4:設定 Private Subnet 的 Route Table
- 進入 VPC → Route Tables
- 找到 Private Subnet 使用的 Route Table
- 編輯 Routes:
| Destination | Target |
|---|---|
| 0.0.0.0/0 | nat-xxxxxxxxx (你的 NAT Gateway ID) |
| 10.0.0.0/16 | local |
- 儲存變更
步驟 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 的關鍵概念:
| 問題 | 答案 |
|---|---|
| NAT Gateway 的作用? | 讓 Private Subnet 的資源能主動連外網,但外網無法反向連入 |
| 為什麼需要 NAT Gateway? | 提供安全的對外連線方式,避免直接暴露在網路上 |
| NAT Gateway 放哪裡? | 必須放在 Public Subnet |
| 需要什麼 IP? | 綁定一個 Elastic IP(Public IP) |
| 流量方向? | 單向(只能出,不能進) |
| 與 IGW 的差異? | IGW 是雙向,NAT 是單向 |
| 主要成本? | 小時費 + 資料處理費 |
| 高可用方案? | 每個 AZ 建立一個 NAT Gateway |
何時使用 NAT Gateway?
✅ 適合使用的情境:
- 後端應用伺服器需要下載套件或更新
- 資料庫需要連接外部資料源
- 批次處理需要呼叫外部 API
- Lambda 在 VPC 內需要存取外網
- 任何需要「安全對外連線」的場景
❌ 不需要使用的情境:
- 已經在 Public Subnet(直接用 IGW)
- 完全不需要對外連線(內部服務)
- 只需要存取 AWS 服務(用 VPC Endpoint)
- 預算極度有限且安全要求不高(考慮 NAT Instance)
希望這篇文章能幫助你完全理解 NAT Gateway!🚀