macOS 硬碟搬移與 Time Machine 還原後,Tailscale 兩台電腦互搶身分的排查與解法

macOS 硬碟搬移與 Time Machine 還原後,Tailscale 兩臺電腦互搶身分的排查與解法

本文已屏蔽隱私資訊。文中的設備名稱、Tailscale IP、帳號、登入網址皆以範例或遮罩表示。

背景

這次遇到的情境有點特殊,但其實很容易發生:

  1. 原本有一臺舊 MacBook Pro,裡面裝著 Tailscale。
  2. 後來把這臺 MacBook Pro 的 SSD 直接搬到另一臺 Mac mini 裡使用。
  3. 同時,原本的 MacBook Pro 又換了一顆新的 SSD。
  4. 新 SSD 的系統是透過 Time Machine 從原本環境還原回來的。
  5. 兩臺機器都沒有先在 Tailscale 登出或重設。

結果就是:兩臺 Mac 都帶著同一份 Tailscale 本機狀態與機器身分。

表面上看起來像是兩臺電腦互搶權限、互搶在線狀態,甚至會看到兩臺設備名稱一樣、Tailscale IP 也一樣。

例如後臺可能看到類似這樣的情況:

example-macbook-pro-2    100.xxx.xxx.xxx
example-macbook-pro-2    100.xxx.xxx.xxx

這不是單純的網路問題,而是「同一臺 Tailscale 裝置被複製成兩份」。

為什麼會發生?

Tailscale 不是只靠 macOS 的電腦名稱來識別設備。

它會在本機保存一組機器身分資料,例如 machine key、profile、登入狀態等。這些資料用來讓 Tailscale 後臺判斷:

  • 這是哪一臺設備
  • 它屬於哪個 tailnet
  • 它應該拿哪個 100.x Tailscale IP
  • 它是否已登入
  • 它有哪些 ACL 或設備權限

在一般情況下,每臺設備都應該有自己獨立的一份 machine key。

但這次因為 SSD 直接搬移,加上另一臺又用 Time Machine 還原,導致 Tailscale 的本機身分資料被複製到兩臺 Mac 上。於是 Tailscale 後臺看到的不是「兩臺不同的 Mac」,而像是「同一臺 Mac 在兩個地方登入」。

這就會造成:

  • 兩臺設備顯示相同名稱
  • 兩臺設備顯示相同 Tailscale IP
  • 一臺上線時另一臺狀態被覆蓋
  • 後臺設備列表看起來混亂
  • 重新登入後仍然回到同一個 IP

一開始怎麼發現問題?

最明顯的線索是 Tailscale 後臺看到兩臺設備顯示相同資訊。

例如:

example-macbook-pro-2    100.xxx.xxx.xxx
example-macbook-pro-2    100.xxx.xxx.xxx

正常情況下,兩臺不同 Mac 不應該共用同一個 Tailscale IP。

接著在本機查看 Tailscale 狀態,也可以看到這臺仍然使用舊的設備名稱與舊 IP:

100.xxx.xxx.xxx    example-macbook-pro-2    user@example    macOS

這時候可以初步判斷:問題不是 DNS、不是 VPN 權限、也不是網路不通,而是本機 Tailscale 身分沒有真正重生。

為什麼單純登出登入沒有用?

一開始嘗試過:

  • Tailscale 登出
  • 關閉 Tailscale
  • 刪除部分 /Library/Tailscale 狀態資料
  • 重新開啟 Tailscale
  • 再次登入

但結果仍然回到同一個 IP。

原因是:macOS 版 Tailscale 的 machine key 不只存在一般檔案裡,還可能存在 System Keychain。

這次真正的關鍵殘留項目是在:

/Library/Keychains/System.keychain

裡面可以看到類似這些 Tailscale 項目:

tailscale-machinekey
tailscale-profiles
tailscale-current-profile
tailscale-logdata

其中最重要的是:

tailscale-machinekey

只刪 /Library/Tailscale,但沒有刪 System Keychain 裡的 tailscale-machinekey,Tailscale 下次啟動時仍可能拿回舊身分。

這就是為什麼「登出登入」或「刪本機資料」看似成功,但登入後還是同一個 Tailscale IP。

實際排查流程

1. 檢查目前 Tailscale 狀態

/Applications/Tailscale.app/Contents/MacOS/Tailscale status

觀察重點:

  • 目前本機顯示的 Tailscale IP
  • 設備名稱
  • 後臺是否還有同名或同 IP 設備

2. 檢查 Tailscale 網路介面

ifconfig | grep -A4 -B2 '100\.'

如果看到本機仍拿到舊的 100.x IP,代表舊身分可能還在。

3. 檢查本機狀態資料

ls -la /Library/Tailscale

這裡會看到 Tailscale daemon 的本機資料與 log。

4. 檢查 System Keychain

security dump-keychain /Library/Keychains/System.keychain | grep -i tailscale

如果看到:

tailscale-machinekey
tailscale-profiles
tailscale-current-profile

代表 Tailscale 的本機身分仍可能被保存著。

最終解法

這次真正有效的解法是:

  1. 停止 Tailscale。
  2. 登出 Tailscale。
  3. 刪除 /Library/Tailscale
  4. 刪除 System Keychain 裡的舊 Tailscale 身分。
  5. 重新啟動 Tailscale。
  6. 使用新 hostname 重新登入。
  7. 到 Tailscale 後臺刪除舊設備。

1. 登出並停止 Tailscale

/Applications/Tailscale.app/Contents/MacOS/Tailscale logout

接著停止 Tailscale 相關程序與 daemon。這一步通常需要管理員權限。

sudo launchctl bootout system /Applications/Tailscale.app/Contents/Library/LaunchDaemons/io.tailscale.ipn.macsys.tssentineld.plist
sudo pkill -KILL -f '/Applications/Tailscale.app'
sudo pkill -KILL -f 'io.tailscale.ipn.macsys'

2. 刪除本機 Tailscale state

以下指令會刪除本機 Tailscale 狀態資料。執行前請確認路徑正確,並先完成必要備份。
sudo rm -rf /Library/Tailscale

也可以視情況清掉使用者層級的 Tailscale container/cache:

rm -rf ~/Library/Group\ Containers/W5364U7YZB.group.io.tailscale.ipn.macsys
rm -rf ~/Library/Containers/io.tailscale.ipn.macsys.login-item-helper
rm -rf ~/Library/Containers/io.tailscale.ipn.macsys.share-extension
rm -rf ~/Library/Caches/io.tailscale.ipn.macsys
rm -rf ~/Library/HTTPStorages/io.tailscale.ipn.macsys
rm -f ~/Library/Preferences/io.tailscale.ipn.macsys.plist

3. 刪除 System Keychain 裡的 Tailscale 身分

這是本次最關鍵的一步。

sudo security delete-generic-password -a tailscale-machinekey /Library/Keychains/System.keychain
sudo security delete-generic-password -a tailscale-current-profile /Library/Keychains/System.keychain
sudo security delete-generic-password -a tailscale-profiles /Library/Keychains/System.keychain

tailscale-logdata 不是主要身分資料,可刪可不刪。

4. 重啟 Tailscale daemon

sudo launchctl bootstrap system /Applications/Tailscale.app/Contents/Library/LaunchDaemons/io.tailscale.ipn.macsys.tssentineld.plist
open -a /Applications/Tailscale.app

5. 用新 hostname 重新登入

為了避免後臺又看到舊名字,可以用 --hostname 指定新設備名稱。

例如:

/Applications/Tailscale.app/Contents/MacOS/Tailscale up --reset --force-reauth --hostname=macbook-pro-2012

或如果這臺是 Mac mini:

/Applications/Tailscale.app/Contents/MacOS/Tailscale up --reset --force-reauth --hostname=mac-mini-2012

執行後會出現登入網址:

https://login.tailscale.com/a/xxxxxxxxxxxxx

打開網址並完成授權。

6. 到後臺刪除舊設備

最後到 Tailscale 後臺:

https://login.tailscale.com/admin/machines

刪掉舊的重複設備,例如:

old-macbook-name
old-macbook-name-2

重點是要確認:

  • 新設備有新的名稱
  • 新設備拿到新的 100.x IP
  • 舊設備不再在線
  • 兩臺 Mac 不再共用同一個 Tailscale IP

最後確認

重新登入後,再執行:

/Applications/Tailscale.app/Contents/MacOS/Tailscale status

正常結果應該是:

100.yyy.yyy.yyy    macbook-pro-2012    user@example    macOS

而不是舊的:

100.xxx.xxx.xxx    old-cloned-hostname    user@example    macOS

只要新設備拿到不同的 100.x IP,就代表 Tailscale 身分已經成功重生。

這次學到的事

如果你有以下操作:

  • 直接搬 Mac 的系統硬碟到另一臺 Mac
  • 使用 Time Machine 還原整臺系統
  • 複製 macOS 系統碟
  • 把同一份系統映像部署到多臺 Mac

那麼 Tailscale 很可能會把多臺設備看成同一臺。

預防方式是:

  1. 搬硬碟或還原前,先在原機 Tailscale 登出。
  2. 還原後第一件事,先重設 Tailscale 身分。
  3. 每臺設備使用不同 hostname。
  4. Tailscale 後臺刪掉舊設備,避免混淆。

最重要的是:macOS 版 Tailscale 的身分資料可能不只在 /Library/Tailscale,也可能在 /Library/Keychains/System.keychain

如果只刪檔案但沒刪 System Keychain 裡的 tailscale-machinekey,就可能永遠回到同一個舊 IP。

留言