引言
當今天人在外時,如何遠端連線到家裡的電腦、工作電腦、或是家中的 NAS?
本篇文章會一步一步教你如何使用 Tailscale 與內網裝置進行連線。
寫給對電腦不清楚的人
要讓裝置能夠互通,裝置首先要確定能夠連上網路。後續藉由 Tailscale 實現裝置的互通。
首先在官方網站註冊,並於電腦 A、電腦 B、手機、NAS 或其他待組網裝置,安裝 Tailscale 並登入帳號。
登入帳號後,等同於登入 tailnet。這些裝置會取得到彼此的內網 tailnet IP。
並可以透過裝置名稱進行連線,像是遠端桌面連線、列印、存取 NAS 等…
不想知道 VPN 背景的可直接跳到如何安裝 Tailscale、裝置重新命名與結論
如何遠端存取裝置?
在標準的情境應用中,例如:
- 自己架設的網頁伺服器(localhost:80)
- NAS 本身提供 Web GUI(localhost:5000)
- Windows 遠端桌面連線(localhost:3389)
- DNS 伺服器(localhost:53)
- 其他服務…
如果我們想讓外網的人存取這台伺服器,首先有個對外 IP (WAN IP) (IP 查詢)。我們可以透過這個對外 IP,從外部輸入 IP 進行連線。
連線後會找到我們的路由器(router),設定此路由器把對外的 port 導到對應的應用。
以 OpenWRT 的路由器介面為例,以下是路由器的設定,會在外網 IP 連線時進行通訊埠轉發(Port Forwarding)到區網 IP (LAN IP):
其目的在於把 外網 IP:Port
導向至 內網 IP:Port
。
由上圖可得知:
192.168.1.2 為 DNS 伺服器,負責處理 Port 53, 853, 784 服務。
192.168.1.3 為 網頁伺服器,負責處理網頁相關的內容。
192.168.6.4 為 遠端伺服器,由外網 Port 82 導到 內網的 Port 3389。
設定好後通訊埠轉發後,便可由外部存取 DNS、網頁或是進行遠端桌面連線了。然而,上述通訊埠轉發的方式,是讓外網 IP 直接存取內網的相關資源,也意味者任何人是可以連線的。如果想要讓特定使用者存取,則必須自己建立虛擬私人網路(virtual network,VPN)。
建立虛擬私人網路(VPN)
VPN 是一種服務,它可以建立一個安全的加密通道,將使用者與遠端伺服器建立連接。這樣可以隱藏使用者的真實 IP 位址和加密數據傳輸。
以 Windows 為例,根據微軟官網教學於 A 電腦上建立 IKEv2、L2TP 或是 IPsec 協定的 VPN 後。在另外一台 B 電腦就可以嘗試連線了。
連線成功後,B 電腦便等同於 A 電腦一樣,可以存取 NAS 服務、印表機等內網資源。
要確定的是路由器與電腦是否有防火牆阻擋 UDP Port 500, 1701, 4500。
若防火牆阻擋,會造成 VPN 連線失敗。
常見的 VPN 協定
OpenVpn − 提供多種驗證方式(金鑰、憑證、帳號密碼)進行驗證,可以在不同裝置上使用,為開源專案。整理來說開源、安全、易用、相容性好。
WireGuard − 於 2020 年整合於 Linux,較為新興的 VPN 協定。其特點為:使用 UDP 傳輸、比 IPsec、OpenVPN 更快、性能更好、並支持跨平台。較新的路由器有些會整合 WireGuard 伺服器。
L2TP/IPSec,專有協定(Cisco & Microsoft),已經內建於系統中。不需要安裝軟體就可以架設與連線。
PPTP,已淘汰的點對點協定。
什麼是 Tailscale?
Tailscale 是一個基於 WireGuard 協定的 VPN 軟體。可以將多個裝置連接,實現虛擬內部網路。
傳統上設定 WireGuard 較為繁瑣,無論是在架設、或是維護上都有一定困難。例如在各個裝置先透過 wg-quick 產生公鑰與私鑰,然後在該裝置上安裝 WireGuard後,設定相關的檔案,檔案內容需要填寫監聽的埠、專用 IP、私鑰,對等公鑰。
例如一台伺服器(Server)與兩台用戶端(Client),公私鑰設定如下:
裝置 私鑰 公鑰 設定 伺服器 A B 填入自己的私鑰 A、用戶端的公鑰 D、公鑰 F 用戶端 1 C D 填入自己的私鑰 C、伺服器的公鑰 B 用戶端 2 E F 填入自己的私鑰 E、伺服器的公鑰 B 若往後有更多用戶端、伺服器需要重新設定,且以上情況僅為 1 個伺服器的例子,多個伺服器設定起來會更加複雜。
若使用 Tailscale,基本上可以無腦架設私人 VPN,並提供一個完整的 Web GUI 顯示連線的裝置。
其中 Tailscale 基於 WireGuard,但有以下特點:
- 不使用輻射狀網絡(Hub-and-spoke networks),而是使用網狀網路(Mesh networks)改善裝置通訊的交換。當然這也是 WireGuard相較於其他 VPN 協定的不同之處。
- 支持 NAT 打洞(NAT Hole Punching)[*] ,允許位於不同 NAT 後網路的兩個節點直接通訊,而不需要中央伺服器。從而實現 peer-to-peer (P2P) 直連。
- 若 NAT 打洞失敗,fallback 到中繼模式 (relay server mode),並基於 DERP(Detour Encrypted Routing Protocol)伺服器來建立連結。
- 連入 Tailscale 時,會使用協調伺服器(coordination servers / DERP Servers)進行使用者的資訊交換,如 IP、Port、裝置狀態。
- 簡易的 Web GUI 管理介面,可以管理各個裝置彼此間的訪問程度。
- 提供 MagicDNS、TailDrop、Tailscale Funnel 等功能,可以更方便的存取裝置。[**]
* 網路地址轉換(Network Address Translation,NAT),IP 封包標頭中的 IP 位址轉換為另一個 IP 位址,從而實現地址重用,讓所有內網都可以使用同一個 IP 連接到外部網路。
** MagicDNS 提供使用裝置名稱存取裝置而不用記住 IP。TailDrop 實現了類似 AirDrop 的功能,可以直接對其他裝置傳送傳檔案。Tailscale Funnel 實現反向代理的功能,可以讓外網存取指定內網裝置。
Tailscale 的競爭品
異地建立網路的相似產品有:
我有使用過的是 Zerotier,使用的是自己的協定而非 WireGuard。個人使用心得是裝置連線 Zerotier 私人網域後,會有一組內網 IP,這組內網 IP 由於沒有 DNS 去解析,所以要存取該裝置,必須直接輸入 IP。雖然提供 ZeroNSD ,不過就印象中需要架設,也就退而轉為 TailScale了。
如何安裝 Tailscale
首先到官網進行註冊,這邊的註冊是透過 Google、Microsoft、Github、Apple 四個身分識別提供者進行註冊(identity provider,IdP),本身 Tailscale 不提供註冊,也因此沒有密碼儲存在 Tailscale 上。
使用這些 IdP,若要確保安全性,可另外開啟雙重驗證登入。
基本上是沒有人可以直接存取你的私人網路的。
登入後,由於沒有任何裝置,Tailscale 預設會提供下列不同的安裝方式,照著官方進行安裝與下載即可。這邊雖然只列出 Synology 有提供官方安裝包,不過也可以使用 Docker 進行安裝在其他 NAS 上。
下載並安裝後,電腦右下角會出現 Tailscale 的圖示,右鍵選擇 Log in… 會跳出登入介面。登入後,點選 Connect 即可加入私人網路 (tailnet) 。
重複步驟,iOS 或 Android 下載 Tailscale,登入後點選 Connect,裝置可能會要求加入 VPN,點選新增 VPN 後,也成功加入私人網路中。
可以於 Web GUI 中即時看到裝置的新增。
Linux 的部分也是一樣,只不過從 UI 介面改為命令列形式,根據官方 Linux 安裝教學,整體過程也是一致的。在登入過程中,系統會彈出一個網址,要求使用者在瀏覽器中輸入此網址進行登入。當使用者完成登入後,終端機將顯示 Success。
至此,安裝 Tailscale 並讓裝置能夠互相連線也就完成了。此時可以於 cmd 中,輸入 tailscale status 或是 tailscale ping IP 來查看連線的狀態。
如果是 active; direct 表示走的是直連,ping通常在 10 − 15 ms;反之,如果是active; relay “xxx” 表示走的是 中繼伺服器,延遲約為 80 ~ 300 ms 附近。
走中繼伺服器的原因可能是防火牆阻擋了 UDP port,導致 tailscale 只能走中繼,但比起不能直接連線,至少提供了中繼伺服器的解決方案來解決直連無法連線的問題。
若要改善 ping 延遲,可檢查路由器相關設定或防火牆來達成直連:
- 例如開啟 UPnP 與 NAT-PMP (較不安全,但無腦自動設定好)。
- 調整防火牆規則:關閉 UPnP,並允許內部裝置使用 UDP 通訊,開放本機埠 41641(目標埠依各廠商設定而定)。詳見 修改防火牆設定。
- 在 Linux 系統中,若通訊埠被阻擋,請開啟終端機並執行:
sudo ufw allow 41641/udp
。
|
|
最後,可以對著右下角的圖示右鍵 → Preferences → Run unattended 讓開機的時候自動連線 tailnet。
裝置重新命名
Tailnet 內建 DNS 功能,此功能可以把 hostname 或是裝置名稱轉為 IP(當然你是 IP 愛好者的話記 IP 也是可以的🙃)。
對著右下角的圖示,進入到 Admin console
裝置名稱預設是使用 hostname,若想要自訂裝置名稱,可以點選裝置右邊的 … 的按鈕,並重新命名裝置。
後續在裝置連線上,便可以直接透過裝置名稱進行連線
|
|
Tailscale 相關指令(CLI)
Tailscale CLI 提供在 Linux 環境下,開啟或關閉相關設定,在 Windows 上有圖示可以點選,也因此大部分的指令用不到(部分進階功能例外,需透過 CLI 進行設定),不過用來檢查相關連線狀態,用一張表格來說明我自己常用的指令,更多詳細的說明可以參照官網。
Commands | 說明 |
---|---|
tailscale status | 檢查當前網路狀態,可以檢查是否透過中繼還是直連 |
tailscale ping [IP/device] | 檢查該裝置是否直連,若看到 DERP 表示走的是中繼 |
tailscale up [flags] | 連線至 tailnet,可以帶有不同的flags |
tailscale netcheck | 檢查當前 DERP 的狀態 |
tailscale update | 更新本裝置 tailscale 的版本 |
自己常用的就幾個,比較進階的可能等未來用到再說吧。
以下是我使用過的 tailscale up 設定:
--advertise-exit-node
:假設 A 電腦有開啟這個 flag,那麼 B 電腦的流量可以使用 A 電腦做為出口,此時 B 電腦上網的 IP就變為 A 電腦的 IP。--advertise-routes=<ip>
:公開指定的子網域。例如,若 A 電腦的內網地址為 192.168.1.50,B 電腦可透過此設定直接訪問 192.168.1.xx 子網路。
2025/5/18:已撰寫進階文章詳解相關設定,請參考《Tailscale 進階應用教學:Taildrop、出口節點與子網路路由設定》了解詳細配置。
結論
本身 Tailscale 的安裝上非常簡單。且防火牆、NAT 穿透等複雜事情都幫你處理好了。
註冊完後,每個裝置下載 tailscale,並登入帳號即可加入 tailnet。並實現裝置之間的互連。
每個裝置都有主機名稱,可以透過 Admin console 修改,或是查看各個裝置的狀態。
另外也可以將以加入 tailnet 的裝置進行子網域組網,並且在 tailnet 中廣播該子網路。
甚至今天加入 tailnet 裡的裝置,還可以單獨分享該裝置節點(Sharing nodes)給其他帳號進行組網,實現更複雜的網路應用。
其他更進階的設定可以參照官方網站的說明獲取更進一步的原理與資料。