在 Proxmox 上安裝 Tailscale 後,就能從外出時輕鬆存取 SSH 或 Web UI。省去 VPN 設定的麻煩,也不需要 NAT 或埠轉發,非常方便。
不過,如果沒有意識到「哪台 VM」「誰」「可以存取到什麼程度」,就直接導入 Tailscale,可能會無意間埋下風險。
本文將整理 Proxmox + Tailscale 架構中常見的遺漏,以及在多專案、多成員環境下正確的設計順序。
[外部] → Tailscale → Proxmox 主機或 VM → vmbr0 → 全部 VM
在 Proxmox 主機本身安裝 Tailscale,或是在一台 VM 裡安裝 Tailscale 再透過 SSH 進入各 VM,都是很常見的作法。
Proxmox 的預設架構中,所有 VM 都連到同一個橋接器(vmbr0)。
vmbr0(扁平)
├── VM-A(開發環境・專案 X)
├── VM-B(開發環境・專案 Y)
├── VM-C(資料庫)
└── VM-D(安裝了 Tailscale 的 VM)
在這種狀態下,如果讓 VM-D 可以透過 Tailscale 存取,會變成:
「透過 Tailscale 完成驗證」只是在控制對 VM-D 的存取,並沒有控制後續 VM 之間的通信。
另外,如果該橋接器上還有 Proxmox 主機本身的管理 IP,問題就不只是橫向擴散到其他 VM 而已。被入侵的 VM 也可能進一步嘗試存取 Proxmox 的管理平面(例如 Web UI 或 SSH)。也就是說,在扁平的 vmbr0 架構下,原本只是想安全公開一台 VM,最糟情況下卻會把主機端的管理面也納入爆炸半徑(Blast Radius)。
此外,如果被外部開放存取的 VM 本身有漏洞,攻擊者甚至不需要通過 Tailscale 驗證,也能直接把該 VM 當作跳板,接觸同一個橋接器上的所有 VM。
這不只是 Proxmox 特有的問題,而是任何虛擬化平台或雲端環境,在把外部公開的工作負載直接接到扁平內網時,都可能發生的設計問題。
橫向移動(lateral movement)是指攻擊者以最初入侵的那一台 VM 為起點,進一步擴大到同一網路上的其他 VM。
Blast Radius(爆炸半徑)則是指一台 VM 被入侵後,會影響到的範圍。
在扁平的 vmbr0 架構中:
當你讓外部可以存取開發環境時,這點尤其危險。
在使用 Tailscale 讓外部能夠存取之前,應該先設計網路分離。
使用 Proxmox SDN 的 VXLAN Zone + VNet,可以為每個專案建立完全隔離的 L2 網路。
若是 AWS,也可以透過 Security Group 與網路分離設計來處理同樣的問題。
vnetpj01(專案 X 用)
├── VM-A
└── VM-B
vnetpj02(專案 Y 用)
├── VM-C
└── VM-D
vmbr0(主 LAN・管理用)
└── Proxmox 主機
透過 PVE 防火牆,可以在主機層級阻擋 vnetpj01 與 vnetpj02 之間的流量。即使 VM 內部修改網路設定,這個隔離邊界仍由主機端維持。
分離後的網路要如何讓人存取,會依用途而有所不同。
用途|存取方式
---|---
只有自己以管理為目的存取|Tailscale(直接連主機)
邀請多位成員以專案為單位加入|專案專用 VPN(例如 Pritunl)
只公開特定服務|Cloudflare Tunnel + 反向代理
Tailscale 很簡單,但不適合「以專案為單位分隔存取範圍」這種用途。因為它沒有提供能將單一使用者的存取範圍限制在 VNet 層級的機制。
如果有多位成員、又有多個專案,建立專案專用的 VPN 伺服器,並針對成員發放各自的 VPN 設定檔,會有更細緻的存取控制粒度。
項目|扁平架構 + Tailscale|SDN 分離 + 專用 VPN
---|---|---
外部存取的便利性|◎|○
專案間隔離|✗|◎
防止橫向移動|✗|◎
依成員控制存取|△|◎
不需要額外交換器等設備|需要|不需要
Tailscale 是很方便的工具,但「可以從外部存取」和「安全地提供外部存取」是兩回事。
特別是在有多個專案或多位成員參與的環境中,應該先做網路分離設計,再選擇存取方式,這才是正確順序。
本文所說明的 Proxmox SDN(VXLAN Zone)+ 專案專用 VPN(Pritunl)架構,可以透過 MSL Setup 這個工具自動建置。
👉 zelogx.com
👉 GitHub(免費版)
👉 建置詳細步驟請見這篇 Qiita 文章