macOS 硬碟搬移與 Time Machine 還原後,Tailscale 兩台電腦互搶身分的排查與解法
macOS 硬碟搬移與 Time Machine 還原後,Tailscale 兩臺電腦互搶身分的排查與解法
本文已屏蔽隱私資訊。文中的設備名稱、Tailscale IP、帳號、登入網址皆以範例或遮罩表示。
背景
這次遇到的情境有點特殊,但其實很容易發生:
- 原本有一臺舊 MacBook Pro,裡面裝著 Tailscale。
- 後來把這臺 MacBook Pro 的 SSD 直接搬到另一臺 Mac mini 裡使用。
- 同時,原本的 MacBook Pro 又換了一顆新的 SSD。
- 新 SSD 的系統是透過 Time Machine 從原本環境還原回來的。
- 兩臺機器都沒有先在 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 的本機身分仍可能被保存著。
最終解法
這次真正有效的解法是:
- 停止 Tailscale。
- 登出 Tailscale。
- 刪除
/Library/Tailscale。 - 刪除 System Keychain 裡的舊 Tailscale 身分。
- 重新啟動 Tailscale。
- 使用新 hostname 重新登入。
- 到 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 很可能會把多臺設備看成同一臺。
預防方式是:
- 搬硬碟或還原前,先在原機 Tailscale 登出。
- 還原後第一件事,先重設 Tailscale 身分。
- 每臺設備使用不同 hostname。
- Tailscale 後臺刪掉舊設備,避免混淆。
最重要的是:macOS 版 Tailscale 的身分資料可能不只在 /Library/Tailscale,也可能在 /Library/Keychains/System.keychain。
如果只刪檔案但沒刪 System Keychain 裡的 tailscale-machinekey,就可能永遠回到同一個舊 IP。
留言
張貼留言
歡迎留下您的心靈足跡👍