Cloudflare Tunnel 把家用網路、辦公室內網、CGNAT 後面的服務暴露到公網的門檻砍到極低:跑一個 cloudflared、設一筆 DNS、五分鐘就能拿到 HTTPS。但只要流量規模一上來、或用途碰到 ToS 灰色地帶(Jellyfin、檔案下載、長連線),Cloudflare 隨時可能切斷或封停帳號;TLS 終止與身分驗證也都握在第三方手上。
Pangolin 是 fosrl 從 2024 年發展起來的自架專案,2025 年突破一萬八千顆 GitHub 星後熱度持續上升。它把 WireGuard 隧道、Traefik 反向代理、身分驗證、資源權限綁成一套可以跑在自己 VPS 上的 stack,目標就是把 Cloudflare Tunnel 那層便利搬到自己控制的基礎設施上。
Pangolin 把哪幾件事捏成一塊
四個元件組合成完整系統:
- Pangolin 本體:管理面板、使用者、資源、權限的 control plane,以 TypeScript 寫成
- Gerbil:以 Go 寫的 WireGuard 介面管理服務,透過 HTTP API 動態建立 peer
- Newt:跑在內網(家裡、辦公室、Kubernetes pod)的 userspace WireGuard 客戶端,主動向 VPS 發起 outbound 隧道
- Traefik:負責 HTTPS 終止、路由、自動憑證
關鍵設計在於 Newt 是純 userspace 實作的 WireGuard,不需要核心模組、不需要 root 啟動,可以放進任何 Docker host 或 Kubernetes pod。內網主機只往 VPS 打 outbound TCP/UDP,不必開任何 inbound port,CGNAT 後面照樣能用。
該用 Pangolin 的場景與不該用的場景
要先講清楚:Pangolin 解決的不是「自架 WireGuard」這件事——那 wg-quick 兩條命令就好。它解決的是「同時要把十個內網服務對外公開,每個都需要 HTTPS、登入控管、可以隨時收回某位使用者的存取權」這種規模的問題。
典型適合的情境:
- 把 NAS、Jellyfin、Home Assistant、Vaultwarden 暴露給家人或同事,要按人發放權限
- 開發團隊在公司外部存取內網的 GitLab、Grafana、內部工具站
- SaaS 服務的客戶 demo 環境,每位客戶對應不同後端
- CGNAT 環境下的伺服器需要被外部 webhook 命中
如果手上只有一兩個服務、不需要授權層,Caddy 或 Nginx 直接跑在 VPS 上就夠了,套 Pangolin 屬於過度工程。
在 VPS 端把 Pangolin 拉起來
官方提供 install.sh,但生產環境建議直接看 docker-compose.yml 自己改。最小可運作的服務組合長這樣:
1 | services: |
VPS 對外要開的 port 不多:80/443 給 Traefik、51820/udp 給 WireGuard 控制面。若 VPS 已經跑了 NPM 或 Caddy,Traefik 那段可以拆出去接到既有反向代理,但對應的 Docker label 要照搬,否則 Pangolin 沒辦法自動把 resource 註冊到 router。
第一次啟動完登入 panel,依序建立 Organization 與 Site,Pangolin 會產生一組 Newt ID + Secret——那組就是隧道的憑證,務必收好。
把內網接進來:Newt 怎麼擺
Newt 在內網主機上跑,只要環境變數:
1 | docker run -d --name newt \ |
啟動後 Newt 會用 ID + Secret 向 Pangolin 取 session token、建立 websocket 拉控制訊息,再透過 WireGuard userspace(netstack)把隧道架起來。整個過程不需要主機端開 port、不需要 root、不需要核心模組。
要跑在裸機而不想用 Docker,官方提供 curl -fsSL https://static.pangolin.net/get-newt.sh | bash 一鍵安裝腳本,會依架構自動下載對應 binary。配上 /etc/newt/newt.env 與一份 systemd unit,重開機後 Newt 會自動回連,遠比手寫 wg-quick 設定檔好維護。
把多台內網主機接進同一個 site 時,比較乾淨的做法不是跑多個 Newt,而是把要暴露的服務集中到同一個 Docker network,由 Newt 容器透過 Docker DNS 解析 upstream。若主機分布在不同網段,分別跑 Newt 並各自註冊成獨立 site,比硬把它們組成 mesh 容易管理。
身分驗證這層才是 Pangolin 的差異化
Pangolin 的差異幾乎全在這層。預設支援三種模式:
- 本地帳號:Pangolin 自己存的使用者,適合單人或極小團隊
- Email PIN:每次存取送 PIN 到信箱,適合臨時授權客戶 demo
- OIDC / OAuth2:對接 Authentik、Keycloak、Authelia、Google Workspace、Microsoft Entra
稍有規模的部署都該走 OIDC。把 Authentik 架在同一台 VPS(或另一台),Pangolin 透過 OIDC 拿身分,Authentik 那邊統一管 group、SSO、MFA、密碼政策。離職員工在 Authentik 停權,Pangolin 端的存取立即斷掉,不必一個個 resource 改設定。
OIDC 開啟 auto-provisioning 之後,新進使用者第一次登入會自動建立帳號,並依照 Authentik group 對應到預設 role。對只有一兩位管理員的團隊,這層自動化省下大量例行工作。
resource 層級的存取控制也要記得開。Pangolin 預設每個 resource 是 organization 內公開的,正確做法是在 resource 設定裡明確列出允許的 user 或 group,再加上 IP 白名單作為第二道防線。對於只有讀檔需求的角色,用 read-only role 而不是直接給 admin,可以避免後台被誤觸。
跟 frp、純 WireGuard、Cloudflare Tunnel 怎麼選
這四個方案常被放在一起比,差別其實很明確:
| 方案 | 適合 |
|---|---|
| 純 WireGuard | 純 site-to-site VPN,沒有 HTTP 反向代理需求 |
| frp | TCP/UDP 轉發,不關心身分驗證 |
| Cloudflare Tunnel | 個人用、流量在 ToS 範圍內,可接受第三方握有 TLS 與存取紀錄 |
| Pangolin | 需要 HTTPS 反向代理 + 身分驗證 + 自架自控 |
frp 可以做到隧道,但完全沒有 auth UI、也沒有 per-resource 權限。要把 frp 升級到 Pangolin 等級,等於要在前面再疊 Authentik、反向代理、自寫膠水程式碼,工程量根本不對等。Cloudflare Tunnel 在「全球 anycast」這件事上 Pangolin 沒法比,畢竟 Pangolin 的入口就是那一台 VPS。需要全球低延遲存取、又願意把信任交給 Cloudflare 的場景,Cloudflare Tunnel 還是最佳解。
上線前要小心的事
VPS 變成單點失效。所有對外服務都從那台機器走,VPS 故障等於全公司服務下線。比較負責任的配置是:選一家網路品質穩定、有真正 SLA 的 IDC、定期備份 Pangolin 的 config 與 SQLite 資料庫、設定第二台 standby VPS 配 DNS failover。
License 也要看清楚。Pangolin 採 Fossorial Commercial License:個人與年營收 10 萬美金以下的小公司可免費商用,再大就需要購買 Enterprise license。多數臺灣中小企業在門檻內,但評估時務必對應當下版本的條款再決定。
Attack surface 不能輕忽。Pangolin 是單一對外入口,VPS 本身的 SSH、Docker daemon、firewall 設定全變成關鍵節點。基本動作至少要做到:SSH 只開 key + fail2ban、ufw 預設 deny、Pangolin 控制面板放到 VPN 後面只允許管理員存取、定期升級 Pangolin 版本(1.x 系列每月都有更新)。
把基礎設施留在自己手上
Pangolin 不是無腦取代 Cloudflare Tunnel 的方案——它把便利重建在自己能控制的地方,代價是要自己管 VPS、自己負責可用性。對於不想被第三方 ToS 牽著走、希望流量與身分都留在自己這邊的團隊,這個交換通常划算。
要把 Pangolin 跑得穩,VPS 本身的網路品質與 IDC 等級是第一個變數。NCSE Network 在臺灣是方電訊機房提供 Intel Gold CPU + NVMe SSD 的 VPS 方案,搭配多上游網路與原生 IPv6,適合放這類 24 小時長連線的反向代理閘道。實際規格與機房資訊可以到 ncse.tw 查看,或直接洽詢團隊規劃部署架構。