相關指南
深入瞭解 Tailscale:裝置之間是怎麼直接連上的
更新於
Tailscale 做的事可以用一句話說完:讓你名下的每臺裝置各自拿到一個固定的內網地址,然後裝置和裝置之間直接建立 WireGuard 加密隧道,不用經過一臺中心伺服器轉發。它把一套組網系統拆成兩半:控制面只負責認人、發鑰匙、告訴每臺裝置「別的裝置現在在哪」;資料面是裝置之間點對點的加密連線,你的流量不經過控制伺服器。難點在於家裡和公司的裝置都躲在路由器後面、沒有公網地址,Tailscale 用 NAT 穿透把它們直接接上,實在接不上再用中繼接力。下面按這個順序講。
傳統 VPN 和 Tailscale 的差別:星形和網狀
傳統 VPN 是星形的:所有裝置都連到一臺 VPN 伺服器,裝置之間要通訊,流量先到伺服器再折回來。伺服器是瓶頸,也是單點——它慢,所有人都慢;它掛了,所有人都斷。
Tailscale 是網狀的(mesh):每兩臺裝置之間各有一條直接的隧道。手機訪問家裡的 NAS,流量從手機直接到 NAS,走的是兩者之間最短的那條路。沒有哪一臺機器承擔全部流量。
網狀的代價是管理複雜:十臺裝置兩兩互連就是四十五條隧道,每條都要交換金鑰、要知道對方當前的地址。手工維護不現實,Tailscale 的全部工作就是把這件事自動化。
控制面:只發鑰匙和地址簿,不碰流量
每臺裝置裝上 Tailscale 後會自己生成一對金鑰,私鑰永遠留在裝置上,公鑰交給控制伺服器(Tailscale 叫它 coordination server)。你登入帳號,控制伺服器就知道「這臺裝置屬於誰」。
控制伺服器手裡有一張表:每臺裝置的公鑰、分到的內網地址、它目前能被找到的網路地址,以及訪問規則允許誰連誰。它把你有權訪問的那幾行發給你的裝置,任何一臺裝置上線、下線、換了網路,表就更新,再推給相關的裝置。
控制伺服器不轉發你的流量,也拿不到私鑰,所以它解不開裝置之間的通訊。它像一個只管發通訊錄和門禁卡的前臺:告訴你對方在哪、你能不能進,進去之後說了什麼它不在場。
登入用的是你已有的帳號體系(單點登入),不是另設一套 VPN 密碼;裝置的金鑰會定期過期,要重新登入確認,丟了的裝置在後臺刪掉就失去訪問權。
資料面:裝置之間的 WireGuard 隧道
真正傳資料的是 WireGuard。每臺裝置拿到別的裝置的公鑰後,就能和它建立一條加密隧道,隧道兩頭各認對方的公鑰,中間任何人都讀不了、也改不了。
Tailscale 沒有改動 WireGuard 的加密部分,它做的是 WireGuard 本身不管的那些事:金鑰怎麼分發、地址怎麼分配、裝置換了網路怎麼重新找到彼此。WireGuard 的原理見《深入瞭解 WireGuard》。
每臺裝置在這張網裡有一個固定的內網地址(100 開頭的那一段),不管它實際接的是家裡寬頻、公司網路還是手機流量,這個地址都不變。所以你可以一直用同一個地址訪問家裡的 NAS。配上 MagicDNS,還能直接用裝置名字訪問。
NAT 穿透:兩臺都躲在路由器後面,怎麼直接連
家裡的電腦沒有公網地址,它出門要經過路由器做地址轉換(NAT)。路由器只放行「裡面先發起」的連線,外面主動來敲門的一律擋掉。兩臺裝置都在各自的路由器後面,誰也沒法先敲開對方的門,這就是點對點連線的難處。
Tailscale 的辦法分三步。第一步,每臺裝置先問一臺公網上的伺服器「你看到我是從哪個地址、哪個端口出來的」,這樣它就知道自己在路由器外面長什麼樣(這類服務叫 STUN)。第二步,兩臺裝置透過控制伺服器交換這個外部地址。第三步,兩邊同時朝對方的外部地址發包:各自的路由器看到是「裡面先發的」,就給回程開了口子,兩邊的包恰好從這個口子進去,連線就通了。這就是常說的「打洞」。
打洞用的是 UDP。大多數家用路由器都能打通;但有些網路的地址轉換方式特別嚴格(每連一個新目標就換一個外部連接埠),或者乾脆封了 UDP,這時就打不通。
DERP 中繼:打不通的時候誰來接力
打洞不保證成功,所以 Tailscale 準備了一批中繼伺服器,叫 DERP。兩臺裝置一時連不上,就都連到同一臺 DERP,由它把加密後的包轉交給對方。DERP 走的是 HTTPS(TCP 443),幾乎任何網路都放行。
中繼轉發的是已經用 WireGuard 加密好的包,DERP 沒有金鑰,只能看到「誰發給誰、多大」,看不到內容。
連線總是先從中繼開始:兩臺裝置一上線就先透過 DERP 說上話,保證馬上能通;同時在後臺嘗試打洞,一旦直連成功就悄悄切過去,切換過程中連線不斷。所以剛連上的頭幾秒延遲高一點、隨後降下來,是正常現象。
一直停在中繼上,速度和延遲取決於那臺中繼離你多遠、有多忙,通常比直連慢。Tailscale 用戶端裡能看到當前這條連線是直連(direct)還是走了中繼(relay)。
出口節點和子網路由:不止是裝置互訪
- 出口節點(exit node):把某一臺裝置指定為出口後,你其他裝置上的全部上網流量都先加密送到它那裡,再從它的網路出去。效果和傳統 VPN 一樣——對外顯示的是出口節點的地址。出口節點可以是你自己家裡的電腦,也可以是服務商提供的伺服器。
- 子網路由(subnet router):讓一臺裝了 Tailscale 的裝置替它所在的整個區域網做代理。印表機、攝像頭、老 NAS 這些裝不了 Tailscale 的裝置,就透過它被訪問到。
- 訪問控制(ACL):預設你名下的裝置互相都能訪問,團隊使用時可以寫規則,規定哪些人、哪些裝置能訪問哪些連接埠。規則由控制伺服器下發,各裝置自己執行。
- MagicDNS:給每臺裝置一個名字,訪問時不用記 100 開頭的地址。
它和 WireGuard、和傳統 VPN 是什麼關係
- 和 WireGuard:WireGuard 是一條隧道的協定,只管兩端怎麼加密通訊;每一端的金鑰和對方地址要你自己手工配。Tailscale 是建在它上面的一整套系統,替你做了登入、分發金鑰、分配地址、NAT 穿透和中繼。
- 和傳統 VPN 服務:傳統 VPN 是「所有流量去一臺伺服器」,重點在換一個出口;Tailscale 的重點是「裝置之間互通」,換出口只是它的一個附帶功能(出口節點)。
- 和內網穿透工具(frp、花生殼這類):內網穿透是把內網的某個連接埠暴露到公網,任何人知道地址都能訪問到,安全靠那個服務自己;Tailscale 不暴露任何連接埠,只有你名下登入過的裝置才進得來。
- 和 ZeroTier:思路相近,都是自動組網;ZeroTier 用的是自己的協定並模擬一個二層網路,Tailscale 用 WireGuard、工作在三層。
Headscale 和自建控制伺服器
Tailscale 的用戶端是開源的,控制伺服器是它公司運營的服務。Headscale 是社群寫的開源控制伺服器,實現了同一套協定,官方用戶端可以改連到它上面。這樣裝置名單、金鑰目錄和訪問規則都在自己手裡。
用戶端裡那個「自定義控制伺服器」「Use custom server / Use an alternate server」的選項就是為此準備的:填一個地址,用戶端就不再連 Tailscale 公司的伺服器,而是連你指定的那一臺。
自建之後,帳號怎麼登入、能掛多少臺裝置、有哪些出口節點,都由這臺控制伺服器的運營者決定,和 Tailscale 官方的免費額度與付費套餐沒有關係。
在國內網路上用,要知道的幾點
- 打洞靠 UDP。國內不少寬頻對 UDP 限速,運營商的大內網(多層地址轉換)也讓打洞更難成功,走中繼的機率比海外高。
- 走中繼時速度看中繼在哪。中繼離得遠,延遲就高,這是 Tailscale 在國內體驗差別大的主要原因。
- WireGuard 的資料包格式是固定的,沒有做偽裝,在檢查嚴格的網路裡可能被識別和限速。它是一個組網工具,不是為繞過封鎖設計的。
- 手機上常開沒問題:隧道沒有流量時幾乎不耗電,切換 Wi‑Fi 和流量時連線會自己恢復。
雷騰 的私網怎麼用它
雷騰 的「私網」欄目用的就是 Tailscale 的官方用戶端,接到我們自己運營的控制伺服器上:你用本站帳號登入一次,裝置就一直線上;我們在各地區提供出口節點,在用戶端的 Exit Node 選單裡選地區即可換出口,不用重新匯入設定;同一帳號下的手機、電腦、NAS 互相能直接訪問。
因為登入的是本站的控制伺服器,裝置數按本站的帳號檔位算,和 Tailscale 官方的帳號、額度無關;如果裝置上已經登入過 Tailscale 官方帳號,要先退出再登入本站的。安裝和登入的圖文步驟見《私網(Tailscale)是什麼》,入口在私網頁面。
所在網路限制 UDP、私網又慢又不穩的時候,同一個帳號可以換用其他接入方式,見《各種連線方式適用的場景》。
常見問題
Tailscale 的伺服器能看到我的流量嗎?
看不到內容。控制伺服器只儲存公鑰、裝置名單和訪問規則,私鑰不離開裝置;中繼伺服器轉發的是已經加密的包,沒有金鑰。它們能看到的是後設資料:哪臺裝置線上、和誰建立了連線。
Tailscale 和 WireGuard 是什麼關係?
WireGuard 是底層的加密隧道協定,Tailscale 在它上面加了帳號登入、金鑰分發、地址分配、NAT 穿透和中繼。可以理解為 WireGuard 是發動機,Tailscale 是裝好了發動機、能直接開的整車。
為什麼有時候顯示走中繼(relay)而不是直連?
說明兩臺裝置之間打洞沒成功,常見原因是其中一邊的網路封了 UDP,或者地址轉換方式太嚴格。走中繼照樣能用,只是速度取決於中繼的位置。換一個網路(比如手機熱點)常常就能直連。
DERP 是什麼?
Tailscale 的中繼伺服器。兩臺裝置無法直連時,由它轉發加密後的資料包;裝置剛上線時也先經過它建立聯絡。它走 HTTPS,所以在只放行網頁流量的網路裡也能通。
出口節點和普通 VPN 有什麼區別?
效果一樣,都是讓全部上網流量從另一個地方出去。區別是出口節點只是組網裡的一臺裝置,隨時可以在選單裡換成另一臺或關掉,換的時候不用重新設定,裝置之間的互訪也不受影響。
Headscale 是什麼?
一個開源的 Tailscale 控制伺服器實現。把官方用戶端的控制伺服器地址改成它,就得到一套自己掌握的組網系統,資料面仍然是 WireGuard,用戶端還是官方的。
Tailscale 能翻牆嗎?
它本身是組網工具:只有當你的網裡有一臺位於境外的裝置、並把它設為出口節點時,流量才會從境外出去。它的流量沒有偽裝,在限制 UDP 的網路裡不一定好用。需要穩定的跨境線路時,看《各種連線方式適用的場景》裡其他幾種方式。