NAS 自架之旅:Tailscale 打通內網

4 min read

架設好 NAS 之後,一個常見的需求就是在外出時能夠方便地存取 NAS 上的資料或服務。以前,我是使用 Cloudflare 來打通內網,但我後來換用 Tailscale。因此,接下來我就來介紹如何使用 Tailscale 打通內網,並比較它與 Cloudflare 的差異。

為何選擇 Tailscale?

在討論如何使用 Tailscale 之前,先來看看為什麼我會從 Cloudflare 換成 Tailscale。兩者雖然都能提供遠端存取內網服務的功能,但它們的運作方式有很大的不同。

Cloudflare 的運作方式

Cloudflare 的 Zero Trust 解決方案提供的是一個全域的反向代理服務,假設我想將我的 Nextcloud 服務開放在網路上,首先需要在內網中能存取 Nextcloud 的機器上安裝 cloudflared,這個 cloudflared 會作為一個 reverse tunnel,讓我們可以通過 Cloudflare 的伺服器存取內網的 Nextcloud 服務,並統一在 Cloudflare 上管理存取權限。基本上是在網路層去切割環境,實現 ZTA (Zero Trust Architecture) 中不同資產的權限管理,這種模式通常我們叫做 ZTNA (Zero Trust Network Access),不過這是題外話。

Tailscale 的運作方式

Tailscale 是基於 WireGuard 的一個開源 P2P VPN 工具,不需要建立一個在外網的 VPN 伺服器。它透過 P2P 技術進行 NAT 打洞 (類似 WebRTC 的作法),可以讓兩個躲在 NAT 後面的設備相互連接,並通過 WireGuard 實現安全連線。

這種方式的好處是中間不需要像 Cloudflare 那樣的中間人。但是在首次連接前,還是需要交換 WireGuard 憑證,所以仍然需要一個外網的伺服器,我們叫做 Control Server,但他只參與最一開始的憑證交換以及權限控管的部分,實際的網路連線不需要 Control Server 的參與。如果不想使用官方的 Control Server,也可以使用開源版本的 Control Server 叫做 Headscale

想更深入了解 Tailscale 的運作方式,可以參考 Tailscale 的官方文章

Tailscale 的設定

以下是我的 Tailscale Docker Compose 設定檔

services:
  tailscale:
    image: tailscale/tailscale:stable
    container_name: tailscale
    restart: unless-stopped
    volumes:
      - /array/appdata/tailscale:/var/lib/tailscale
      - /dev/net/tun:/dev/net/tun
    cap_add:
      - NET_ADMIN
      - NET_RAW
    network_mode: "host"
    environment:
      - TS_AUTHKEY=...
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_EXTRA_ARGS=--advertise-routes=192.168.1.0/24

這裡需要先去 Tailscale 官網 註冊帳號並取得 AUTHKEY。在設定中,我加了 --advertise-routes=192.168.1.0/24,這樣可以分享整個內網網段。不需要為內網的每個設備都安裝代理程式,其它連上同一個 Tailscale 網路的設備也能存取該內網網段。

最後,Tailscale 也有手機的 APP 可以安裝,安裝後只需開啟手機上的 Tailscale VPN,在外出時就可以直接在手機上瀏覽裝在 NAS 上的服務,真方便!