SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-13

如何在 VPS 上設定 Tailscale 子網路由器

在 VPS 上將私有網路廣播至 tailnet,涵蓋路由核准、重開機後仍有效的 IP forwarding,以及 Linux 必須使用的 --accept-routes 旗標。

Tailscale subnet router 的作用

Tailscale subnet router 是一台向 tailnet 廣播整段私有 IP 位址的機器,因此 tailnet 上的每台裝置都能連線到該範圍內的位址,即使那些位址所在的裝置沒有執行 Tailscale。tailnet 是您的私有 Tailscale 網路,也就是登入同一個帳戶或組織的一組裝置。人們常將它與 exit node 混淆,但兩者的作用相反。exit node 會將裝置的所有流量經由 VPS 對外傳送,因此 VPS 會成為該裝置通往公用網際網路的路由。

每句話各自說明一件事。subnet router 會讓 tailnet 可以連線到某個私有網路。exit node 會變更公用流量對外傳送的位置。如果您需要的是後者,請改讀如何在 VPS 上執行 Tailscale exit node。兩者使用不同的旗標,同一台 VPS 可以同時提供這兩項功能,但它們解決的是不同問題,失敗原因也不同。

VPS 需要子網路由器的情況

常見情況是供應商已提供私有網路。您的 VPS 具有公開位址,並透過第二個介面連線至私有網段;該網段上的其他伺服器完全沒有公開位址,例如位於 10.0.0.20 的資料庫,以及位於 10.0.0.30 的備份目標。在其中一台 VPS 上安裝 Tailscale,廣告宣告 10.0.0.0/24,您的筆電即可直接連線至這些私有位址。網段上的其他設定不必變更,資料庫也仍然沒有公開位址。

另一種情況是網路位於 VPS 的另一側。例如,路由器後方的家用或辦公室 LAN(區域網路),或是一組完全無法執行 Tailscale 的設備,例如受管理的交換器或韌體受限的舊 NAS。該網路上的一台 Linux 主機會成為整個網路的子網路由器。

這兩種情況都有一項共同要求。子網路由器必須能透過自己的路由表與防火牆,連線至它所宣告的網段。Tailscale 不會建立這條連線。它只會將網路流量傳送至路由器,再交由 kernel 轉送。

先安裝 Tailscale,並確認本機路由

curl -fsSL https://tailscale.com/install.sh | sh

此指令碼會偵測發行版、加入 Tailscale 的套件儲存庫、安裝 tailscale 指令與 tailscaled daemon,然後啟用服務。使用 systemctl is-active tailscaled 確認結果;輸出應為 active

在進行其他操作前,先確認 VPS 能連線至預計發布的網路。

ip route show
ping -c3 10.0.0.20

ip route show 必須在實體介面上列出私有網段,例如 10.0.0.0/24 dev enp7s0 proto kernel scope link src 10.0.0.5。如果在此處對路由器執行 ping 失敗,任何 Tailscale 旗標都無法修正問題。問題出在 VPS 的網路設定,或目標主機上的防火牆。請先修正,因為後續每項測試都依賴這項連線。

開啟 IP forwarding,並讓設定在重新開機後保留

除非啟用 forwarding,否則 Linux 電腦會丟棄所有目的地不是自身的封包。轉送其他電腦的封包是子網路由器的主要工作,因此這個步驟不能省略。

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

使用 sysctl net.ipv4.ip_forward 檢查,該命令應輸出 net.ipv4.ip_forward = 1

許多人只完成這個步驟的一半。sudo sysctl -w net.ipv4.ip_forward=1 會立即生效,但在下次開機時消失。因此,子網路由器可能執行數週,接著在 kernel upgrade 後重新開機的隔天早上停止運作。令人困惑的是,表面上沒有任何故障。tailscale status 仍顯示節點在線上,管理主控台仍顯示路由已核准,client 也仍已安裝該路由。封包抵達 VPS 後,kernel 會直接丟棄封包,且不會寫入任何日誌。將這些值寫入 /etc/sysctl.d/99-tailscale.conf,才能讓設定在重新開機後恢復。

如果在 forwarding 仍關閉時公告路由,tailscale up 會當下發出警告,並顯示一行接近 Warning: IPv4 forwarding is disabled. Subnet routes and exit nodes may not work correctly. 的內容。請讀取該命令的輸出,不要直接略過。

廣告路由

sudo tailscale up --advertise-routes=10.0.0.0/24

在已登入 tailnet 的 VPS 上,直接修改現有設定:

sudo tailscale set --advertise-routes=10.0.0.0/24

後續每次修改都使用 tailscale set。再次執行 tailscale up 時,如果只指定單一旗標,未重複指定的旗標會重設;CLI 也會停止執行並顯示錯誤,說明以這種方式變更設定時,必須列出所有非預設旗標。tailscale set 只會變更一項設定,並保留其他設定不變。

多個範圍要放在同一個逗號分隔清單中,且不得包含空格:--advertise-routes=10.0.0.0/24,192.168.50.0/24。每個項目都必須是 CIDR 表示法中的網路位址(無類別網域間路由,格式為 10.0.0.0/24)。如果誤寫自己的主機位址,例如 10.0.0.5/24,系統會拒絕,因為前綴長度之後的位元不是 0;錯誤訊息會指出你可能要使用的前綴。若要停止廣告路由,請使用 sudo tailscale set --advertise-routes= 設定空清單。

在管理主控台核准路由

宣告路由是請求,不會直接變更設定。管理員核准前,不會有用戶端收到這條路由,該範圍內也沒有任何資源可連線。這是刻意的設計,因為如果任何機器都能將自己加入所有人的路由表,就能攔截任意範圍的流量。

請在管理主控台的 Machines 頁面核准。VPS 會以子網路標籤列出。開啟該列,找到子網路區段,編輯路由設定,勾選該路由,然後儲存。

核准是以前綴為單位。今天宣告 10.0.0.0/24、下個月宣告 192.168.50.0/24 時,新前綴會以未核准狀態加入,而舊前綴仍可正常運作。對 VPS 而言,已核准的路由與遭忽略的路由看起來完全相同,因此在進行其他除錯前,請先檢查主控台。

您可以在 tailnet policy 檔案中加入 autoApprovers 區塊,以略過手動步驟:

{
  "autoApprovers": {
    "routes": {
      "10.0.0.0/24": ["tag:subnet-router"]
    }
  }
}

接著使用該標籤讓節點啟動:sudo tailscale up --advertise-routes=10.0.0.0/24 --advertise-tags=tag:subnet-router。路由一宣告,就會立即獲得核准。該標籤必須先存在於同一個 policy 檔案的 tagOwners 區段。若您使用指令碼重建 VPS,建議先完成這項設定,因為重建後的節點會被視為新節點,其路由會再次以未核准狀態開始。

Linux 用戶端為何未使用 --accept-routes 就會忽略路由

路由目前已完成廣告並核准。您的手機和 Mac 可以連線至 10.0.0.20。但 Linux 筆電無法連線,而且管理主控台也沒有顯示任何問題。

接受子網路路由,表示將項目寫入用戶端的路由表。在 Android、iOS、macOS、tvOS 和 Windows 上,Tailscale 用戶端會代為處理。Linux 不會這樣做,因為 Linux 電腦通常是伺服器或路由器,其路由表可能是管理員刻意設定的;若系統在未提示的情況下,將從網路學到的 /24 插入路由表,可能會中斷該電腦目前處理的流量。因此,在 Linux 上必須在每個用戶端明確啟用:

sudo tailscale set --accept-routes

接著確認路由的所在位置:

ip route show table 52
ip route get 10.0.0.20

Linux 上的 Tailscale 不會將已接受的路由放入主要路由表,而是放入路由表 52,並安裝 policy rules。使用 ip rule show 可在優先順序範圍 5210 到 5270 中查看這些規則;這些規則會將未符合其他規則的封包送往該路由表。因此,單獨執行 ip route show 永遠不會列出 10.0.0.0/24,只檢查該指令的讀者會誤以為 --accept-routes 沒有作用。ip route show table 52 才是顯示實際狀態的指令,其中應列出 tailscale0 上的廣告路由範圍。

有一個例外需要注意。如果此 Linux 節點本身也是其區域網路的第二台 subnet router,--accept-routes 會使它將前往自身直接連線子網路的流量,經由另一台路由器送出,而不是透過自己的介面送出。在高可用性配對中的備援路由器上,請不要啟用 --accept-routes,只進行路由廣告。

失效模式:兩台路由器公告重疊範圍

兩台子網路路由器不得公告完全相同的範圍。不同前綴長度的重疊範圍是允許的,Tailscale 會選擇最具體的符合項目。假設路由器 A 公告 10.0.0.0/24,路由器 B 公告 10.0.0.0/16,則前往 10.0.0.20 的流量會經由 A 傳送。

A 離線時的行為常讓人意外。Tailscale 不會回退到較不具體的路由。前往 10.0.0.20 的流量會中斷,但前往 10.1.0.20 的流量仍可經由 B 傳送。這種現象看起來像是私有網路有一半停止運作,實際原因是某個離線節點持有較具體的前綴。若要實作容錯移轉,請讓公告較寬範圍的路由器也公告較窄的前綴,讓兩者涵蓋相同的位址。

另一種重疊更接近用戶端。當你在 192.168.1.0/24 的旅館網路上,而子網路路由器公告 192.168.1.0/24 時,兩者會爭用相同的目的地;最終使用哪一條路由則取決於平台。在 Linux 上,請在 Tailscale 自己的規則之前安裝一條規則,讓本機位址使用主路由表:

sudo ip rule add to 192.168.1.0/24 priority 2500 lookup main

這條規則不具持久性,下一次開機時就會消失。真正的解決方式是選擇一個不會在外部網路遇到的私有範圍。大多數家用路由器的預設值是 192.168.0.0/24192.168.1.0/24,因此請刻意選擇 10.0.0.0/8 內的一段範圍。相同的衝突也會影響 手動設定的基本 WireGuard VPN,原因相同:較具體的本機路由會勝出,因此流量不會進入通道。

失效模式:DNS 解析到沒有任何路由涵蓋的位址

這個問題很難除錯,因為沒有任何元件回報錯誤。名稱解析成功,但連線逾時。

假設 db.internal.example.com 透過你的私有 nameserver 解析到 10.0.5.20,而你公告了 10.0.0.0/24。查詢會成功,因為 DNS(domain name system)解析與 IP routing 是分開的步驟,兩者都不會互相檢查。接著,前往 10.0.5.20 的封包在 tailnet 上找不到相符的路由,因此會經由用戶端的預設 gateway 離開,最後消失。

使用以下 2 個指令即可分別檢查這兩個部分:

nslookup db.internal.example.com
ip route get 10.0.5.20

如果查詢回傳位址,但 ip route get 沒有以 dev tailscale0 回應,表示名稱沒有問題,缺少的是路由。請公告涵蓋該位址的範圍,可以使用 10.0.0.0/16 或另外指定的 prefix,然後在 console 中核准新的 prefix。

nameserver 本身也有相同的陷阱。如果你在 admin console 中將全域 nameserver 設為私有位址,例如 10.0.0.53,該位址必須位於已核准的路由內,否則裝置完全無法連線到 resolver。若在指向無法連線的 resolver 時,開啟覆寫本機 DNS server 的選項,tailnet 中的所有裝置會同時失去名稱解析能力,包括前一秒仍可正常運作的裝置。請先公告並核准前往 resolver 的路由,再變更 DNS 設定。如果你一直在處理 tunnel 內的 DNS 問題,WireGuard tunnel 中 DNS 失效的原因 說明了相同的機制,但不包含上層的協調層。

Source NAT 與站點對站點連線

依預設,子網路路由器會將每個轉送封包的來源位址改寫為自身的私有位址。這就是 SNAT(來源網路位址轉譯)。這項機制可讓回應正常運作,而不必修改私有網路上的任何設定:位於 10.0.0.20 的資料庫會回應 VPS,因為它原本就知道如何連線到 VPS。代價是,資料庫會將每個 tailnet 連線都視為來自 VPS,因此依來源設定的防火牆規則與存取日誌都無法提供有用資訊。

如果要保留用戶端實際的 tailnet 位址,請在 Linux 上關閉此功能:

sudo tailscale set --snat-subnet-routes=false

接著,私有網路上的主機需要有一條返回 100.64.0.0/10 的路由。這是 Tailscale 指派給裝置的範圍,路由應指向子網路路由器。若缺少這條返回路由,回應會送往預設閘道,無法抵達來源端,因此連線會在第一個封包後停滯。請在私有網路的閘道上新增靜態路由,或維持 SNAT 開啟。

站點對站點連線是由兩台子網路路由器同時執行這項配置。每台路由器宣告自己的網路,並接受對方宣告的網路:

sudo tailscale up --advertise-routes=10.0.0.0/24 --snat-subnet-routes=false --accept-routes

在另一台路由器上使用其自身範圍執行相應的命令。兩個範圍必須不同。如果 sshping 正常,但大型傳輸會停滯,原因通常是 MSS(最大區段大小)。MSS 是 TCP 封包可攜帶的最大資料量。通道額外負載會使轉送封包過大,超出路徑中某段連線的限制;設定 MSS clamping 即可修正:

sudo iptables -t mangle -A FORWARD -o tailscale0 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

使用 iptables-persistent 儲存這項規則,否則下次開機時規則會消失。

維持服務運作的例行維護

截至 August 2026,Node key 預設會在 180 days 後過期。當 subnet router 上的 key 過期時,該 node 會登出,整個廣告的範圍也會變得無法連線,而且其他地方沒有任何設定變更可以解釋這個現象。請在管理主控台的 Machines 頁面停用這台機器的 key expiry,並記錄已完成此操作。

Tailscale 優先在對等節點之間建立直接連線;如果無法建立,才會改用 relay server。relay 可以正常運作,但會增加延遲。具備公開位址的 VPS 屬於最簡單的情況:允許連入 UDP 41641 後,大多數對等節點都能直接連線。如果由 ufw 管理防火牆,VPS 實際需要的 ufw 規則涵蓋所需語法。

存取規則是另一個必要部分。在預設的 tailnet 中,你的每台裝置都能連線到其他裝置,因此核准的 route 會直接生效。建立 ACL policy 後,規則的目的端必須指定 private range,因為 10.0.0.20 不是 tailnet address,也不會受以 tailnet IP 或 tag 為條件的規則涵蓋。

最後,請決定是否接受使用不由你管理的 coordination server。Tailscale 的 control plane 是 hosted service。你的 key 會留在自己的機器上,但 account 與 policy file 會存放在該服務中。執行 Headscale,自行託管的 Tailscale control server,即可將這部分留在自己的 VPS 上,但必須自行維護。若你對此仍有疑慮,另一個做法是連 Tailscale 的 client 也一併捨棄,改用 自行託管 NetBird VPN server,將 coordination layer 及其 mesh client 放在一台由你控制的機器上。如果你仍在這種模式與手寫設定之間評估,WireGuard 與 Tailscale 的比較會說明 coordination layer 提供哪些功能,以及需要付出哪些代價。

FAQ

子網路由器與 exit node 有何不同?

子網路由器會公告一段私有位址,讓 tailnet 裝置連線至未執行 Tailscale 的機器。exit node 會將自身公告為通往整個網際網路的路由,讓裝置將所有流量經由該節點的公開位址送出。同一台 VPS 可以同時擔任兩者。兩者使用不同的旗標,分別是 --advertise-routes--advertise-exit-node,而且都必須在管理主控台中個別核准。

為什麼 Linux 用戶端忽略公告的子網路路由?

Linux 用戶端不會自動接受子網路路由,必須明確啟用。請在用戶端執行 sudo tailscale set --accept-routes。接著使用 ip route show table 52 檢查,不要使用 ip route show。Tailscale 會將已接受的路由安裝到 routing table 52,並透過 policy rules 導向這些路由。因此,主路由表不會列出它們,正常運作的路由看起來就像不存在。

子網路由器重新開機後停止運作。哪裡出問題?

最可能是 IP forwarding。使用 sysctl -w 設定的值不會在重新開機後保留,因此請將它寫入 /etc/sysctl.d/99-tailscale.conf,再使用 sysctl net.ipv4.ip_forward 確認。如果 forwarding 已啟用,但該網段仍無法連線,請在管理主控台檢查該節點。Node key 預設會在 180 天後到期。過期的子網路由器看起來像是網路故障,而不是帳戶問題。

兩台子網路由器可以公告相同的網段嗎?

不能公告完全相同的網段。前綴長度不同的重疊網段可以共存,系統會優先使用最具體的路由。故障轉移需要特別注意:持有較具體前綴的路由器離線時,Tailscale 不會改用較寬的路由,因此該流量會中斷。若要建立真正的備援組合,請讓兩台路由器都公告相同的具體前綴。

主機名稱可以解析,但連線逾時。為什麼?

DNS 解析與路由是兩個不同的步驟。名稱可能解析為沒有任何已核准路由涵蓋的位址,封包接著會經由用戶端的預設閘道送出。請在用戶端執行 ip route get <address>。如果結果不包含 dev tailscale0,請公告涵蓋該位址的網段,並在管理主控台核准新的前綴。