WireGuard、Tailscale、Headscale 怎麼選?
Tailscale 是加上控制平面的 WireGuard;比較 NAT 穿透、DERP 中繼、金鑰輪替與管理成本,判斷哪一種適合你的 VPS。
WireGuard 與 Tailscale:簡短答案
WireGuard 與 Tailscale 並不是兩種通訊協定之間的選擇,因為 Tailscale 本身就是 WireGuard。Tailscale 使用相同的加密機制與通道,另外加入控制平面:用來交換公開金鑰、分配位址、穿透 NAT(網路位址轉換),以及套用存取原則的協調伺服器。你選擇的是要自行執行多少協調工作。
有 3 個直接的答案。當你只有 1 台伺服器,以及幾個都連入該伺服器的用戶端時,使用純 WireGuard。當你希望每台機器都能連線到其他機器,且不必維護設定檔時,使用 Tailscale。當你希望建立這種網狀網路,但不希望由第三方保存節點清單時,使用 Headscale。
控制平面實際提供的功能
純 WireGuard 沒有探索功能。每個對等端都是一段由你手動撰寫的文字,包含公開金鑰、AllowedIPs 行,以及在該對等端可連線時使用的 Endpoint。將一台機器加入由 10 台機器組成的網路,代表必須編輯 10 個設定檔,因為雙方都需要對方的金鑰。這就是幾乎所有自行託管的 WireGuard 設定都採用 hub-and-spoke 架構的原因:一台具備公開 IP 的伺服器,以及只會與該伺服器通訊的用戶端。
控制平面可免除手動編輯。每個節點只需註冊一次,就會從 100.64.0.0/10 CGNAT (carrier grade NAT) 範圍取得位址,並收到允許連線之節點的公開金鑰。通道仍是兩個對等端之間的直接 WireGuard 連線,流量不會經過協調伺服器。伺服器傳遞的是中繼資料:有哪些節點、各節點使用哪個金鑰,以及哪些節點彼此可以通訊。
這會帶來 3 項具體功能。
NAT traversal。 兩台筆記型電腦分別位於兩台家用路由器後方時,兩者之間沒有公開 IP。Tailscale 使用 STUN (session traversal utilities for NAT) 探索雙方對外的位址與連接埠,接著讓雙方同時傳送封包,使各路由器先看到輸出的連線,再接受回覆。這個方式失敗時,流量會改走 DERP relay,也就是由 Tailscale 執行的加密中繼。資料經由中繼時仍維持端對端加密,因為中繼不會持有金鑰。執行 tailscale status 後,每個對等端行都會顯示 direct 或 relay。執行 tailscale netcheck 可查看距離最近的中繼,以及網路是否完全允許 UDP。
具備到期時間的金鑰輪替。 WireGuard 金鑰永不過期。除非你手動刪除對等端區塊,否則 3 年前簽發的金鑰仍可永久使用。Tailscale 則會讓節點金鑰過期;截至 July 2026,新 tailnet 的預設到期期間為 180 天。未重新驗證的機器會停止連線。對於不會有人登入操作的伺服器或 subnet router,可以個別關閉裝置的到期設定。
以政策取代路由。 在純 WireGuard 中,AllowedIPs 同時是路由表和存取控制清單,因此「alice 可以連線至資料庫」必須表示為 IP 範圍。Tailscale 使用獨立的政策檔案,規則可指定使用者、群組和標籤。規則可以指定 tag:laptop 僅能透過連接埠 5432 連線至 tag:db,不能連線至其他項目;即使機器取得新的位址,該規則仍然有效。
控制平面需要付出的代價
協調伺服器了解您的網路。它保存每個節點的公開金鑰、每個節點的名稱、分配出去的位址,以及政策。使用託管式 Tailscale 時,這些資訊由您無法控制的公司持有。由於 WireGuard 私密金鑰留在您的機器上,對方無法讀取您的封包;但對方可以查看您的網路架構,而您能否建立連線,取決於其服務是否正常運作,以及您的帳戶是否維持良好狀態。這項風險的重要程度,取決於協調伺服器遭入侵或身分帳戶遭竊後,攻擊者實際能利用其中資訊做什麼;因此值得完整閱讀 Tailscale 的信任模型。
另一項容易忽略的成本是維護。Tailscale 是每台機器上的 daemon,因此您必須在每台機器上持續修補這套軟體。Ubuntu 24.04 上的原生 WireGuard 是隨發行版提供的 kernel module,並隨 kernel 一起更新。
第三項成本是計費。截至 July 2026,Personal plan 免費,最多可供 6 位使用者使用不限數量的裝置;Standard 每位使用者每月 $8;Premium 每位使用者每月 $18。家庭使用者可維持免費。10 人團隊則不行。是否跨過這條界線,取決於使用者席次而非裝置數量;在邀請第 7 位使用者前,值得先閱讀免費方案實際涵蓋的內容。
純 WireGuard 是正確選擇的情況
當拓撲確實是中樞輻射式時,請選擇純 WireGuard。使用一台具備公開 IP 的 VPS,搭配三或四台連線到該 VPS 的裝置,而且不要求這些裝置彼此連線。設定檔一個畫面就能容納,不需要更新 daemon,不會有帳戶遺失的問題,也沒有任何外部服務介於您與伺服器之間。
如果您想了解其他方案所建立的基礎,也應選擇純 WireGuard。在 VPS 上自行託管 WireGuard VPN 會逐步說明金鑰產生、wg0.conf、IP forwarding、NAT 及 handshake 失敗;即使使用 tailnet,這些機制仍會在底層運作。如果您仍在評估較舊的方案,WireGuard 與 OpenVPN 的比較 會說明 OpenVPN 仍具優勢的四種情況。
安裝步驟很短:
sudo apt update && sudo apt install -y wireguard
sudo modprobe wireguard && echo ok當每台裝置都必須連線到其他所有裝置時,純 WireGuard 就不再容易管理。由 N 個節點組成的 full mesh 需要 N 乘以 N 減 1 個 peer 區塊。六台裝置就需要手動維護三十個同步的區塊;如果重複了 AllowedIPs 項目,流量會無聲無息地從原本先設定該項目的 peer 轉走,而且任何地方都不會顯示錯誤。
Tailscale 適用的情境
當機器經常移動時,Tailscale 是合適的選擇。例如,連線到飯店網路的筆記型電腦、使用行動數據的手機,或位於你無法控制之路由器後方的家用伺服器。這些情境正是一般 WireGuard 難以處理的情況,因為雙方都沒有穩定的公開端點可填入 Endpoint。
請使用官方安裝程式。安裝用戶端只需執行一個命令:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up
tailscale statustailscale up 會輸出一個 URL。開啟該 URL、登入後,這台機器就會加入網路。不需要複製金鑰,也不需要開啟入站連接埠,因為 daemon 會對協調伺服器建立出站連線並維持連線。這也是 Tailscale 節點能在完全無法控制防火牆的網路上運作的原因。
之後,兩項設定就能完成大部分實用功能。子網路路由器會將整個 LAN 宣告到網路中,因此不必在每台裝置上安裝用戶端:
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
sudo tailscale set --advertise-routes=192.0.2.0/24在管理主控台核准前,這條路由會維持停用狀態。這是刻意的設計:節點無法自行將路由注入你的網路。Linux 用戶端還需要 sudo tailscale set --accept-routes,因為 Linux 預設不接受宣告的路由。因此,即使伺服器端看起來已核准,路由在 Linux 筆記型電腦上仍不會生效,直到你完成這項設定。如果這符合你的需求,在 VPS 上執行子網路路由器會依照可避免路由半套運作的順序,說明核准步驟與轉送設定。
出口節點會將用戶端的所有流量經由同一台機器傳送。這就是人們通常所稱的「VPN」完整通道行為:
sudo tailscale set --advertise-exit-node該旗標本身很簡單,而將 VPS 設定為出口節點會說明後續步驟:先在管理主控台核准路由,再修正 DNS 與 IPv6 行為,否則流量可能會從錯誤的路徑送出。如果你要存取的是單一 Web 服務,而不是整個網路,serve 和 funnel可改為在單一本機連接埠前提供 HTTPS,且可限制為僅供 tailnet 使用,或開放至公用網際網路。
Headscale 適合的情境
Headscale 是 coordination server 的開放原始碼實作,執行於你擁有的 VPS。官方 Tailscale 用戶端會連線到 Headscale,而不是代管服務:
sudo tailscale up --login-server https://headscale.example.com資料路徑完全不變。它仍使用 WireGuard,且在網路條件允許時,對等節點之間仍會直接連線。改變的是,節點清單、金鑰與政策會儲存在你擁有的磁碟上的 SQLite 檔案中。外部人員無法查看你的網路拓撲、停用你的帳戶,也不會按使用者向你收費。
代價是你必須自行維運。現在你要執行公開的 HTTPS 服務,這表示需要 DNS 名稱、憑證,以及能正確轉送 WebSocket 升級的反向代理。你必須自行負責服務的可用性。coordination server 停止服務時,新節點無法註冊,現有節點也無法取得變更內容。Headscale 目前也尚未達到 1.0 版,次版本更新可能包含不相容變更,因此每次升級前都應閱讀變更日誌。將 Headscale 執行為自有的 Tailscale control server 說明安裝方式、config.yaml、preauth keys,以及需要開放的連接埠。
有一項限制常常到後期才被注意到。Headscale 不包含 Tailscale 的全球 relay network。兩個對等節點無法直接連線時,你必須在自己的伺服器上啟用內嵌 relay,或將設定指向其他 relay;而該 relay 是單一區域中的單一伺服器,不是遍布全球的伺服器群。位於地球另一端的對等節點會明顯感受到這項差異。如果你不想自行組建這部分,自行代管 NetBird 是另一種將 control plane 保留在自有環境中的方式,因為其 quickstart 會在單一 VPS 上一併啟動 management、signal 與 relay 服務。
一次判斷的方法
先確認有多少台機器必須彼此連線。如果答案是所有機器只需與伺服器通訊,使用原生 WireGuard 就能以較少的軟體達成相同結果。
再確認這些機器是否具備穩定的公開位址。如果大多數機器位於你無法控制的 NAT 後方,就需要控制平面,因為 NAT 穿透是最困難的部分,不值得自行重新實作。
接著確認誰可以知道你網路的拓撲。如果答案是不包括外部公司,或使用者數量讓按席次計費的成本難以負擔,就執行 Headscale,但也要接受必須自行操作控制伺服器。如果促使你遷移的主因是計費,請先計算成本再決定,因為實際團隊規模的費用取決於持有帳戶的人數,而不是你執行的機器數量;這兩個數字通常相差很大。
你可以低成本地改變決定。因為三者使用相同的資料平面協定,從原生 WireGuard 移至協調式 mesh 只需安裝用戶端,不必重新設計;從 Tailscale 移至 Headscale,則只需讓每個節點重新向不同的登入伺服器註冊。
三者都無法提供的功能
三者都不是防火牆。Tunnel 只決定哪些封包會被傳送,不會決定哪些服務正在監聽。透過 tunnel 可連線的伺服器,對於你保持開放的任何連接埠,仍可從網際網路連線。因此,請讓 VPS 上的 UFW 防火牆規則繼續執行其職責。Tailscale 的政策檔案會縮小其他節點可存取的範圍,但不會影響公開介面。
三者都不是逐一服務的驗證機制,也不會記錄使用者連線後執行的操作。請將三者都視為傳輸層,並在應用程式中處理登入驗證。
FAQ
Tailscale 只是多做幾個步驟的 WireGuard 嗎?
Tailscale 的資料路徑使用 WireGuard protocol,因此加密方式與 tunnel 相同。它額外提供的是協調功能:金鑰交換、位址指派、使用 STUN 與 DERP relay 進行 NAT traversal、金鑰到期管理,以及以使用者而非 IP range 定義對象的 policy file。這些工作在 plain WireGuard 中都必須自行處理,而當機器在不同 network 之間移動時,這些工作會變得複雜。
我的 traffic 會經過 Tailscale 的 server 嗎?
通常不會。協調 server 介紹 peers 之後,peers 會彼此直接連線,而 tailscale status 會在這些 peer line 上顯示 direct。如果無法建立 direct path,traffic 會改經 DERP relay,該 line 會顯示 relay。即使如此,relay 傳送的仍是加密封包,也不會持有你的 WireGuard private key,因此無法讀取內容。執行 tailscale netcheck,即可確認你的 network 是否封鎖 direct connection 所需的 UDP。
我可以搭配官方 Tailscale app 使用 Headscale 嗎?
可以。Headscale 使用相同的 control protocol,因此官方 client 可透過 sudo tailscale up --login-server https://headscale.example.com 加入。Desktop 與 mobile app 也可以指定 custom login server,但各 platform 的設定位置不同;其中 mobile app 最可能需要特定版本。將整個 network 遷移前,先用一支 phone 測試。
使用 Tailscale 或 Headscale 時,仍需要開放 port 嗎?
Tailscale client 不需要 inbound port,因為它會主動連線到 coordination server,並保持該連線開啟。自架 Headscale server 需要開放 inbound port:control protocol 使用 443;若使用 HTTP-01 certificate challenge,則需要 80;只有在啟用內建 relay 時,才需要 3478/udp。Plain WireGuard 需要在 server 上,以及 provider 管理的任何獨立 network firewall 上,開放其 UDP listen port,通常是 51820。
三者之中哪一個最快?
Throughput 相同,因為三者都使用 WireGuard 傳送封包。差異會出現在 connection setup 與 path quality。設定正確的 plain WireGuard 搭配 Endpoint 時,每次都會 direct connect。Tailscale 與 Headscale 大多數時間會 direct connect;當 network 封鎖 hole punching 時,則會改用 relay,而 relayed path 會增加 latency。使用 tailscale ping <node> 測量自己的 path,該指令會回報 route 是 direct 或 relayed;也可以使用 iperf3 測量 tunnel 內的速度。如果 direct path 的數值遠低於線路速率,問題不在三者之間的選擇,而是 通常是 path MTU 不相符;無論是否使用 control plane,這種情況都會以相同方式發生。