這是一張有關標題為 使用 Tailscale 輕鬆建立安全且私密的通道 的圖片

使用 Tailscale 輕鬆建立安全且私密的通道

輕鬆在任何裝置上訪問私網裝置。

引言

當今天人在外時,如何遠端連線到家裡的電腦、工作電腦、或是家中的 NAS?

本篇文章會一步一步教你如何使用 Tailscale 與內網裝置進行連線。

寫給對電腦不清楚的人

要讓裝置能夠互通,裝置首先要確定能夠連上網路。後續藉由 Tailscale 實現裝置的互通。

首先在官方網站註冊,並於電腦 A、電腦 B、手機、NAS 或其他待組網裝置,安裝 Tailscale 並登入帳號。

登入帳號後,等同於登入 tailnet。這些裝置會取得到彼此的內網 tailnet IP。

並可以透過裝置名稱進行連線,像是遠端桌面連線、列印、存取 NAS 等…

透過裝置名稱進行遠端桌面連線

透過裝置名稱進行 SSH 連線

不想知道 VPN 背景的可直接跳到如何安裝 Tailscale裝置重新命名結論

如何遠端存取裝置?

在標準的情境應用中,例如:

  1. 自己架設的網頁伺服器(localhost:80)
  2. NAS 本身提供 Web GUI(localhost:5000)
  3. Windows 遠端桌面連線(localhost:3389)
  4. DNS 伺服器(localhost:53)
  5. 其他服務…

如果我們想讓外網的人存取這台伺服器,首先有個對外 IP (WAN IP)IP 查詢)。我們可以透過這個對外 IP,從外部輸入 IP 進行連線。

連線後會找到我們的路由器(router),設定此路由器把對外的 port 導到對應的應用。

以 OpenWRT 的路由器介面為例,以下是路由器的設定,會在外網 IP 連線時進行通訊埠轉發(Port Forwarding)到區網 IP (LAN IP):

OpenWRT 通訊埠轉發設定

其目的在於把 外網 IP:Port 導向至 內網 IP:Port

由上圖可得知:

  1. 192.168.1.2 為 DNS 伺服器,負責處理 Port 53, 853, 784 服務。

  2. 192.168.1.3 為 網頁伺服器,負責處理網頁相關的內容。

  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 協定

  1. OpenVpn − 提供多種驗證方式(金鑰、憑證、帳號密碼)進行驗證,可以在不同設備上使用,為開源專案。整理來說開源、安全、易用、兼容性好。

  2. WireGuard − 於 2020 年整合於 Linux,較為新興的 VPN 協定。其特點為:使用 UDP 傳輸、比 IPsec、OpenVPN 更快、性能更好、並支持跨平台。較新的路由器有些會整合 WireGuard 伺服器。

  3. L2TP/IPSec,專有協定(Cisco & Microsoft),已經內建於系統中。不需要安裝軟體就可以架設與連線。

  4. PPTP,已淘汰的點對點協定。

什麼是 Tailscale?

Tailscale 是一個基於 WireGuard 協定的 VPN 軟體。可以將多個設備連接,實現虛擬內部網路。

傳統上設定 WireGuard 較為繁瑣,無論是在架設、或是維護上都有一定困難。例如在各個裝置先透過 wg-quick 產生公鑰與私鑰,然後在該裝置上安裝 WireGuard後,設定相關的文件,文件內容需要填寫監聽的埠、專用 IP、私鑰,對等公鑰。

例如一台伺服器(Server)與兩台客戶端(Client),公私鑰設定如下:

裝置私鑰公鑰設定
伺服器AB填入自己的私鑰 A、客戶端的公鑰 D、公鑰 F
客戶端 1CD填入自己的私鑰 C、伺服器的公鑰 B
客戶端 2EF填入自己的私鑰 E、伺服器的公鑰 B

若往後有更多客戶端、伺服器需要重新設定,且以上情況僅為 1 個伺服器的例子,多個伺服器設定起來會更加複雜。

若使用 Tailscale,基本上可以無腦架設私人 VPN,並提供一個完整的 Web GUI 顯示連線的裝置。

其中 Tailscale 基於 WireGuard,但有以下特點:

  1. 不使用輻射狀網絡(Hub-and-spoke networks),而是使用網狀網路(Mesh networks)改善裝置通訊的交換。當然這也是 WireGuard相較於其他 VPN 協定的不同之處。
  2. 支持 NAT 打洞(NAT Hole Punching)[*] ,允許位於不同 NAT 後網路的兩個節點直接通訊,而不需要中央伺服器。從而實現 peer-to-peer (P2P) 直連。
  3. 若 NAT 打洞失敗,fallback 到中繼模式 (relay server mode),並基於 DERP(Detour Encrypted Routing Protocol)伺服器來建立連結。
  4. 連入 Tailscale 時,會使用協調伺服器(coordination servers / DERP Servers)進行用戶的資訊交換,如 IP、Port、裝置狀態。
  5. 簡易的 Web GUI 管理介面,可以管理各個裝置彼此間的訪問程度。
  6. 提供 MagicDNS、TailDrop、Tailscale Funnel 等功能,可以更方便的存取裝置。[**]

* 網路地址轉換(Network Address Translation,NAT),IP 封包標頭中的IP位址轉換為另一個 IP 位址,從而實現地址重用,讓所有內網都可以使用同一個 IP 連接到外部網路。

** MagicDNS 提供使用裝置名稱存取裝置而不用記住 IP。TailDrop 實現了類似 AirDrop 的功能,可以直接對其他裝置傳送傳檔案。Tailscale Funnel 實現反向代理的功能,可以讓外網存取指定內網裝置。

Tailscale 的競爭品

異地建立網路的相似產品有:

  1. Zerotier
  2. Cloudflare Tunnel
  3. Netmaker
  4. Ngrok
  5. Twingate
  6. 等…

我有使用過的是 Zerotier,使用的是自己的協定而非 WireGuard。個人使用心得是裝置連線 Zerotier 私人網域後,會有一組內網 IP,這組內網 IP 由於沒有 DNS 去解析,所以要存取該裝置,必須直接輸入 IP。雖然提供 ZeroNSD ,不過就印象中需要架設,也就退而轉為 TailScale了。

如何安裝 Tailscale

首先到官網(https://tailscale.com/)進行註冊,這邊的註冊是透過 Google、Microsoft、Github、Apple 四個身分識別提供者進行註冊(identity provider,IdP),本身 Tailscale 不提供註冊,也因此沒有密碼儲存在 Tailscale 上。

使用這些 IdP,若要確保安全性,可另外開啟雙重驗證登入。

基本上是沒有人可以直接存取你的私人網路的。

註冊 Tailscale 帳號

登入後,由於沒有任何裝置,Tailscale 預設會提供下列不同的安裝方式,照著官方進行安裝與下載即可。這邊雖然只列出 Synology 有提供官方安裝包,不過也可以使用 Docker 進行安裝在其他 NAS 上。

下載 Tailscale

下載並安裝後,電腦右下角會出現 Tailscale 的圖示,右鍵選擇 Log in… 會跳出登入介面。登入後,點選 Connect 即可加入私人網路 (tailnet) 。

將裝置加入 tailnet

重複步驟,iOSAndroid 下載 Tailscale,登入後點選 Connect,裝置可能會要求加入 VPN,點選新增 VPN 後,也成功加入私人網路中。

可以於 Web GUI 中即時看到裝置的新增。

手機加入 tailnet

Linux 的部分也是一樣,只不過從 UI 介面改為命令列形式,根據官方 Linux 安裝教學,整體過程也是一致的。在登入過程中,系統會彈出一個網址,要求使用者在瀏覽器中輸入此網址進行登入。當使用者完成登入後,終端機將顯示 Success。

於 Linux 登入 tailnet

至此,安裝 Tailscale 並讓設備能夠互相連線也就完成了。此時可以於 cmd 中,輸入 tailscale status 或是 tailscale ping IP 來查看連線的狀態。

如果是 active; direct 表示走的是直連,ping通常在 10 − 15 ms;反之,如果是active; relay “xxx” 表示走的是 中繼伺服器,延遲約為 80 ~ 300 ms 附近。

走中繼伺服器的原因可能是防火牆阻擋了 UDP port,導致 tailscale 只能走中繼,但比起不能直接連線,至少提供了中繼伺服器的解決方案來解決直連無法連線的問題。

若要改善 ping 延遲,可檢查路由器相關設定或防火牆來達成直連:

  1. 例如開啟 UPnP 與 NAT-PMP (較不安全,但無腦自動設定好)。
  2. 修改防火牆設定,關閉 UPnP,並允許防火牆內部裝置使用UDP通訊,並指定通訊端口為 41641,目標端口則是任意(不同廠家路由器有不同設定)。
  3. Linux 中可能阻擋到端口,開啟終端機並輸入 sudo ufw allow 41641/udp 以開啟 UDP 端口。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
PS C:\Users\wells> tailscale ping nas
pong from nas (100.105.151.221) via 142.251.43.14:41642 in 12ms

PS C:\Users\wells> tailscale ping work
pong from work (100.122.114.19) via DERP(tok) in 190ms
pong from work (100.122.114.19) via DERP(tok) in 86ms
pong from work (100.122.114.19) via DERP(tok) in 88ms

PS C:\Users\wells> tailscale status
100.105.151.221  nas          wells@  windows active; direct 142.251.43.14:41642
100.122.114.19   work         wells@  linux   active; relay "tok"
100.206.21.12    server1      wells@  linux   idle, tx 22416 rx 28304
100.95.142.53    server2      wells@  linux   -
100.111.59.11    home-1       wells@  windows active; direct 142.251.43.14:41641, tx 10684092 rx 110457924
100.92.116.28    home-2       wells@  windows -
100.154.231.41   wells-iphone wells@  iOS     offline

最後,可以對著右下角的圖示右鍵 → Preferences → Run unattended 讓開機的時候自動連線 tailnet

開機自動連線 tailnet

裝置重新命名

Tailnet 內建 DNS 功能,此功能可以把 hostname 或是裝置名稱轉為 IP(當然你是 IP 愛好者的話記 IP 也是可以的🙃)。

對著右下角的圖示,進入到 Admin console

開啟 Admin console

裝置名稱預設是使用 hostname,若想要自訂裝置名稱,可以點選裝置右邊的 … 的按鈕,並重新命名裝置。

重新命名裝置

後續在裝置連線上,便可以直接透過裝置名稱進行連線

1
ssh wells@build-server

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=:公開子網域,例如 A 電腦有內網 192.168.1.50,B 電腦若想直接訪問 192.168.1.xx 的網段,可以設定此設置。

詳細的設定可以再參考官網詳細的說明。

結論

本身 Tailscale 的安裝上非常簡單。且防火牆、NAT 穿透等複雜事情都幫你處理好了。

註冊完後,每個裝置下載 tailscale,並登入帳號即可加入 tailnet。並實現裝置之間的互連。

每個裝置都有主機名稱,可以透過 Admin console 修改,或是查看各個裝置的狀態。

另外也可以將以加入 tailnet 的裝置進行子網域組網,並且在 tailnet 中廣播該網段。

甚至今天加入 tailnet 裡的裝置,還可以單獨分享該裝置節點(Sharing nodes)給其他帳號進行組網,實現更複雜的網路應用。

其他更進階的設定可以參照官方網站的說明獲取更進一步的原理與資料。

參考文獻

  1. 什麼是 VPN 協議?
  2. WireGuard: fast, modern, secure VPN tunnel
  3. ZeroTier Documentation - The Protocol
  4. How NAT traversal works
  5. How Tailscale works
  6. Tailscale CLI
  7. DNS in Tailscale
主題 Stack 由 Jimmy 設計