今天早上想連 Proxmox,發現 Tailscale 完全沒回應。所有路徑都試過了:直連不行、透過 mt6000 Subnet Router 也不行。是首次遇到整個 tsnode 離線的情況。
第一反應是懷疑路由器,但很快排除了。mt6000 本身沒問題,Subnet Router 也運作正常——它只是個中繼,封包進來了還是得靠 PVE 自己的 default route 回應,而 PVE 的 default route 指錯地方,Tailscale keepalive 就這樣靜悄悄斷掉。
根因
往前追,幾天前曾經觸發過一次 5G fallback。IK512 切了進來,舊版 watchdog 看到 wwp10s0u1i3 上有 IP 就當作連線正常,但實際上 bearer 根本沒建立,ModemManager 回的是 NotOpened。主線路恢復後,watchdog 沒有判斷「現在 5G 是假連線」的能力,就這樣永遠卡在那條路由上。
IK512 的另一個坑:USB autosuspend
在整理 IK512 的過程中另外發現,它之所以偶爾會出現 NotOpened,根本原因是 USB hub autosuspend 把 modem 給掛起來了。解法很乾脆:在 GRUB 加上 usbcore.autosuspend=-1,全域關掉 USB 省電。
Watchdog v2:重寫
舊版邏輯只有一件事:interface 上有 IP → 連線正常。這在大多數情況夠用,但在 MBIM 模式下完全不可靠。
v2 改成直接查 bearer 狀態:
- 用
mmcli詢問 bearer 連線狀態,NotOpened就視為斷線 - 偵測到斷線後自動觸發 USB rebind,附帶 cooldown 機制避免短時間內反覆重綁,rebind 紀錄寫入
ik512-rebind.log - 切換後主動同步 IP,不依賴 interface 被動更新
- metric 管理確保主線路優先,5G 只在主線路真的掛掉時才上
- 主線路恢復後主動切回,不需要人工介入
管理通道強化:NISS 跳板
這次事件讓我意識到一件事:如果 tsnode 是直接跑在 PVE 宿主上,一旦宿主的網路出問題,管理通道就一起斷了。
解法是在 CT 106(NISS,10.0.0.172)裡另外裝一個 Tailscale,作為獨立的管理跳板。有一個細節要注意:CT 106 本身就在 mt6000 Subnet Router 的廣播範圍內,如果開了 accept-routes 會造成路由迴圈,所以只能用 point-to-point 模式,不開 subnet 廣播。Tailscale IP 規劃為 100.64.10.172,方便記憶。
往後就算 PVE 宿主的 Tailscale 再次掉線,至少還有 CT 106 這條路可以進來處理。