Introduction
Bastion Host(堡壘主機,常被稱為跳板機)是部署在網路邊界(如公有子網或 DMZ)、經過加固的專用伺服器,作為從外部進入內部私有網路(Private Subnet)的單一受控入口。
核心功能與特點
- 單一入口:沒有公開 IP 的內部資源(如資料庫、應用程式伺服器)無法從外部直接連線,需先經過 Bastion Host,再透過 SSH、RDP 或 Port Forwarding(SSH Tunnel)存取。
- 縮小攻擊面:只開放必要服務(如 SSH),並透過最小化套件、關閉密碼登入、定期更新等方式加固。由於它直接暴露在外,本身也是高價值的攻擊目標。
- 集中管理與稽核:所有遠端存取集中在單一節點,方便記錄與追蹤;但需額外設定(如個人帳號、session 錄製)才能達到完整稽核。
常見運作方式
- 公有與私有子網隔離:Bastion Host 放在公有子網並具備公開 IP(如 AWS Elastic IP);內部伺服器放在私有子網。
- 存取控制:防火牆規則或 Security Group 只允許特定信任來源(如公司辦公室或 VPN 的 IP)連入 Bastion Host。
雲端廠商提供的替代方案
各大雲端供應商提供不需開放 Inbound SSH Port、改以雲端身分(IAM)控管的連線方式:
- AWS:Systems Manager Session Manager
- GCP:Identity-Aware Proxy (IAP) TCP Forwarding
- Azure:Azure Bastion
傳統 SSH Bastion
架構:本機 → Bastion(Public Subnet,開 22 port)→ Private 資源
前置設定(~/.ssh/config):
Host bastion
HostName bastion.example.com
User ec2-user
IdentityFile ~/.ssh/bastion.pem
1. Shell:連到內部主機(ProxyJump)
OpenSSH 7.3 起內建 ProxyJump(-J),讓 SSH 連線穿過 Bastion 到達內部主機。
方式 A:不用 config(單次使用)
$ ssh -J ec2-user@bastion.example.com ec2-user@10.0.1.50
-J 後面需寫完整 user@host。金鑰建議先 ssh-add ~/.ssh/key.pem 加進 agent,避免兩段連線的 key 指定問題。
方式 B:寫進 ~/.ssh/config(建議,常用時)
Host bastion
HostName bastion.example.com
User ec2-user
IdentityFile ~/.ssh/bastion.pem
Host private-app
HostName 10.0.1.50
User ec2-user
IdentityFile ~/.ssh/private.pem
ProxyJump bastion
之後直接連線即可,SSH 會自動經由 Bastion 跳到目標主機:
$ ssh private-app
scp、rsync同樣適用,例如scp file.txt private-app:~/- 兩台主機使用不同 key 時,用 config 管理最乾淨
- 目標主機需要跑 sshd,且要能 SSH 登入
- 這是 TCP 層轉發,終端到終端的驗證仍在本機與目標主機之間完成,私鑰不需放在 Bastion,也不需
ForwardAgent - 舊寫法
ProxyCommand ssh -W %h:%p bastion已被ProxyJump取代
2. Port Forwarding:連到內部服務(-L)
用於存取沒有 sshd 的服務(RDS、Redis 等),或任何 TCP port。
ssh -L 13306:mydb.xxxx.rds.amazonaws.com:3306 bastion -N
| 參數 | 說明 |
|---|---|
-L 本機port:目標host:目標port |
本機 13306 轉發到「從 Bastion 看出去」的目標 |
bastion |
SSH 登入的中繼點 |
-N |
不開 shell,只維持隧道 |
-f(選配) |
隧道轉入背景執行 |
連線方式:本機 DBeaver / MySQL client 連 localhost:13306。
兩者比較
ProxyJump (-J) |
Port Forwarding (-L) |
|
|---|---|---|
| 目的 | SSH 登入內部主機 | 轉發任意 TCP 服務 port |
| 目標需要 sshd | 需要 | 不需要 |
| 典型用途 | ssh、scp、rsync |
DBeaver 連 RDS |
| 可否同時使用 | 可以,-J 負責到達中繼點,-L 負責轉發 |
# 組合:中繼點本身也在內網時
ssh -J bastion -L 13306:mydb.xxxx.rds.amazonaws.com:3306 ec2-user@10.0.1.50 -N
痛點(銜接 SSM)
- 需開放 22 port,並管理 Security Group / IP allowlist
- SSH key 的發放、輪替、離職回收
- Bastion 需要 public IP 並持續維護、patch
- 轉發模式下 Bastion 只看得到加密流量,稽核不易
後續 SSM 章節可以一對一對照:ssh -J ↔ AWS-StartSSHSession/Shell session,ssh -L ↔ AWS-StartPortForwardingSession(ToRemoteHost)。