Tailscale HomeLab 設定筆記

13 min

上一篇講了我現在怎樣用 Tailscale 把 Mac mini、手機、工作機和 Oracle Cloud VM 接成一張私人網絡。這篇就從最基本的介面開始,一步步把裝置加進 tailnet,再整理命名、tag 和存取規則。

Tailscale 設定流程
Tailscale 設定流程

這篇要完成什麼

先假設你有這些裝置:

home-mac       家裏 Mac mini,主要開發機
phone          iPhone / Android 手機
work-laptop    外出或工作用電腦
oracle-jp      Oracle Cloud 日本免費 VM

設定完成後,你應該可以做到:

  • work-laptop SSH 到 home-mac
  • 用 VS Code Remote 連回 home-mac
  • 手機打開只在 tailnet 裏可見的 dashboard
  • 從任何 tailnet 裝置連到 Oracle Cloud VM
  • 家裏 router 和 Oracle Cloud 都不需要開 port
  • 不需要把所有 Internet 流量都丟進 VPN

我的建議順序是:先讓裝置出現在同一張 tailnet 裏,確認可以用名字互相找到;再用 tag 把 server 分類;最後才整理誰可以連誰。這樣一開始不會被權限設定卡住。

Step 1:建立你的 tailnet

先到 Tailscale 建立帳號。登入後,你會得到一個自己的 tailnet。

tailnet 可以先想成「只屬於你的一張私人網」。裝置加入後,不代表它們公開到 Internet,而是加入這張只有你能管理的 overlay network。

如果你用 Gmail 這類 public email,Tailscale 會進到 Personal plan。對個人 HomeLab 來說通常已經夠用,至少我這種幾台機器的配置很舒服。

登入後最常用的是 Machines 頁面。它就是你的裝置列表,之後 Mac、手機、VM、server 都會在這裏管理。

Step 2:安裝客戶端

先到 Tailscale Download 下載對應平台的客戶端。Mac、Windows、Linux、iOS、Android 都有官方版本;個人電腦和手機直接裝 app,登入同一個帳號就可以。

裝好後,打開 Tailscale admin console 的 Machines 頁面,把名稱改成你看得懂的名字,例如:

home-mac
work-laptop

Machines 頁面會列出每台裝置的名稱、tag、連線狀態、key expiry 狀態和版本資訊。第一日不用看懂所有欄位,先確認裝置有出現在列表裏,而且狀態是 connected 就可以。

Tailscale Machines 裝置列表
Tailscale Machines 裝置列表

這一步很值得做。因為 Tailscale 有 MagicDNS,裝置改名後,你就可以直接用名字連線,不用記 100.x.y.z 那種 tailnet IP。MagicDNS 可以先理解成 Tailscale 內建的私有 DNS:它讓 tailnet 裏的裝置用 machine name 互相存取,例如 home-mac

這裏先不用急著處理權限。第一步只是確認裝置有成功加入同一張 tailnet。

例如:

ssh your-user@home-mac
ping home-mac

如果你想再細看它怎樣處理 DNS,可以翻一下 MagicDNS 文件。但對 HomeLab 來說,先記住一件事就夠了:有了 MagicDNS,home-mac 這種名字會比 100.x.y.z 實用得多。

Step 3:加入 Linux server

Oracle Cloud VM、家裏的 Linux server、GPU server 這類機器,我會用 admin console 裏的 Linux server 安裝流程。

Machines → Add device → Linux server,介面會讓你先選這台 server 的偏好設定,然後幫你生成 install script。

Tailscale Add Linux server 產生 install script 介面
Tailscale Add Linux server 產生 install script 介面

幾個選項先這樣理解:

  • Tags:把這台機器標成某種 server 身份,例如 tag:cloud
  • Ephemeral:臨時機器下線後自動移除,長期 VM 通常不用開
  • Use as exit node:讓其他裝置把 Internet 流量從這台出去,這篇先不用開

跑完介面給你的 script 後,VM 就會出現在 Machines 裏。接著我會把它改名成 oracle-jp,之後連線和寫規則都清楚得多。

Step 4:用 tag 分類 server

個人電腦和手機可以綁在你的使用者帳號下面,但 server 我比較喜歡用 tag。

tag 可以先想成「機器身份」。例如:

tag 我會用在哪裏
tag:home-server 家裏長期在線的 Mac mini 或 server
tag:cloud Oracle Cloud VM 這類雲端機器
tag:jp-connector 之後專門拿來做日本出口或 connector 的機器

你可以在兩個地方處理 tag:

  • 加 Linux server 時,先在 Add Linux server 介面選好
  • 機器已經加入後,到 Machines 裏打開那台機器,修改 ACL tags
Tailscale 在 Machines 介面修改 ACL tags
Tailscale 在 Machines 介面修改 ACL tags

這裏有個小細節:tag 不只是顯示用標籤,它會影響這台機器的身份和權限。把 Oracle VM 設成 tag:cloud 之後,之後你寫「誰可以連 cloud server」就不用綁死某一台機器。

進階:如果介面要求先定義 tag owner

有些 tag 需要先在 Access controls 裏定義誰可以使用。這個設定叫 tagOwners

{
  "tagOwners": {
    "tag:home-server": ["autogroup:admin"],
    "tag:cloud": ["autogroup:admin"],
    "tag:jp-connector": ["autogroup:admin"]
  }
}

不用一開始就背 JSON。先知道它的意思就好:上面這段是在說「admin 可以把 home-servercloudjp-connector 這幾種 tag 掛到機器上」。

進階:如果你比較喜歡 CLI,也可以這樣加 tag
sudo tailscale up --advertise-tags=tag:cloud

Mac mini 如果你也想當 server 管,可以給它類似:

sudo tailscale up --advertise-tags=tag:home-server

實際上 Mac app 和 CLI 混用時要留意目前狀態,建議先看一下:

tailscale status
tailscale ip

如果只是個人用,不一定第一天就要把所有 tag 都設好。但我建議至少 cloud VM 和長期在線 server 要用 tag 管,之後寫 ACL 會清楚很多。

Step 5:設定誰可以連誰

這一步會用到 Access controls。你可以把它理解成「tailnet 裏的防火牆規則」:誰可以當來源、誰可以當目的地、可以連哪些 port,都在這裏處理。

如果你是第一次用,先用 Visual editor。它會讓你用介面選:

  • Source:誰要連出去,例如你的使用者、所有裝置、某個 tag
  • Destination:要連到哪裏,例如 tag:home-server
  • Port and protocol:允許哪些 port,例如 SSH 的 22
Tailscale Access controls visual editor
Tailscale Access controls visual editor

新增規則時,介面左邊是你要填的規則,右邊會即時顯示 JSON preview。這就是 Visual editor 和 JSON 的關係:你不是在學兩套東西,Visual editor 只是幫你用表單產生同一份 policy。剛開始看左邊就好,右邊留待之後想進階時再研究。

Tailscale Access controls Add rule 介面
Tailscale Access controls Add rule 介面

剛開始可以先讓自己的裝置互通,確認用途真的成立。等你用了一陣子,再把規則收緊。我的建議是先從這兩種規則開始想:

  • 自己的個人裝置可以連 home-mac 的 SSH
  • server 類裝置之間可以互相連需要的服務 port
進階:同一段規則在 JSON 裏大概長這樣
{
  "acls": [
    {
      "action": "accept",
      "src": ["autogroup:member"],
      "dst": ["tag:home-server:22"]
    },
    {
      "action": "accept",
      "src": ["tag:home-server", "tag:cloud"],
      "dst": ["tag:cloud:*"]
    }
  ]
}

這不是完整 production policy,只是示意。新手先理解三個欄位就好:src 是來源,dst 是目的地,冒號後面的數字是 port。

Step 6:穩定機器關掉 key expiry

Tailscale 預設會讓裝置 key 過期,這是安全設計。但對長期在線的 server 來說,如果某天 key 過期,機器突然需要重新登入,就會很尷尬。

所以我會在 admin console 裏,對這類機器關掉 key expiry:

  • home-mac
  • oracle-jp
  • 需要長期可被喚醒或連線的 server

手機和一般筆電就看情況,不一定要關。

這裏沒有什麼特別技巧,就是在 Machines 頁面裏找到裝置,關掉 expiry。記得這是信任決策:你關掉 expiry,就要更認真管理這台機器本身的安全更新和登入權限。

Step 7:決定要不要開 Tailscale SSH

如果你想少管理一點 SSH key,可以考慮 Tailscale SSH。簡單講,就是讓 Tailscale 接手 tailnet 裏 SSH 連線的登入和授權:誰可以 SSH 到哪台機器,不只靠 authorized_keys,也可以放到 Access controls 裏管理。

在支援的機器上可以這樣開:

sudo tailscale up --ssh

然後在 Access controls 裏允許誰可以 SSH 到哪裏。

進階:Tailscale SSH 的 JSON 規則示意
{
  "ssh": [
    {
      "action": "accept",
      "src": ["autogroup:member"],
      "dst": ["tag:home-server"],
      "users": ["autogroup:nonroot", "your-user"]
    }
  ]
}

如果你已經有自己的 SSH key 管理方式,也可以繼續用原本的 SSH。Tailscale 最重要的是先把網絡連通,SSH 認證要不要交給它,可以慢慢決定。

Step 8:用 VS Code Remote 連回 Mac mini

work-laptophome-mac 都在 tailnet 裏,而且 SSH 能通,就可以用 VS Code Remote SSH。

~/.ssh/config 可以加一段:

Host home-mac
  HostName home-mac
  User your-user

然後 VS Code 選 Remote-SSH: Connect to Host...,選 home-mac

這個體驗很像「我把 Mac mini 帶在身邊」,但實際上它還是在家裏跑。所有 node_modules、Docker、local DB、開發工具都留在 Mac mini,不用每台機器重裝一遍。

小建議

  • 不要第一天就把 Access controls 寫到很複雜,先讓網絡能用。
  • 不要忘記 Linux 系統防火牆,例如 ufwfirewalld。如果它們有開啟,就算 Tailscale 已經連上,服務的 port 也可能還是被本機防火牆擋住。

做到這裏,你的 HomeLab 已經從「一堆散落的機器」變成「一張可管理的私人網絡」了。

下一篇會講我最喜歡的進階玩法:不用把整台機器的 Internet 流量都丟進 VPN,而是用 Tailscale App Connector 讓 OpenAI / ChatGPT 相關流量走日本 Oracle Cloud VM。