Tailscale WireGuard mesh · SSH dispatch · MCP-over-SSH · SS3 deferred
2026-06-22 13:44 TPE · Mac CLI 小克 2 (SS1) 實測更新 · cacoch-api 雙向 smoke passed
調查所有可行的 SS1↔SS2 雙向連接方案,涵蓋 skill、CLI、SDK、plugin、gateway、API 等層面。
| # | 方法 | 機制 | 優點 | 缺點 | 成本 | 狀態 |
|---|---|---|---|---|---|---|
| 1 | SSH CLI Wrappers | Shell scripts over Tailscale SSH | 零額外 infra、今天就能做、雙向檔案傳輸 | 需 per-command 包裝、無工具整合 | $0 | ✅ 部分已通 |
| 2 | MCP Server over SSH | claude mcp serve stdio over SSH |
便利:Claude session 可臨時掛遠端工具 | 工具面較寬;不作正式讀寫主幹 | $0 | ✅ 已連線 |
| 3 | Cloud UB Async | D1 + Vectorize BGE-M3 on SS3 (deferred) | 已運作、跨船共腦、WO追蹤;本輪不碰 | 非即時(async only) | $0 | ⏸️ 延後 |
| 4 | Tailscale Direct | Tailscale funnel / serve 暴露端口 | Public URL 無需 SSH、NAT穿透 | 暴露端口、需 ACL 調整 | $0 | ⚠️ 備案 |
| 5 | CF Tunnel Relay | Cloudflare Tunnel + Access 門控 | 有 Access 認證閘、不暴露 IP | 多一層延遲、兩端需 cloudflared | $0 | ⚠️ 備案 |
| 6 | SDK Programmatic | Claude SDK / Codex SDK 直接呼叫 | 最靈活、可程式化控制 | 複雜度高、需維護 client 程式 | API cost | ⚠️ 備案 |
Shell scripts 透過 Tailscale SSH 隧道執行遠端命令
ss2-shell.sh — 通用 SSH wrapperss2-codex-dispatch.sh — Codex 派工(支援 --full-auto)rsync — 雙向檔案同步ss1-shell.ps1 / ss1-claude-dispatch.ps1 — 反向派工已驗證
核心指令:
ssh -o BatchMode=yes -o ConnectTimeout=8 -i "$KEY" XYZ@100.122.123.107 "$CMD"
前置條件:Tailscale 連線、SSH ed25519 key 已交換
Claude Code 原生 MCP server 透過 SSH stdio 透傳
claude mcp serve 輸出 MCP 協議到 stdioss2-cc,健康檢查 connected
設定指令:
claude mcp add -s local ss2-cc -- ssh -o BatchMode=yes -i ~/.ssh/id_ed25519 XYZ@100.122.123.107 claude mcp serve
驗證:SS2 Claude Code 2.1.177 已安裝;ss2-cc ✔ Connected
SS3 上的團隊共腦 — D1 + Vectorize BGE-M3 混合搜尋
ingest_fragment 知識共享search_brain 跨船搜尋端點:ub.superportia.dev
角色:異步調度 + 團隊記憶 + session 交接
Tailscale funnel/serve 直接暴露本地服務為 public URL
tailscale serve 暴露 Tailnet 內部端口tailscale funnel 產生 public URL不推薦原因:暴露端口風險 > SSH 隧道;ACL 管理增加複雜度
Cloudflare Tunnel 代理 + CF Access 認證閘門
cacoch.superportia.dev tunnel不推薦原因:多一層 proxy 延遲;SSH 直連更快更簡單
使用 Claude SDK / Codex SDK 程式化呼叫遠端 agent
不推薦原因:複雜度高;SSH wrapper + MCP 已能涵蓋 95% 場景
今天就能做 · 最簡單直接 · 預估 30 min
ss2-shell.sh 已驗證ss2-codex-dispatch.sh 已驗證ss1-shell.ps1 已驗證ss1-claude-dispatch.ps1 已驗證rsync over Tailscale SSH能力:雙向 shell 命令 + 檔案傳輸 + AI agent 派工
新增主線提案 · 雙向讀寫控制面 · 不依賴 SS3
cacoch-agent 已能臨時啟動read / write能力:正式雙向讀寫 + 權限邊界 + 可審計 + 可固化成 skill
已連線 · 只作 Claude helper · 不作長期讀寫主幹
claude mcp serve 暴露為 MCP serverss2-cc ✔ Connected定位:便利工具,不取代 cacoch-api 的權限與審計層
設定:claude mcp add -s local ss2-cc -- ssh -o BatchMode=yes -i ~/.ssh/id_ed25519 XYZ@100.122.123.107 claude mcp serve
已運作 · 本輪延後 · 不碰 SS3
ingest_fragment 知識共享search_brain 跨船搜尋角色:異步調度 + 團隊記憶 + session 交接
小而明確 · 能力白名單 · 預設拒絕
GET /health:確認船隻在線、版本、角色、時間GET /identity:回傳 SS1/SS2 身分與可用能力POST /fs/list:列目錄,限定 allowlist rootsPOST /fs/read:讀檔,限制副檔名、大小、路徑POST /fs/write:寫檔,只允許 safe roots 與 atomic writePOST /notes/append:追加 Obsidian / SSoT 註記POST /jobs/submit:送白名單 job,不直接開任意 shellGET /jobs/:id:查 job 狀態與輸出摘要原則:API 能力要比 SSH/MCP 窄,才有資格成為正式主幹
雙向能讀寫,但不能無邊界讀寫
.env、SSH keys、hooks、agent config、production files 需 HITL目標:SS1↔SS2 互相讀寫都通,同時保留夏哥最後裁決權
Tailscale 是網路層,cacoch-api 是權限層
approval_required,不自行執行安全感來源:不是相信 agent 乖,而是讓 agent 沒有越權入口
| 層級 | 用途 | 狀態 | 為什麼保留 | 為什麼不當主幹 |
|---|---|---|---|---|
| SSH wrapper | bootstrap / rescue / deterministic command | ✅ 已驗證 | 最直接,出事時可救援 | 權限太大,不適合長期自動化裸奔 |
| cacoch-api | 正式雙向讀寫控制面 | ✅ 雙向 smoke passed | 權限窄、可審計、可 HITL、可固化 | 下一步需 token + daemon 固化 |
| MCP-over-SSH | Claude session helper | ✅ SS1→SS2 已連線 | 臨時操作很方便 | 工具面較寬,不適合作為系統安全邊界 |
| Cloud UB / SS3 | async memory / handoff | ⏸️ 本輪不碰 | 未來跨 session 很有價值 | 不是今天 SS1↔SS2 直通的必要條件 |
| 來源 | 目標 | 方法 | 指令 | 狀態 | HITL |
|---|---|---|---|---|---|
| SS1 | SS2 shell | SSH | ss2-shell.sh '...' | ✅ 已驗證 | ✅ 自主 |
| SS1 | SS2 Codex | SSH+CLI | ss2-codex-dispatch.sh '...' | ✅ 已驗證(quota 已恢復) | ✅ 自主 |
| SS2 | SS1 shell | SSH | ss1-shell.ps1 '...' | ✅ 已驗證 | ✅ 自主 |
| SS2 | SS1 Claude | SSH+CLI | ss1-claude-dispatch.ps1 '...' | ✅ 已驗證 | ✅ 自主 |
| SS1 | SS2 cacoch-api | HTTP over Tailscale | POST /fs/read / POST /fs/write | ✅ smoke passed 13:43 | ✅ 已授權測試 |
| SS2 | SS1 cacoch-api | HTTP over Tailscale | POST /fs/read / POST /fs/write | ✅ smoke passed 13:43 | ✅ 已授權測試 |
| SS1 | SS2 Claude helper | MCP-over-SSH | claude mcp add ss2-cc ... | ✅ 已連線 | ✅ 已授權 |
| SS2 | SS1 Claude helper | MCP-over-SSH | 反向同理 | ⏸️ 延後;不作讀寫主幹 | 🔒 首次設定 |
| Any | Any | Cloud UB | WO + mailbox + search_brain | ⏸️ 本輪不碰 SS3 | ✅ 自主 |
| SS1 | SS2 檔案 | rsync/scp | rsync -az ... XYZ@100.122.123.107:... | ✅ 可用 | ⚠️ 路徑限制 |
| SS2 | SS1 檔案 | rsync/scp | rsync -az ... xy2024air15@100.119.195.8:... | ✅ SSH key 已交換 | ✅ 自主 |
依據 L0 §3 HITL Boundary,跨船操作分為需確認與可自主兩類。圖示 + 文字標示(色弱友善)。
dispatch-scope-guard.sh 限定每次派工的檔案存取白/黑名單| ⚠️ 風險 | 影響 | 緩解措施 |
|---|---|---|
| SSH key 外洩 | 跨船存取失控 | Tailscale ACL 限制連線來源 + ed25519 key rotation |
| MCP scope creep | agent 越權讀寫遠端檔案 | dispatch-scope-guard.sh 白/黑名單 + CLAUDE_ALLOW_PATHS |
| 跨船 quota 消耗 | Claude Max 額度燒爆 | 同一 routing table,cheapest-first 路由 |
| 網路中斷 | SSH 連線失敗 | Cloud UB async fallback(L3 自動降級) |
| SS2 離線 | 無法 dispatch | Cloud UB mailbox 暫存,SS2 上線後接續 |
| 指令注入 | 惡意命令透過 SSH 執行 | wrapper script 參數驗證 + BatchMode 無互動 |
已完成 · SS2 Tailscale online + SSH key
ss1-shell.ps1(鏡像 ss2-shell.sh)ss1-claude-dispatch.ps1ss1-shell.ps1 "hostname && whoami && pwd"交付:雙向 shell + agent 派工 + 檔案同步
新增優先項 · SS1↔SS2 正式雙向讀寫
cacoch-agent:SS1 / SS2 各可啟動/fs/list、/fs/read、/fs/write交付:cacoch 自己的安全讀寫控制面,可固化成 agent skill
已連線 · 保留但降級 · 不作正式讀寫主幹
claude mcp add -s local ss2-ccclaude mcp get ss2-cc ✔ Connectedss1-claude-dispatch.ps1 覆蓋主要需求交付:Claude session 便利工具;正式權限邊界交給 cacoch-api
預估 2 hr · 前置:Phase 1+2 驗證通過
cacoch-crossover skillcacoch-selftest.shsoul.md §4 交接鏈交付:跨船能力成為 cacoch 底盤一部分