我多年前就設置了 Tailscale,但當時只用於「連接我自己的設備」的用途。本週我終於設置了一個正式的家用出口節點:在我的 Proxmox 主機上建立一個小型專用 LXC 容器(1 個虛擬 CPU、512 MB 記憶體,基本上只跑 Tailscale)。

為了驗證它是否正常運作,我對家裡的伺服器進行 ping 測試,結果成功。但我想更深入了解,因此使用了 traceroute。

第七跳讓我開始思考,那是我的家用 ISP。這就像 VPN 嗎?還是有什麼不同?

沒有出口節點時,Tailscale 會將流量傳送到我的 Tailscale 設備,但一般的網路流量則會透過本地網路或 ISP 出口(參考出口節點文件)。

啟用出口節點後,我的裝置會將預設的網際網路路徑改為選定的設備,該設備再將流量送出到網際網路。

對於網際網路流量,出口節點的行為類似傳統 VPN 閘道,但有個前提:Tailscale 並非所有流量都走 VPN 隧道,只有在出口節點模式下才是如此。

沒有出口節點時,我們只有對外暴露的服務可被發現;有了出口節點,我的裝置就像是全隧道 VPN 模式,所有網際網路流量都會經過它。

流量到出口節點是加密的,網站看到的是出口節點的公開 IP,而非我當前連接的 ISP IP。

在談路由之前,我想先說明 Tailscale 是如何連接設備的。我一直把它比作 VPN,但其實 Tailscale 是基於 WireGuard 之上的網狀網路,並加上控制平面。

WireGuard 本身主要是資料平面,Tailscale 則在上面加了控制平面:身份認證/單一登入、節點發現、NAT 穿透協調、ACL 分發、路由分發(包含出口節點預設路由)、MagicDNS 以及快速設備撤銷。我們可以自己架設 WireGuard 隧道,但就得自己建置和維運這些控制平面功能。

兩台設備連線的流程如下:

想像你的手機在咖啡廳和家裡的伺服器都在路由器後面。NAT 就像前台,記錄誰出去,但不讓陌生人直接進來。打洞技術嘗試讓雙方同時「踏出去」,讓路由器允許回程路徑。如果失敗,DERP 會作為中立的中繼點,轉發加密資料但無法解密。

因此,出口節點是透過成為被發現的節點並完成 WireGuard 握手來連接,而非開放一般的 VPN 入口埠。出口節點會向控制平面廣告 0.0.0.0/0 和 ::/0,控制平面通知符合資格的客戶端,客戶端選擇後,所有網際網路流量都會經過加密的節點隧道。

在路由層級,啟用出口節點通常會做以下事:

路由就是規則,告訴系統「目的地 X 的封包送到下一跳 Y」。預設路由是所有網際網路流量的通用規則。逃生路由則確保流量到出口節點的真實公開端點走本地路徑,避免隧道自己套自己。

不同作業系統的實作細節不同,但使用者體驗相同:

Tailscale 出口節點模式和 OpenVPN 都能達成全隧道到單一閘道,但內部機制不同。Linux 上差異最明顯:

macOS 上兩者都會建立 utun 介面,將預設流量導入,並保留隧道端點例外路徑。差異在於路由系統:WireGuard 對比 OpenVPN 協定、網狀拓撲對比客戶端-伺服器、Tailscale 裝置身份對比 OpenVPN 證書,以及 Tailscale 的 NAT 穿透與 DERP 備援。

令我驚訝的是,Tailscale 的協調服務主要是控制平面,而非資料平面(參考 Tailscale 運作原理、DERP)。它幫助設備互相找到彼此、交換身份和政策,並建立加密的點對點路徑。實際流量盡可能直接點對點傳送。

如果直接連線被阻擋,DERP 中繼會作為備援:

客戶端 -> DERP 中繼 -> 出口節點 -> 網際網路

不論如何,網際網路出口仍在出口節點。DERP 只是傳輸備援,不會終止你的瀏覽。備援多在受限網路出現,如企業或訪客 WiFi 阻擋 UDP/點對點路徑、嚴格的 Carrier-grade NAT,或嚴控出站流量環境。一般家用環境(像我家 Proxmox 節點用家用寬頻)通常能直接點對點連線,DERP 幾乎不會出現。

這也是為什麼 Tailscale 可以提供免費方案,而傳統 VPN 供應商會收取頻寬費用。傳統 VPN 供應商要付出你使用的所有頻寬費用,因為流量都經過他們的伺服器。Tailscale 模式下,流量由我家 ISP 和出口節點機器承擔,而非 Tailscale 基礎設施。

以下是粗略的示意數學,非聲稱 Tailscale 內部流量比例或精確成本。

比較對象不同,結果也不同。

對比 NordVPN、Mullvad 等商業 VPN:你付費給他人承擔頻寬,月費約 3 至 12 美元,享有全球出口點和零設定,但需信任他們的基礎設施與流量元資料。用家用 Tailscale 出口節點,頻寬成本僅是你已付的 ISP 費用,缺點是只能從一個位置(家裡 IP)出口。

對比自架 OpenVPN:目標相同是自建閘道,但要讓 OpenVPN 可從網際網路訪問,你得解決多項 Tailscale 已處理的問題:

商業 VPN 以金錢換便利和出口多樣性,自架 OpenVPN 以營運負擔換控制權,Tailscale 出口節點介於兩者之間,提供自架控制權,卻免去埠轉發、DDNS、PKI 和 NAT 穿透的麻煩。

當我輸入 curl example.com,指令看似相同,但背後網路路徑不同。下表比較兩者流程。

再看一次 traceroute 輸出。前面示範的出口節點跳數 1 是我的 Tailscale 出口閘道,跳數 7 到達家用 ISP 邊緣。對比未啟用出口節點的 MacBook:

未啟用出口節點時,跳數 1 是本地路由器,接著是本地 ISP 路徑和上游網際網路跳數。出口位置的改變是關鍵訊號。

這符合我想要的:流量從家裡出口,而非 MacBook 當前所在網路。

改變的是流量出口位置和誰能觀察本地網路元資料,不變的是 HTTPS 仍是內容保護的主要手段。

我切換出口節點時會用一個小清單檢查:

這讓我理解整個模型:出口節點是在做真正的路由工作,而不只是「在線」的 Tailscale 節點。

如果你在 Proxmox LXC 容器內運行 Tailscale(像我這樣),預設不會運作。LXC 容器預設無法存取 /dev/net/tun,而 Tailscale 需要它。你必須在 Proxmox 主機上修改容器設定(/etc/pve/lxc/<CTID>.conf):

新增後重啟容器。新版 Proxmox(7 以上)也可透過網頁介面在容器選項 > 功能中啟用 TUN。我不確定是 Proxmox UI 還是他們複雜的多個 CLI 更糟。

我的 LXC 出口節點設定重點有兩項:

IP 轉發:核心必須允許介面間封包路由。

NAT/偽裝:出站封包需改寫為出口節點公開 IP,讓回覆能正確返回。Tailscale 在大多數 Linux 系統會自動用 iptables 偽裝規則處理,但若除錯可用:

然後在出口節點本身宣告角色:

這也是為何出口節點設定錯誤時會令人困惑:tailscale status 顯示節點「已連線」,但因轉發或 NAT 設定錯誤,網際網路仍無法使用。

安全面主要是信任的選擇。沒有出口節點時,你較信任當前網路;有了出口節點,你較信任你選擇的閘道機器。

以我為例,這信任判斷很容易:出口節點是我家 Proxmox 伺服器上的 LXC,且我刻意保持簡潔(1 vCPU、512 MB 記憶體,基本只跑 Tailscale)。

現在聚焦咖啡廳路由器視角。

小提醒:DNS 處理因作業系統和設定不同而異,這裡用「通常」是刻意用詞。

對我來說,實務規則是:如果我不信任該機器會處理出站元資料,就不該用它當出口節點。這也是我用幾乎空的專用容器運行的原因,尤其是避免 npm 套件影響網路。

透過家用出口節點路由後,我發現 AdGuard 的 DNS 遙測在遠端連線時更可預測。

當我的 MacBook 在其他網路但使用出口節點時,送到家裡 DNS 堆疊的查詢會顯示來自該家用路徑。實務上,這讓我能在一處看到「來自 VPN 路由設備」的查詢群組。

缺點是依 DNS 和 NAT 設定,單一設備的歸屬可能較模糊。但對我來說,整體可見性是優勢。

DNS 和路由相關但不同。出口節點模式改變網際網路流量出口位置,DNS 設定決定名稱查詢用哪個解析器。

除錯時,我會依序檢查:

我在 Tailscale 設定分割 DNS,讓 .home.arpa(我選的本地域)由家裡的 AdGuard DNS 伺服器解析。公共網域仍走正常解析路徑,但 *.home.arpa 查詢會導向家裡的 AdGuard。

所以即使 MacBook 在咖啡廳網路且啟用出口節點,我仍能用名稱存取內部服務(nas.home.arpa、proxmox.home.arpa),且不會將這些名稱暴露給公共 DNS 鏈。

分割 DNS 設定在 Tailscale 管理控制台的 DNS 設定中,新增該網域的名稱伺服器並指向 AdGuard 的 Tailscale IP。

好處是這些查詢經過 AdGuard,也會套用廣告阻擋和追蹤保護,並在 AdGuard 查詢日誌中顯示,讓我在一處看到所有 DNS 活動。

我會依需求使用不同方式。如果想「從任何地方使用家裡網路」,就用出口節點;如果只想存取私人 LAN 服務且保持正常瀏覽本地化,則用子網路路由器。

一台機器可同時擔任兩種角色,但我會依裝置選擇是要全網際網路出口控制還是僅私人網路可達性。

設置並追蹤路徑後,我的心智模型很簡單:出口節點讓 Tailscale 對網際網路流量像全隧道 VPN,選定機器是閘道。

信任取捨也很簡單:我不再信任當前網路,而是信任我控制的出口節點。對我來說,這是個小型專用家用 LXC,值得這樣做。

我現在的理智檢查是三個指令:curl ifconfig.me、traceroute 和 DNS 查詢。如果結果一致,我就知道流量確實從家裡出口,設定達成預期。