當你開始學習 AWS 雲端架構時,會發現一個重要的安全原則:
將應用程式和資料庫放在私有子網路(Private Subnet)中,不讓它們直接暴露在網際網路上。
這個做法大大提升了系統的安全性,但同時也帶來一個實務上的問題:既然這些機器沒有公開 IP 位址,那我們要如何遠端登入進行維護、除錯或管理呢?
這就是「堡壘主機(Bastion Host)」存在的理由。
本文將用最白話、最具體的方式,幫助初學者完全理解堡壘主機的概念、為什麼需要它,以及如何在 AWS 架構中正確配置。
問題的根源:Private Subnet 的安全困境
標準 AWS 架構的安全設計
在學習 AWS 時,你會學到以下標準做法:
- 應用程式伺服器(EC2):放在 Private Subnet
- 資料庫(RDS、Redis):放在 Private Subnet
- Private Subnet 的機器:沒有 Public IP 位址
- 透過 NAT Gateway:Private Subnet 的機器可以對外連線(例如下載更新、呼叫外部 API)
架構圖示:
圖解說明:
🔴 Private Subnet(紅色)
- EC2、RDS、Redis 都沒有 Public IP
- 路由表設定:
0.0.0.0/0 → NAT Gateway(所有對外流量走 NAT) - 外部無法直接存取這些資源
🔵 Public Subnet(藍色)
- NAT Gateway 有 Public IP
- 路由表設定:
0.0.0.0/0 → Internet Gateway(直接對外)
🟢 Internet Gateway(綠色)
- VPC 唯一的對外出入口
- 所有進出 VPC 的流量都必須經過 IGW
流量路徑詳解:
EC2 對外連線(Outbound):
EC2 → NAT Gateway → IGW → 網際網路- Private EC2 沒有 Public IP,無法直接連網際網路
- 必須透過 NAT Gateway 做來源 IP 轉換
- NAT Gateway 再透過 IGW 連到網際網路
重點:
- ✅ EC2 可以透過 NAT Gateway 主動對外連線(下載更新、呼叫 API)
- ❌ 外部使用者無法主動連入 EC2(沒有 Public IP)
- ❌ IGW 不會直接連到 Private Subnet
- ❌ NAT 不會直接連到網際網路(必須透過 IGW)
這個設計非常安全,因為外部的網路流量無法直接進入這些機器,大幅降低了被攻擊的風險。
遇到的實際問題
但是,當你實際運作系統時,一定會遇到以下情境:
- 需要登入 EC2 查看系統日誌(log files)
- 需要除錯應用程式的執行狀態
- 需要手動執行某些維護指令
- 需要檢查資料庫連線狀況
- 需要安裝或更新套件
問題來了:Private Subnet 的機器沒有 Public IP,你從家裡或公司的電腦,根本無法直接 SSH 連線進去!
這時候,你需要一個「中繼站」來幫你進入內部網路,這個中繼站就是 堡壘主機(Bastion Host)。
堡壘主機是什麼?
核心概念
堡壘主機(Bastion Host)是一台特殊的 EC2 執行個體,它的唯一任務就是:作為進入 Private Subnet 的跳板(Jump Server)。
白話比喻:保全室的概念
想像你要進入一棟高度安全的大樓:
🏠 你的電腦(在家裡或公司)
│
│ ① SSH 連線
▼
🚪 大樓門口的保全室(Bastion Host,在 Public Subnet)
│
│ ② SSH 連線(內部網路)
▼
🏢 大樓內部的機房(Private EC2,在 Private Subnet)步驟解釋:
- 你先透過 SSH 連到「保全室」(Bastion Host)
- 進入保全室後,再從保全室 SSH 連到「內部機房」(Private EC2)
這樣的設計好處是:
- 內部機器不需要 Public IP,保持高度安全
- 只有一個入口需要嚴格監控(保全室)
- 可以集中管理誰能進入內部網路
- 可以詳細記錄所有連線記錄(audit log)
技術定義
堡壘主機具有以下特性:
- 位於 Public Subnet(所以有 Public IP)
- 開啟 SSH port 22(允許遠端連線)
- 配置嚴格的 Security Group(只允許特定 IP 連入)
- 沒有其他服務在上面運行(專門用途)
- 可以 SSH 到 Private Subnet 的其他 EC2
堡壘主機與 AWS 架構的關係
完整架構圖解
graph TB
User["🏠 你的電腦"]
subgraph VPC["AWS VPC"]
direction LR
subgraph PublicSubnet["Public Subnet"]
direction TB
Bastion["Bastion Host<br/>跳板主機<br/>✅ 有 Public IP"]
NAT["NAT Gateway"]
end
subgraph PrivateSubnet["Private Subnet"]
direction TB
EC2["EC2 應用程式<br/>❌ 無 Public IP"]
RDS[("RDS 資料庫<br/>❌ 無 Public IP")]
end
Bastion -->|SSH 連線| EC2
EC2 -->|出網流量| NAT
end
User -->|① SSH 連線| Bastion
style Bastion fill:#99ccff,stroke:#0066cc,stroke-width:3px
style EC2 fill:#ff9999,stroke:#cc0000,stroke-width:3px
style RDS fill:#ff9999,stroke:#cc0000,stroke-width:2px
style NAT fill:#99ccff,stroke:#0066cc,stroke-width:2px
style PublicSubnet fill:#e6f3ff,stroke:#0066cc,stroke-width:2px
style PrivateSubnet fill:#ffe6e6,stroke:#cc0000,stroke-width:2px
style VPC fill:#fffacd,stroke:#333,stroke-width:2px連線步驟:
- 你從自己的電腦 SSH 連到 Bastion Host(Public Subnet)
- 進入 Bastion Host 後,再 SSH 連到 Private EC2
- Private EC2 透過 NAT Gateway 可以對外連線(下載更新等)
元件功能對照表
| 元件 | 所在位置 | 主要功能 | 是否有 Public IP | 用途說明 |
|---|---|---|---|---|
| Bastion Host | Public Subnet | 跳板主機 | ✅ 有 | 讓你能 SSH 進入 Private EC2 |
| EC2(應用程式) | Private Subnet | 運行服務 | ❌ 沒有 | 實際執行你的網站或 API |
| NAT Gateway | Public Subnet | 出網閘道 | ✅ 有 | 讓 Private EC2 可以連到外部網路 |
| RDS / Redis | Private Subnet | 資料儲存 | ❌ 沒有 | 儲存應用程式的資料 |
為什麼不直接給 Private EC2 一個 Public IP?
你可能會想:「為什麼不乾脆給 Private EC2 一個 Public IP,就可以直接 SSH 了?」
原因如下:
- 安全性大幅降低:每一台有 Public IP 的機器都是潛在的攻擊目標
- 管理複雜:如果有 10 台 EC2,就要管理 10 個對外入口
- 無法集中監控:無法統一記錄誰在什麼時候登入了哪台機器
- 違反最小權限原則:應用程式伺服器不需要被外部直接存取
使用堡壘主機的好處:
- ✅ 只需要保護一個入口(Bastion Host)
- ✅ 集中管理存取權限
- ✅ 容易記錄和稽核(audit)
- ✅ 符合企業安全標準
Security Group 安全設定
Bastion Host 的 Security Group
規則重點:只允許你信任的 IP 位址連入
| 類型 | 協定 | Port | 來源 | 說明 |
|---|---|---|---|---|
| Inbound | SSH | 22 | 你的公司IP/32 或 你家IP/32 | 只允許特定 IP 連入 |
| Outbound | SSH | 22 | Private Subnet CIDR | 允許連到內部 EC2 |
| Outbound | All | All | 0.0.0.0/0 | 允許出網(系統更新等) |
最佳實踐:
- 不要開放
0.0.0.0/0(全世界都可以連) - 使用
/32指定單一 IP - 如果 IP 會變動,考慮使用 VPN 或 AWS Systems Manager Session Manager
Private EC2 的 Security Group
規則重點:只允許 Bastion Host 連入
| 類型 | 協定 | Port | 來源 | 說明 |
|---|---|---|---|---|
| Inbound | SSH | 22 | Bastion Host 的 Security Group ID | 只允許 Bastion Host 連入 |
| Inbound | HTTP/HTTPS | 80/443 | Load Balancer 的 Security Group | 允許流量進入 |
| Outbound | All | All | 0.0.0.0/0 | 允許出網 |
關鍵概念:使用 Security Group ID 作為來源,比使用 IP 更安全、更靈活。
實際操作:如何使用堡壘主機
基本連線流程
步驟一:先連到 Bastion Host
# 從你的電腦連到 Bastion Host
ssh -i bastion-key.pem ec2-user@<Bastion-Public-IP>步驟二:從 Bastion Host 連到 Private EC2
# 在 Bastion Host 上執行
ssh -i private-key.pem ec2-user@<Private-EC2-Private-IP>進階技巧:SSH ProxyJump(一步到位)
如果你不想分兩步連線,可以使用 SSH 的 ProxyJump 功能:
# 一個指令直接連到 Private EC2
ssh -i private-key.pem -J ec2-user@<Bastion-Public-IP> ec2-user@<Private-EC2-Private-IP>設定 SSH Config 檔案(更方便)
編輯 ~/.ssh/config 檔案:
# Bastion Host
Host bastion
HostName <Bastion-Public-IP>
User ec2-user
IdentityFile ~/.ssh/bastion-key.pem
# Private EC2
Host private-server
HostName <Private-EC2-Private-IP>
User ec2-user
IdentityFile ~/.ssh/private-key.pem
ProxyJump bastion設定完成後,只需要執行:
ssh private-server就可以直接連到 Private EC2 了!
為什麼需要堡壘主機?總結表格
| 問題 | 為什麼需要堡壘主機 |
|---|---|
| Private EC2 沒有 Public IP | 無法直接從外部 SSH 連入,需要一個跳板 |
| 安全性考量 | 不想讓所有內部機器都暴露在網際網路上 |
| 集中管理 | 只需要管理一個對外入口,而不是每台機器都開 SSH |
| 稽核與記錄 | 可以集中記錄誰在什麼時候連入了哪些內部機器 |
| 符合規範 | 許多企業安全政策要求使用跳板主機 |
堡壘主機的替代方案
AWS Systems Manager Session Manager
AWS 提供了一個更現代的解決方案:Session Manager
優點:
- 不需要 Bastion Host(省成本)
- 不需要開 SSH port 22
- 不需要 Public IP
- 完整的連線記錄
- 透過 IAM 權限管理
缺點:
- 需要在 EC2 上安裝 SSM Agent
- 需要設定 IAM Role
使用方式:
# 透過 Session Manager 連線
aws ssm start-session --target <EC2-Instance-ID>比較:Bastion Host vs Session Manager
| 特性 | Bastion Host | Session Manager |
|---|---|---|
| 需要額外 EC2 | ✅ 需要 | ❌ 不需要 |
| 需要 Public IP | ✅ 需要 | ❌ 不需要 |
| 需要開 SSH Port | ✅ 需要 | ❌ 不需要 |
| 連線記錄 | 需自行設定 | ✅ 內建完整記錄 |
| 學習曲線 | 較簡單 | 需要學習 IAM |
| 成本 | EC2 費用 | 免費(CloudWatch 可能有費用) |
常見問題 FAQ
Q1:Bastion Host 需要多大的機器規格?
答:通常 t2.micro 或 t3.micro 就夠了,因為它只是轉發 SSH 連線,不需要執行其他服務。
Q2:可以多個人共用同一台 Bastion Host 嗎?
答:可以!這正是 Bastion Host 的用途。每個人使用自己的 SSH Key 連入。
Q3:Bastion Host 會不會成為效能瓶頸?
答:不會,因為 SSH 連線流量很小。即使有多人同時使用,也不會有問題。
Q4:如果 Bastion Host 故障了怎麼辦?
答:最好的做法是:
- 在多個 Availability Zone 部署 Bastion Host
- 使用 Auto Scaling Group 確保高可用性
- 或者使用 Session Manager 作為備案
Q5:NAT Gateway 和 Bastion Host 有什麼不同?
答:
- NAT Gateway:讓 Private Subnet 的機器可以「對外連線」(例如下載套件)
- Bastion Host:讓你可以「連入」Private Subnet 的機器(SSH 管理)
兩者功能完全不同,通常都需要同時存在。
結語
堡壘主機是 AWS 架構中一個簡單但重要的概念。它的核心思想就是:在保持內部系統高度安全的前提下,提供一個受控的管理入口。
理解堡壘主機不僅能幫助你建構更安全的 AWS 架構,也能讓你理解企業級系統中「縱深防禦(Defense in Depth)」的安全思維。
記住這個比喻:堡壘主機就像大樓的保全室,你必須先通過保全室,才能進入內部機房。這樣既保護了內部系統,也便於集中管理和監控。
隨著你的學習深入,你會發現 AWS 還提供了更多進階的解決方案(如 Session Manager、AWS Client VPN),但堡壘主機作為最基礎的概念,永遠值得你徹底理解。
祝你學習順利!🚀