這是一張有關標題為 Tailscale 進階應用教學:Taildrop、出口節點與子網路路由設定 的圖片

Tailscale 進階應用教學:Taildrop、出口節點與子網路路由設定

深入解析 Taildrop 檔案分享、出口節點(Exit Node)設定,以及子網路路由(Subnet Routing)配置,幫助你輕鬆實現內網穿透、遠端存取與 VPN 網路優化。

引言

在上一篇《使用 Tailscale 輕鬆建立安全且私密的通道》中,我們介紹 Tailscale 背後的原理、如何安裝 Tailscale 以及兩台電腦之間的連線。隨著企業對內外網路整合與資源共享需求的日益增長,本篇文章將進一步探討 Tailscale 的進階應用,包括 Taildrop 檔案分享出口節點(Exit Node)設定 以及 子網路路由(Subnet Routing)配置。藉由這些功能,可以更有效率地進行內網穿透與遠端存取,同時提升整體網路安全性與管理效能。

上述內容不僅適用於企業環境,個人使用者亦可藉由 Tailscale 將 NAS、影音串流等內網服務安全整合,實現高效且便捷的遠端存取與管理。

舉一些簡單的例子如:

  1. 如何將裝置 A 中的檔案或是照片,安全且高效地傳輸至裝置 B?
  2. 如何讓裝置 B 能夠藉由裝置 A 進行網際網路連線,以解決部分網頁無法存取的問題?
  3. 裝置 A 可連線至 NAS(IP 為 192.168.88.88),位於外網的裝置 B 如何能透過此 IP 連線到 NAS?

這些議題將在後續章節中進一步討論與說明。

連線裝置確認

我們先確保至少有兩台裝置已成功安裝 Tailscale。在 Windows 系統中,執行 命令提示字元(CMD) 並輸入以下指令:

1
tailscale status

回傳裝置結果如下:

1
2
3
4
5
6
7
100.3.20.8     server-1        c25rjfctj1@    linux     -
100.62.221.1   desktop         c25rjfctj1@    windows   offline
100.81.33.45   home            c25rjfctj1@    windows   active; offers exit node; direct 124.1.114.167:53490, tx 23581100 rx 9681620
100.84.25.76   nas             c25rjfctj1@    linux     -
100.43.71.12   server-2        c25rjfctj1@    windows   -
100.12.47.99   wells-iphone    c25rjfctj1@    iOS       -
100.111.110.1  company         c25rjfctj1@    windows   -

或是也可以到 Tailscale Admin Console 查詢裝置狀態,可以看到目前已註冊多個裝置到 tailnet 中。

Tailscale 查詢裝置狀態

使用 Taildrop 傳遞檔案

可以透過 Taildrop 進行兩個裝置之間互相傳遞檔案或資料。Taildrop 的概念類似於 Apple 裝置上的 AirDrop,但與 AirDrop 主要依賴 Wi-Fi 或藍牙傳輸不同,Taildrop 是透過 Tailscale 的安全加密通道進行檔案傳輸,且不受裝置距離限制都能順利完成傳輸。

啟用 Taildrop

Taildrop 目前仍處於 Alpha 階段,需要手動啟用才能使用該功能:

  1. 登入 Tailscale Admin Console
  2. 進入 Settings > General
  3. 找到 Send Files(傳遞檔案) 選項,並開啟 Taildrop 功能。

Settings > General 頁面中的 Send Files 功能

傳遞檔案

將手機上的檔案傳送至其他裝置,我們可以先選取欲傳送的照片或檔案,點擊分享選單,並選擇 Tailscale。隨後,系統會顯示可傳遞的目標裝置,選擇目標裝置後,即可開始傳輸。檔案傳送完成後,將自動存放於 目標裝置的下載目錄 中。

找到圖片或檔案,點擊分享 分享到 Tailscale 點選目標裝置進行傳送

從電腦傳檔案到 iPhone、Mac 或是 Android 裝置上也非常簡單,對檔案右鍵Send with Tailscale...,就可以輕鬆在其他裝置上取得檔案。

傳遞檔案到 NAS

Synology NAS 預設並無下載資料夾,因此需手動建立一個新的共用資料夾,並命名為 Taildrop。接著,需為系統內的 tailscale 使用者賦予該資料夾的讀寫權限,完成設定後,即可透過 Taildrop 將檔案傳輸至 NAS。

  1. 建立共用資料夾
    • 進入 Synology 控制台 > 共用資料夾 > 建立
    • 設定資料夾名稱為 Taildrop
    • 略過加密及進階設定

新增共用資料夾 設定資料夾名稱為 Taildrop 略過加密 略過進階設定

  1. 設定 tailscale 使用者權限
    • 於權限設定畫面中,顯示內部使用者帳號
    • 找到 tailscale 使用者賦予完整存取權限

顯示內部使用者帳號 找到 tailscale 使用者 設定全部的權限 確認權限 完成資料夾權限設定

  1. 完成設定
    • 確保 tailscale 具備讀寫權限後,即可透過 Taildrop 傳輸檔案至 NAS,傳輸後的檔案將儲存於 Taildrop 資料夾。

Linux 傳遞檔案

在 Linux 進行檔案傳輸,我通常會使用 SCP + SSH。然而,若伺服器未啟用 SSH,也可以考慮使用 Taildrop 作為替代方案。

在操作 Tailscale 指令,如果未設定 Tailscale 的 operator,每次執行指令時都需要使用 sudo 提升至系統管理員權限。為了簡化操作,可以設定 operator,讓當前使用者擁有 Tailscale 操作權限,避免頻繁使用 sudo 來執行 Tailscale 指令:

1
sudo tailscale set --operator=$USER

在 Linux 上,可以使用 tailscale file cp 指令來傳送檔案,格式為:

1
tailscale file cp [檔案名稱] [目標裝置]:

指令結尾的冒號 (:) 是 Tailscale 規定的格式。例如,傳送 gen_cert.sh 檔案至 wells_home 裝置:

1
tailscale file cp gen_cert.sh wells_home:

執行後的輸出結果如下:

1
2
wells@server:~$ tailscale file cp gen_cert.sh wells_home:
gen_cert.sh     1.65KiB     1.02KiB/s     100.00%     ETA 00:00:00

若要接收檔案,可先在裝置 A 透過 Taildrop 在電腦上傳檔案至伺服器,然後在 Linux 上執行以下指令,將檔案存入當前目錄 (.):

1
tailscale file get .   # . 表示接收檔案儲存在當前目錄

使用 Tailscale 設定出口節點來轉送流量實現翻牆

在某些情境下,我們希望將所有或部分網路流量透過特定裝置發送,例如:

  1. 出差到國外,無法正常連線至特定網站或服務(如 ChatGPT)。
  2. 某些網頁透過 IP 確認裝置是否為特定機構才能存取,但當前裝置不在內部網路。
  3. 想要加強隱私保護,透過可信任的裝置轉送流量,而非直接使用公共網路。

我先前出國買的部分 SIM 卡會漫遊到香港,香港目前會受到 ChatGPT 的限制而無法正常使用。此時透過出口節點,選擇在臺灣或是其他地區的伺服器,即可繞過限制。


設定出口節點

使用出口節點相當簡單,首先需將目標裝置設定為出口節點

在 Windows 和 macOS 上,可以右鍵點擊圖示,然後選擇 Exit nodes → Run exit node…。

在 Windows 上設定出口節點

在 Linux 上,則需先啟用 IPv4/IPv6 轉發,執行以下指令:

1
2
3
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf

由於 Tailscale 已經啟動,我們只需附加 --advertise-exit-node 旗標,即可將裝置設定為出口節點:

1
sudo tailscale set --advertise-exit-node

在裝置端宣告為出口節點後。接著,進入 Tailscale Admin Console,在路由設定中啟用 Use as exit node

選取 Edit route setting 勾選 Use as exit node

連線出口節點

設定完成後,其他裝置(例如手機)可以透過 Tailscale 連線,並選擇出口節點。選擇出口節點後,可以透過 Cloudflare Radar 檢查 IP 或是於終端機中輸入 curl checkip.amazonaws.com 取得 IP,確認是否已變更為出口節點裝置(server-1)的 IP。

手機端選擇出口節點 Windows 選擇出口節點 檢查 IP

Linux 系統可以透過以下指令進行連線出口節點:

1
tailscale set --exit-node=100.100.57.95

之後,所有流量將透過所選的出口節點進行傳輸,可以在有網路封鎖的地區可以繞過限制。

使用 Tailscale 子網路路由

在企業或個人網路環境中,部分裝置(如 NAS、伺服器、印表機等)無法直接安裝 Tailscale,此時可透過 子網路路由(Subnet Routing) 存取這些內部裝置。Tailscale 允許特定裝置充當 閘道器(Gateway),讓其他裝置透過該閘道訪問整個內部子網路。

宣告子網路

假設裝置 A 與內部路由器(IP:192.168.100.1)可直接通訊,若希望裝置 B 也能透過 Tailscale 存取該網頁服務,則可在裝置 A 上宣告子網路。在系統中執行終端機,輸入以下指令:

1
tailscale set --advertise-routes=192.168.100.0/24

以上範例中的 192.168.100.0/24 採用 CIDR 表示法,對應的 IP 範圍為 192.168.100.0 ~ 192.168.100.255

如果只需共享 192.168.1.1 ~ 192.168.1.10,就必須在指令中以 CIDR 表示法分段指定:

1
tailscale set --advertise-routes=192.168.1.1/32,192.168.1.2/31,192.168.1.4/30,192.168.1.8/31,192.168.1.10/32

可使用 CIDR 計算機 找出最佳化的 IP 區段設定。

在 Linux 系統上,需要另外啟用 IPv4/IPv6 轉發功能,執行以下指令:

1
2
3
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p /etc/sysctl.conf

完成子網路宣告後,進入 Tailscale Admin Console,在對應裝置的路由設定中啟用 宣告的子網路

選取 Edit route setting 勾選宣告的子網路 192.168.100.0

設定完畢後,Tailnet 內的所有裝置即可存取 192.168.100.xxx 下的裝置。例如在 Windows 系統下進行 ping 測試:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
C:\Users\wells>ping 192.168.100.1

Ping 192.168.100.1 (使用 32 位元組的資料):
回覆自 192.168.100.1: 位元組=32 時間=87ms TTL=64
回覆自 192.168.100.1: 位元組=32 時間=79ms TTL=64
回覆自 192.168.100.1: 位元組=32 時間=80ms TTL=64
回覆自 192.168.100.1: 位元組=32 時間=69ms TTL=64

192.168.100.1 的 Ping 統計資料:
    封包: 已傳送 = 4,已收到 = 4, 已遺失 = 0 (0% 遺失),
大約的來回時間 (毫秒):
    最小值 = 69ms,最大值 = 87ms,平均 = 78ms

使用系統通訊埠轉發

除了藉由 Tailscale 宣告子網路,也可以直接使用系統內建功能進行通訊埠轉發。例如在 Windows 中透過 netsh、或在 Linux 中透過 iptables 將外部連接埠導向內部裝置。然而,若希望更有效率地管理存取權限,並且能為不同子網路的使用者提供彈性的控管,建議優先採用 Tailscale 子網路路由。Tailscale 本身的存取控制(access control lists,ACL)可更輕鬆指定哪些裝置能夠連線到目標子網路,避免繁雜的防火牆與轉發規則設定。

Windows 系統轉發

以 Windows 為例,在「系統管理員模式」下執行終端機後,可透過以下指令將外部 9999 連接埠轉發至 192.168.100.1 的 80 連接埠:

1
2
# 新增路由,[裝置名稱:9999] 轉至 [192.168.100.1:80]
netsh interface portproxy add v4tov4 listenport=9999 listenaddress=0.0.0.0 connectport=80 connectaddress=192.168.100.1

如果要刪除規則可透過以下指令:

1
2
3
4
5
# 刪除路由
netsh interface portproxy delete v4tov4 listenport=9999 listenaddress=0.0.0.0

# 刪除所有 portproxy 規則
netsh interface portproxy reset

新增路由後,使用者只需輸入 http://server-1:9999,便可看到該 Web 服務。若要檢視所有路由規則,可執行以下指令:

1
netsh interface portproxy show all

範例輸出結果:

1
2
3
4
5
接聽 ipv4:             連線到 ipv4:

位址            連接埠      位址            連接埠
--------------- ----------  --------------- ----------
0.0.0.0         9999        192.168.100.1   80

若電腦安裝了其他防火牆或防毒軟體(例如 Bitdefender),需在防火牆規則中允許通訊埠 9999 的入站或雙向連線:

進入 Bitdefender 的防火牆設定頁面 允許通訊埠 9999

Linux 轉發

在 Linux 系統中,也可利用 iptables 進行路由轉發。下列指令需在「系統管理員模式」下執行:

1
2
3
4
5
# 1. PREROUTING: 將來自外部的 TCP 80 通訊埠請求,轉發到內部 192.168.0.22:3000
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.22:3000

# 2. POSTROUTING: 確保回應的封包回到請求者
iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.22 --dport 3000 -j MASQUERADE

可透過以下指令確認規則是否生效:

1
iptables -t nat -L -v -n

成功後,應會看到類似下列輸出:

1
2
3
4
5
6
7
Chain PREROUTING (policy ACCEPT 7529 packets, 1690K bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DNAT       6    --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:192.168.0.14:3000

Chain POSTROUTING (policy ACCEPT 128K packets, 8976K bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 MASQUERADE  6    --  *      *       0.0.0.0/0            192.168.0.14         tcp dpt:3000

若系統啟用了防火牆(例如 ufw),須確保已開啟 80 通訊埠號的入站流量:

1
2
3
sudo ufw allow 80/tcp
sudo ufw reload
sudo ufw status

如此一來,即可使用 Tailscale 裝置名稱 + 通訊埠號的方式進行存取特定的服務。

結論

本篇文章深入探討 Tailscale 的進階應用,包含 Taildrop 檔案分享出口節點子網路路由,以滿足企業與個人用戶的內網穿透、遠端存取與網路優化需求。

此外,文中還介紹了 通訊埠轉發 的操作,說明如何透過 Windows netshLinux iptables 進行通訊埠映射,建議優先使用 Tailscale 內建的子網路路由功能,可以透過 ACL 更快建立規定哪一些裝置可以進行存取,以確保更高的安全性。無需依賴繁瑣的防火牆設定。

如果有需要針對特定裝置才能存取子網路,可以參考 Manage permissions using ACLs,官方已經提供完整的說明與設定。

最後,多數工作用 Windows 筆電配備雙網卡(有線與無線網路)。可透過設定 fMinimizeConnections0,使電腦同時連接 Wi-Fi 和有線網路。接著,可使用 route 指令進行子網路分流,預設所有流量經由無線網路(外網),而針對 172.x.x.x 或 192.x.x.x 內部子網路,則導向有線網路。需要特別注意,透過此方式繞過內網限制可能帶來安全風險,務必謹慎評估是否有這些路由需求。

參考文獻

  1. Use AirDrop on iPhone to send items to nearby Apple devices
  2. Taildrop
  3. Taildrop with NAS devices
  4. Use exit nodes
  5. Recommended exit nodes
  6. Subnet routers
  7. Netsh interface portproxy commands
主題 Stack 由 Jimmy 設計