遠端存取與完整用戶端
工作區 VM 位於某一台 Mac 上,但想要操作它的人並不一定坐在那台 Mac 前。Bromure Agentic Coding 可以被遠端存取,而且每一條遠端路徑都經由單一、可選、預設停用的 SSH 前門。啟用之後,你便有三種進入方式:使用者可以從任何終端機 ssh 進來並進入一個選單;你可以從命令列管理前門本身;而一個完整用戶端——另一台執行應用程式的 Mac,或 iOS / iPadOS 應用程式——可以連線並在一個即時視窗中 1:1 鏡像整個實例(它的格線、工作區、終端機與儀表板)。
完整用戶端以兩種方式連到伺服器。在同一個網路中,你直接以位址新增它。從其他任何地方,你登入一個 bromure.io 帳戶,並從目錄中挑選伺服器:兩台裝置由 bromure.io 相互引介,接著以點對點通訊,不需連接埠轉送、不需 VPN,也不需記住任何位址——而且一旦登入,你自己的裝置便會彼此授權,因此連線是免密碼的,不需手動設定金鑰。
本章涵蓋在主機上啟用遠端存取、每一種進入方式、完整用戶端如何 1:1 鏡像遠端(以位址以及經由 bromure.io)、存取遠端 VM 內的服務、將開發伺服器公開到網際網路,以及讓這一切保持安全的安全模型。機群規模的註冊與雲端遙測完全是另一套系統 — 請參閱企業版。完整的指令參考位於自動化與 CLI。
三種進入方式
以下所有內容都取決於 SSH 前門已啟用(預設為關閉)。一旦它開始執行,同一個伺服器便服務所有三種對象:
| 進入方式 | 使用者 | 你能取得什麼 |
|---|---|---|
| 純 SSH | 位於任何終端機前的使用者(ssh -p 2222 you@mac) | 遠端選單 — 一個 curses 風格的 TUI。永遠無法取得原始 shell。 |
bromure-cli remote CLI | 你,在主機本身上 | 管理前門:啟用/停用、金鑰、狀態。請參閱在主機上啟用遠端存取。 |
| 完整用戶端 | 另一台執行應用程式的 Mac,或 iOS / iPadOS 應用程式 | 遠端實例的即時 1:1 鏡像視窗,支援雙向編輯——在 LAN 上以位址接入,或從任何地方透過 bromure.io 帳戶接入。 |
該伺服器是內嵌的 — 它是內建於應用程式中的 Apple swift-nio-ssh 函式庫,而非 macOS 自己的 sshd。這個區別很重要:因為應用程式執行自己的伺服器,它可以透過 OpenDirectory 驗證你的 macOS 帳戶密碼,而你完全不需要在「系統設定」中啟用遠端登入,也不需要管理員權限。它只為啟動 bromure-cli 的那個確切 macOS 使用者接聽,並強制每一次互動式登入都進入遠端選單。唯一面向機器的例外是完整用戶端使用的四個白名單指令(bromure-fatclient/1 control、forward <ip> <port>、forward-udp <ip> 與 browser-mcp <vm>);使用者輸入的任何其他內容都會被當成登入處理,並進入選單。
附註: 遠端存取視窗將該伺服器描述為「應用程式自有的系統 SSH 伺服器實例」。更精確地說,它是一個內嵌的 swift-nio-ssh 伺服器,刻意不是 macOS 的
sshd— 這正是讓它能在不啟用遠端登入或管理員權限的情況下運作的原因。
在主機上啟用遠端存取
遠端存取在你開啟之前都是關閉的,而且可以用兩種等效方式管理:遠端存取視窗或 bromure-cli remote CLI。兩者寫入同一個位置,因此在其中一處所做的變更會反映在另一處,並即時生效。
遠端存取視窗
開啟 Bromure Agentic Coding(應用程式名稱選單)→ Remote Access…。視窗標題是遠端存取。一個綠色或灰色圓點顯示 sshd 執行中或 sshd 已停止;當伺服器運作時,一個 ssh -p <port> <user>@<host> 形式的可複製連線字串會出現在標題下方。
| 區塊 | 欄位 | 用途 | 預設值 |
|---|---|---|---|
| 標題 | 透過 SSH 啟用遠端存取 | 啟動與停止伺服器。 | 關閉 |
| 接聽器 | 繫結 IP | 要接聽的介面。0.0.0.0 = 每個介面;127.0.0.1 = 僅此 Mac。 | 0.0.0.0 |
| 接聽器 | 連接埠 | 接聽器 TCP 連接埠;必須 ≥ 1024(非 root 程序無法繫結特權連接埠)。 | 2222 |
| 驗證 | macOS 帳戶密碼 | 接受執行應用程式的使用者的 macOS 登入密碼(透過 OpenDirectory 驗證)。 | 開啟 |
| 驗證 | 公開金鑰 | 接受下方已授權金鑰清單中的金鑰。 | 開啟 |
| 伺服器主機金鑰 | 指紋 | 伺服器自己的 ed25519 主機金鑰指紋,供頻外驗證使用。在首次使用前顯示為**(於初次啟用時產生)**。 | — |
| 已授權公開金鑰 | 清單 | 已註冊的 ssh-ed25519 / ecdsa 公開金鑰。透過貼上金鑰行來新增;以垃圾桶圖示移除。清單為空時顯示尚未註冊任何金鑰。 | 空白 |
編輯繫結 IP 或連接埠並按下 Return 即可即時套用變更。驗證區塊註明**已針對 <user> 驗證 — 執行 bromure-cli 的使用者。**因此可清楚知道是誰的密碼解鎖了這扇門。
警告: 至少必須維持一種驗證方式啟用 — 你無法同時關閉密碼與公開金鑰驗證。貼上無效金鑰會被拒絕並顯示並非有效的公開金鑰。新增或移除已授權金鑰會重新啟動接聽器,這會中斷任何進行中的連線。
bromure-cli remote CLI
CLI 透過應用程式僅限擁有者的控制通訊端與執行中的應用程式溝通,因此應用程式仍是單一事實來源。這是在你透過既有 shell 存取的無頭 Mac 上啟用存取的最快方式。
| 指令 | 作用 |
|---|---|
bromure-cli remote(或 remote status) | 印出啟用/執行狀態、繫結與連接埠、驗證方式、主機金鑰指紋、登入使用者、現成的連線字串,以及編號的已授權金鑰清單。 |
bromure-cli remote enable [--port N] [--bind IP] [--password|--no-password] [--pubkey|--no-pubkey] | 啟動伺服器(必要時自動啟動應用程式代理程式)。預設值:連接埠 2222、繫結 0.0.0.0、兩種驗證方式皆開啟。 |
bromure-cli remote disable | 停止伺服器並保存關閉狀態。 |
bromure-cli remote key add <path-or-key-text> | 從檔案路徑或貼上的金鑰行註冊公開金鑰;印出其指紋。 |
bromure-cli remote key ls | 以 1 為起始索引列出已授權金鑰,含指紋與註解。 |
bromure-cli remote key rm <index|fingerprint> | 依索引或指紋子字串移除金鑰。 |
若你同時傳入 --no-password 與 --no-pubkey,remote enable 會拒絕執行;而在基底映像檔缺少或安裝中時它會回報錯誤。當應用程式未執行時,status、disable 與 key ls 會印出沒有正在執行的 bromure-cli 代理程式。
附註: 在基底映像檔缺少或仍在安裝時,伺服器不會啟動 — 此時啟用會傳回一個可據以處理的錯誤,而非無聲的無動作。這在啟動時與你切換開關時皆是如此。請先安裝或完成安裝基底映像檔。
主機金鑰、指紋與信任
在初次啟用時,伺服器會產生一個 ed25519 主機金鑰。其指紋 — 顯示於伺服器主機金鑰列,以及由 bromure-cli remote status 以 256 SHA256:… bromure-ac-remote (ED25519) 形式顯示 — 是連線用戶端用來確認自己連到正確 Mac 的依據。將此指紋交給連線者(或在完整用戶端的首次接觸工作表中自行核對),如此中間人便無法冒充主機。關於完整用戶端如何釘選它,請參閱初次使用即信任。
速率限制
密碼嘗試由權杖桶依來源 IP 節流:五次全速嘗試,接著約每兩秒補充一次,並將施加的延遲上限設為八秒。嘗試會被延遲,永不拒絕,且沒有人會被鎖定;一個吵雜的 IP 無法拖慢另一個。公開金鑰驗證從不節流。
透過純 SSH 登入
任何終端機都能以 ssh -p 2222 <user>@<mac> 存取主機。連線不會進入 shell,而是進入遠端選單 — 一個 curses 風格的 TUI(內部為 bromure-cli __remote-menu),強制加諸於每一次使用者登入之上。永遠無法透過它取得原始 shell。
該選單鏡像了應用程式:一個帶有即時狀態符號的統一工作區清單(● 執行中、◌ 開機中、⏸ 已暫停、○ 關閉),外加模型與追蹤區塊。從中你可以:
- 使用單一畫面表單建立工作區,並有一道**完整設定…**入口通往全部十四個組態窗格(一般、代理程式、本機模型、Fusion、資料夾、憑證、環境、MCP、追蹤、防護欄、供應鏈、提示注入、外觀、資源)。
- 啟動、暫停、終止、重新開機或刪除任何工作區。
- 編輯所有設定。 密鑰顯示為
•••• (set);將密鑰留空會保留已儲存的值。 - 管理工作樹 — 建立、合併、附掛終端機或捨棄 — 與 GUI 有相同的巢狀結構。
- 產生 SSH 金鑰、切換 Fusion 與模型路由,以及瀏覽追蹤摘要。
- 附掛至任何 tmux 分頁或執行中的 Docker 容器。
以方向鍵導覽,Enter 選取,q 或 Esc 返回;結束(中斷連線)會結束工作階段。選取附掛會將終端機交給客體的 tmux;Ctrl-b d 會脫離回到選單。當你處於附掛狀態時,一個疊加鍵組(預設 Ctrl-])會彈出一個主機端控制器 — 切換分頁、開新分頁、管理工作樹、切換 Fusion 或路由、編輯設定、重新開機、暫停或中斷連線 — 且該按鍵永遠不會傳到客體。附掛至容器時會提示輸入 shell(Enter = sh)。
附註: 該選單需要真正的終端機。在沒有 TTY 的情況下連線會印出提示,要你以
ssh -t重新連線。啟動一個冷的工作區在附掛前最多會等待約 20 秒以等候客體的 tmux 工作階段。若某工作區使用訂閱驗證,選單會提醒你在 VM 開機後於 VM 內執行該工具的登入(例如claude login)。
疊加鍵組可在主機 Mac(被連線的機器)上透過檔案 ~/Library/Application Support/BromureAC/remote/overlay-key 設定 — 接受的形式有 C-]、^]、0x1d 或 29 — 或透過 BROMURE_OVERLAY_KEY 環境變數設定。
使用完整用戶端鏡像遠端
完整用戶端將這台 Mac 上的 Bromure Agentic Coding 副本變成遠端副本的即時鏡像。你會得到一個完整視窗,它以你已熟悉的完全相同的側邊欄、格線與終端機檢視來呈現遠端 — 與下方所示的本機實例相同的版面配置 — 但標題為遠端 — <name>,而你所做的每一次編輯都在遠端執行並回傳。
連線
開啟工作區 → 連線至遠端 Bromure…(⇧⌘K)。視窗會概括這個選擇:「鏡像另一台執行 Bromure 的 Mac——它的格線、工作區、分頁與自動化。登入以從任何地方存取你的伺服器,或在你的 LAN 上直接以位址新增一個。」 兩條路徑都會抵達同一個鏡像視窗;它們的差異僅在於兩台 Mac 如何彼此尋找並授權。
以位址(同一網路)
當你知道 Mac 的位址且不需要 bromure.io 帳戶時,在 LAN 上使用這種方式。
- 在遠端 Mac 上,啟用遠端存取(遠端存取視窗或
bromure-cli remote enable)。 - 在這台 Mac 上,按一下 +,輸入名稱(例如
rack mini)、位址、連接埠(預設2222)與遠端使用者,然後按一下連線。已儲存的列會顯示user@address:port以及上次連線的時間。 - 在首次接觸時,一個工作表會顯示遠端的 SSH 主機金鑰指紋。將它與遠端的遠端存取視窗核對,然後按一下信任並繼續。此釘選會為這個端點記住;除非金鑰變更,否則之後的連線都是無聲的,在金鑰變更的情況下按鈕會變紅並顯示信任新金鑰並繼續 — 這可能是中間人。
- 用戶端會嘗試以這台 Mac 的專屬金鑰進行公開金鑰驗證。若這台 Mac 尚未被授權,它會退回為遠端使用者的 macOS 登入密碼(按鈕:登入);成功的密碼登入會透過通道在遠端註冊這台 Mac 的金鑰,因此之後每一次連線都免密碼。若要在完全不輸入密碼的情況下預先授權,請按一下顯示此 Mac 的金鑰,並在遠端執行
bromure-cli remote key add '<this Mac's key>'。
首次連線後,按兩下已儲存的伺服器即可一鍵重新連線;每一列的內容選單提供連線、編輯…與移除。
透過 bromure.io 帳戶(從任何地方)
登入 bromure.io 讓用戶端能夠跨網路存取你的伺服器——從咖啡廳 Wi-Fi 到家裡的 Mac——不需連接埠轉送、不需 VPN,也不需記住任何位址。bromure.io 只是引介這兩台 Mac,並在直接路徑不可能時中繼位元組;SSH 工作階段本身在兩台 Mac 之間始終保持端對端加密。
- 登入。 選擇視窗 → 註冊至 bromure.io…,輸入你的 bromure.io 帳戶提供的註冊碼(由你的管理員鑄造的六字詞組,或個人帳戶由網頁主控台鑄造)以及一個裝置名稱。你註冊的每一台裝置都共用同一個帳戶。
- 在遠端 Mac 上,啟用遠端存取。只有當某台伺服器的前門開啟且正在向 bromure.io 送出心跳時,它才會出現在目錄中。
- 在這台 Mac 上,開啟連線至遠端 Bromure…。你的伺服器會列在 我的伺服器 · bromure.io 下,帶有一個即時線上圓點與上次出現的時間。按兩下其中一個(或選取它並按一下連線)。狀態會顯示*「正在透過 bromure.io 連線至
<name>…」*,其間會建立一條點對點路徑——直連、路由器連接埠對應,或中繼——然後鏡像視窗開啟。
在這條路徑中,沒有要輸入的位址、沒有主機金鑰工作表,也沒有密碼:你自己的裝置透過你的帳戶彼此信任(見下方),而主機金鑰會自動釘選。
在你自己的裝置之間免密碼
一旦你登入,你註冊的每一台裝置都會透過你的帳戶共用其 SSH 身分,因此你的任何裝置都能抵達你的任何伺服器,不需密碼,也不需手動 bromure-cli remote key add:
- 每一台裝置在啟動時將其 SSH 公開金鑰發布到 bromure.io。你的每一台伺服器(遠端存取已開啟)會拉取你各裝置的金鑰,並在數秒內將它們安裝進自己的
authorized_keys——透過同一條裝置通道,因此你剛剛註冊的裝置幾乎立即被授權,不需以手複製金鑰。 - 伺服器也會發布它所執行的 macOS 登入帳戶,因此用戶端會自動以正確的使用者撥號連線(正是以位址路徑要求你填寫的那個欄位)。
- 金鑰僅限於你自己的裝置——即使在同一組織內,也絕不屬於其他使用者。
- 在某台裝置上登出會讓它退役:它的金鑰會從你的伺服器上移除,它也會從目錄中消失,因此重新登入絕不會留下過時的重複項目。閒置 90 天的裝置也會停止被授權,直到它下次回報。此外,你也可以從 bromure.io 的網頁主控台依需求登出你的任何裝置。
附註: 完整用戶端在你首次使用時會產生自己的專屬 ed25519 金鑰對(註解
bromure-ac-fatclient),儲存於遠端用戶端目錄下——這就是發布到你帳戶的那把金鑰。對於以位址連線,主機金鑰釘選屬於端點(address:port),而非使用者,因此編輯已儲存伺服器的位址或連接埠會捨棄該釘選並重新觸發指紋工作表;而 bromure.io 連線則改為透過帳戶釘選對端的金鑰。macOS 應用程式與 **iOS / iPadOS 應用程式(「Bromure Client」)**都使用這套帳戶模型——行動應用程式是一個純用戶端鏡像,以完全相同的方式接入(登入、挑選伺服器、連線)。以位址路徑僅限 macOS。
鏡像視窗
鏡像視窗會在成功連線後自動開啟。按一下工作區列可掛載其即時終端機(若執行中),或掛載其 VM 儀表板並顯示啟動 / 繼續(若關閉或已暫停);舞台會即時跟隨狀態轉換。分頁點按會樂觀地切換,並由下一次狀態輪詢確認。
其標題列工具列鏡像了本機的每 VM 藥丸,由左至右:網路通道切換(僅遠端視窗)、IP 藥丸、Fusion 閃電、瀏覽檔案(資料夾)、重新啟動 VM、編輯工作區(齒輪形)、彈出至獨立視窗、顯示或隱藏代理式瀏覽器(⌃⌘B)(地球)與顯示或隱藏儲存庫檔案(⌃⌘E)。Docker 儀表板從側邊欄開啟,與本機完全相同。
有幾項能力在鏡像上會有特殊行為:
- 編輯工作區會開啟與本機相同的設定檔編輯器,但背後是密鑰清空的讀取與保留密鑰的儲存(請參閱密鑰留在主機上)。產生新的 SSH 金鑰可運作並會向你顯示新的公開金鑰。
- 瀏覽檔案會開啟一個類似 Finder 的每 VM 視窗,標題為檔案 —
<workspace>(<host>),涵蓋客體檔案系統 — 家目錄加上最多八個共享資料夾 — 並可透過通道拖入與拖出傳輸。 - 重新啟動 VM會在本機詢問軟性或硬性,然後傳送該動作。
- 彈出會開啟一個額外的即時終端機視窗,若工作區停止則自動關閉。
在底層,鏡像每 0.75 秒透過 SSH 通道式控制通訊端橋接輪詢遠端的 /state 快照,並透過與本機視窗相同的檢視來呈現它。短控制呼叫在每主機一條 SSH ControlMaster 連線上多工;互動式終端機附掛刻意使用它們自己的專屬 SSH 連線,因為多工通道會緩衝終端機需要立即取得的自發輸出(tmux 重繪)。在 bromure.io 連線上,同一個橋接與終端機串流會走點對點 SSH 路徑(經由一個本機 loopback 墊片抵達),而鏡像的行為完全相同。
鏡像的內容與可遠端操作的功能
鏡像相當全面。它呈現每一個工作區及其即時執行狀態、所有分頁與工作樹(完全巢狀)、格線版面配置、自動化、關閉與已暫停工作區的 VM 儀表板、Docker 儀表板、生命徵象(CPU、記憶體、負載、磁碟、運作時間、IP、連接埠),以及即時互動式終端機。編輯是雙向的,並在下一次輪詢時於每一個已連線用戶端上收斂:啟動/停止/暫停/重新開機、分頁操作、格線編輯(整體版面配置、最後寫入者優先)、自動化編輯、Fusion 切換、Docker 動作、設定儲存與檔案傳輸。
有幾項操作在此版本中無法從完整用戶端執行:
- 由提示驅動的工作樹操作 — 建立新工作樹、合併、解決衝突或播種自動化 — 在 v1 中未遠端化。請在主機自己的 GUI 上,或透過遠端選單(它確實支援建立、合併與解決)執行這些操作。鏡像仍會顯示每一個工作樹,且移除與附掛終端機可遠端運作。
- 格線版面配置編輯需要遠端上開啟一個 GUI 視窗。一個完全無頭的遠端(應用程式執行中、無統一視窗)會鏡像其他所有內容,但無法接受版面配置變更。
- 僅限主機端的能力 — 從檔案匯入 SSH 金鑰以及訂閱註冊 — 在遠端設定編輯器中會被隱藏。
待處理的決策提示
有些你在遠端發起的動作會在遠端引發一個決策 — 家目錄儲存升級、基底映像檔漂移重設,或遭入侵 VM 清除。這些會在 /state 快照中以待處理提示形式浮現,並在你的鏡像視窗中顯示為本機警示;你的回答會透過通道回傳。若某提示未獲回應,它會逾時為安全、非破壞性的選項。執行中代理程式可能觸發的 MITM 同意提示(憑證使用、供應鏈透通、防護欄寫入、提示注入)由一條獨立、客體無法偽造的路徑處理,記載於遠端同意處理。
密鑰留在主機上
密鑰永不越過連線。當完整用戶端讀取遠端設定檔以填入編輯器時,每一個密鑰欄位都以清空狀態抵達。儲存時,空白欄位代表「保留已儲存的值」,而輸入的欄位則會取代它。API 金鑰、權杖與 MCP 環境密鑰都留在遠端 Mac 上。完整用戶端一旦配對後便僅以 SSH 金鑰驗證 — 鏡像期間沒有密碼提示。
存取遠端 VM 上的服務
遠端工作區的開發伺服器位於遠端網路上的一個私有位址,例如 http://192.168.64.5:3000。Bromure 為你提供兩層存取它的方式 — 一層是自動且限於瀏覽器範圍,另一層是選擇加入且系統範圍。
瀏覽器窗格(自動、限 PAC 範圍)
鏡像視窗可收合的右側瀏覽器窗格(地球工具列按鈕,或 ⌃⌘B)是一個本機 Chromium VM,其對遠端工作區子網路的頁面流量透過 SSH 通道傳送。一個產生的 PAC(proxy auto-config)指令碼僅將遠端子網路透過每主機 SOCKS 轉送器路由,其餘一律 DIRECT,而目的地在遠端側解析 — 因此導覽至遠端開發伺服器的字面 http://192.168.64.x:port 便可直接運作。遠端代理程式自己的瀏覽器控制 MCP 串流會被轉送至此窗格,因此遠端編碼代理程式驅動的正是你正在看的瀏覽器。
選取一個執行中的遠端工作區並按下 ⌃⌘B。在第一個 /state 快照送達遠端的子網路且 SOCKS 轉送器啟動之前,此窗格不會有任何動作(在那之前一行記錄會註明 "tunnel not ready")。它的本機瀏覽器 VM 被釘選至子網路 192.168.127.0/24(閘道 192.168.127.1),因此它永遠不會與工作區子網路衝突。持久性瀏覽器設定檔存於這台 Mac 上,以遠端工作區 ID 為鍵。
附註: 瀏覽器窗格要求這台 Mac 為 Apple Silicon 且本機已安裝瀏覽器基底映像檔。SOCKS 轉送器繫結
0.0.0.0(讓瀏覽器 VM 能在 vmnet 閘道存取它),但僅接受來自 loopback 與釘選的192.168.127.x瀏覽器子網路的連線 — 它絕不是開放中繼。
SOCKS 轉送與固定連接埠轉送
每一個已連線的遠端主機都會自動取得一個位於臨時連接埠、繫結 0.0.0.0(依對等端過濾為 loopback 與 192.168.127.x 瀏覽器子網路)的本機 SOCKS5 轉送器。每一次 CONNECT 會開啟一個 forward <ip> <port> SSH 通道,遠端會將其橋接 — 經由客體位於 vsock 5010 的常駐 loopback 中繼 — 至該客體自己的 127.0.0.1:<port>。因此從這台 Mac,curl --socks5 127.0.0.1:<port> http://192.168.64.5:3000 會逐位元組地抵達遠端客體。
固定轉送有隱藏的 CLI 管線:bromure-cli __forward <hostID> <localPort> <remoteIP> <remotePort> 用於 ssh -L 風格的轉送,而 bromure-cli __forward-socks <hostID> <localPort> 用於獨立的 SOCKS 代理伺服器。兩者預設都繫結 loopback,並接受 --bind-all。
警告: 遠端會拒絕任何目標不是其自身 vmnet 子網路上客體的轉送。你無法使用轉送來存取遠端 Mac 本身、其閘道或網際網路 — 只能存取工作區 VM。
系統範圍網路通道
當你想讓任何本機應用程式 — 而不只是瀏覽器窗格 — 以其字面位址存取遠端 VM 時,請以鏡像工具列的網路切換(三角形路徑圖示,工具列中的第一個)啟用每主機通道。它的工具提示顯示啟用對遠端 VM 的直接網路存取(讓任何本機應用程式存取 192.168.x.x)。
一個一次性的特權輔助程式 — 透過 SMAppService 安裝的 launchd 常駐程式,不需 sudo — 會建立一個 utun 介面並將遠端子網路路由至它,然後將該介面的檔案描述符交回給應用程式。應用程式中的一個使用者空間 TCP/UDP 堆疊會終止每一條流,並使用你的 SSH 身分將其接合至相同的 SSH 轉送通道上。沒有 pf 規則,也沒有核心轉送。
你首次啟用它時,一個標題為允許 Bromure 的網路輔助程式的警示會說明這一次性的 macOS 核准:
- 按一下工具列切換。
- 在警示中,開啟系統設定 → 一般 → 登入項目並允許 Bromure Agentic Coding(macOS 會要求一次管理員憑證)。
- 應用程式會輪詢核准(每 2 秒一次,最多 5 分鐘),並在它到位的那一刻自動連線。等待期間,切換的工具提示顯示正在等待系統設定 › 登入項目中的核准…。
當通道啟用時,工具提示顯示對遠端 VM 的直接網路存取已開啟 — 按一下即可關閉;若失敗,則顯示網路通道失敗 — 按一下即可重試。切換為關閉會停止通道,而當最後一個主機停用它時該常駐程式會被取消註冊。此設定會依主機記住。
附註: 此通道需要管理員帳戶進行一次性核准。若沒有,Bromure 會繼續透過內建的 SOCKS 路徑運作 — 只有在需要從其他應用程式存取遠端 VM 時才需要此輔助程式。若 macOS 直接拒絕註冊,一個標題為無法安裝網路輔助程式的警示會加以說明,而切換會在下次點按時重試。對遠端客體的
ping會由通道在本機回應:它確認的是路由已建立,而非客體存活。
多個遠端(各安裝專屬子網路與機群路由)
你可以同時鏡像多個遠端;每一個都會開啟自己的視窗、SOCKS 轉送器,以及(選擇性的)通道。這過去會踩到的陷阱:每一個安裝歷來都對其工作區 VM 使用相同的 192.168.64.0/24 網路,因此兩個被鏡像的遠端會通告相同的子網路,系統範圍的 VPN 無法區分它們。
各安裝專屬子網路從源頭修正了這一點。每一台 Mac 現在會在 172.16.0.0/12 內挑選一個隨機的 /24 — 略過 Docker 的 172.17–172.20 範圍以及主機已在使用的任何 /24 — 並將它用於其所有工作區 VM,因此兩個獨立的安裝幾乎永不衝突(172.16/12 也是最不可能與企業區域網路或 VPN 衝突的私有範圍)。在更新後首次啟動時,Bromure 會提議將這台 Mac 遷移至私有子網路 — 立即遷移、稍後或不再詢問 — 而你可以隨時在設定 → 資源 → 工作區子網路下變更或重新隨機化它。客體定址是來自 Bromure 自己交換器的純 DHCP,因此這完全在主機端進行(無須重建映像檔),且遠端會在 /state 中通告其選定的子網路,因此完整用戶端與通道會自動跟隨它。
在極少數兩個遠端仍然共用同一子網路的情況下,第一個會被字面路由,第二個會被賦予一個 100.64.<n>.0/24 CGNAT 空間別名,並以 1:1 保留主機八位元組的重新映射,讓兩者都能同時被存取。
警告: 多主機別名路由已實作並經單元測試,但跨主機縫合具別名意識的 PAC 與 browser-MCP 重新映射的執行時期接線仍在待辦中。單一遠端主機是目前完全支援的組態。 別名一旦接線後的一個已知限制是,具別名遠端內某個發出絕對字面
http://192.168.64.x連結的開發頁面可能會誤路由;字面(非別名)遠端不受影響。
將開發伺服器公開到網際網路
與上述所有內容分開,工作區內執行的個別 HTTP 服務可以透過每連接埠的 Cloudflare 快速通道公開到公開網際網路。開啟一個執行中工作區的儀表板,在連接埠卡片下找到該服務,然後按一下地球(工具提示:公開到網際網路(Cloudflare 快速通道))。Bromure 會為該來源執行一個 cloudflared 程序,並給你一個隨機的 https://<name>.trycloudflare.com URL — 不需 Cloudflare 帳戶。每個服務一個通道與一個 URL;公開或取消公開其中一個絕不會干擾其他服務。
地球的顏色追蹤狀態:灰色 = 關閉,橙色 = 安裝或啟動中,綠色 = 執行中,紅色 = 失敗。連接埠下方的狀態列會顯示進度(正在下載並驗證 cloudflared(~18 MB,一次性)…,然後正在啟動通道…),或顯示可點按的公開主機名稱與一個複製按鈕。
你首次公開任何內容時,一個標題為**透過 Cloudflare Tunnel 將服務公開到網際網路?**的一次性同意對話框會涵蓋下載、驗證、Cloudflare 的服務條款,以及任何擁有該隨機 URL 的人都能存取該服務這一事實。再次按一下地球即可停止。
cloudflared 二進位檔是一個釘選的發行版,在執行前會驗證兩次:已下載封存檔的 SHA-256 會與烘焙進應用程式的雜湊值核對,而一個 Developer ID 程式碼簽章檢查會確認 Cloudflare 的團隊 ID。每一個步驟都記錄在供應鏈記錄中(請參閱供應鏈防護)。它以 --no-autoupdate 執行。
警告: 快速通道 URL 對任何擁有它的人都是公開的,而且主機名稱會在通道每次重新啟動時(重新開機、取消公開/重新公開,或當機)輪替。只有 HTTP(S) 來源才會有地球 — SSH 與眾所周知的原始 TCP 或資料庫連接埠(22、1433、3306、3389、5432、5672、5900、6379、9092、11211、27017)以及 UDP 永遠不會有,因為瀏覽器無法透過 Cloudflare 的邊緣存取它們。工作區的所有通道都會在其 VM 暫停或關閉時拆除。下載時的雜湊不符會拒絕安裝,直到該釘選在某個應用程式發行版中更新為止。
OAuth 回呼轉送
在工作區 VM 內部執行的 CLI — gh、gcloud、訂閱登入 — 通常會透過在你的主機 Mac 上開啟瀏覽器並等待重新導向至 http://127.0.0.1:<port>/callback 來完成 OAuth 流程。Bromure 會自動橋接它:主機在 IPv4 與 IPv6 上繫結 loopback 連接埠,並在首次真正的請求時將其經由 vsock 5010 接合至客體自己的 127.0.0.1:<port>。redirect_uri 從不被改寫,因此 PKCE 與重新導向驗證仍然通過。沒有任何需要設定的內容 — 在工作區內啟動登入,重新導向便會送入客體。
轉送器在 300 秒後自行拆除,因此 loopback 連接埠絕不會被無限期佔用。若主機連接埠已被使用,該流程會在無橋接的情況下原生進行,而推測性的瀏覽器預先連線(開啟但從不傳送的通訊端)會被忽略,因此它們無法卡住一次性的回呼伺服器。
安全模型
遠端存取威力強大,因此值得精確說明它的邊界。
- 預設關閉,單一入口。 在你啟用 SSH 伺服器之前不存在任何遠端路徑。每一條路徑 — 使用者選單、CLI、完整用戶端、連接埠轉送、瀏覽器 MCP — 都經由那一個伺服器,別無其他。
- 加密與傳輸。 所有流量都是 SSH。完整用戶端的控制輪詢、終端機附掛、檔案傳輸、連接埠轉送與瀏覽器 MCP 中繼全都在 SSH 連線內傳輸。因為 swift-nio-ssh 沒有後量子金鑰交換,現代的 OpenSSH 用戶端會印出 "not using a post-quantum key exchange" 警告;這是預期的,並不表示降級攻擊。
- bromure.io 是引介方,而非中間人。 在帳戶路徑中,bromure.io 只引介你的兩台裝置,並在無法建立任何直接點對點路徑時,透過一個 TURN 中繼(在 TLS 上)轉送不透明的位元組。它從不終止 SSH 工作階段:加密通道在你的兩台 Mac 之間端對端執行。SSH 金鑰只在你自己帳戶的裝置之間共用(絕不與其他使用者共用),每一台伺服器自行拉取其擁有者的裝置金鑰,而註冊/登出正是授予與撤銷某台裝置信任的方式。已登出或閒置 90 天的裝置會停止被授權。
- 誰可以登入。 只有啟動應用程式的那個確切 macOS 使用者。密碼驗證對 OpenDirectory 進行驗證(無遠端登入、無 PAM 變更、無管理員權限),而公開金鑰驗證只接受你已註冊的金鑰。密碼嘗試依來源 IP 限速;金鑰則否。
- 工作階段能做什麼。 使用者登入只能存取遠端選單 — 永遠不是 shell — 因此它可以建立、設定與驅動工作區,但無法執行任意的主機指令。完整用戶端的四個機器動作同樣狹窄:一個控制通訊端橋接、一個對 vmnet 子網路上客體的轉送,以及一個瀏覽器 MCP 中繼。對主機本身、閘道或網際網路的轉送都會被拒絕。
- 密鑰永不離開主機。 遠端設定檔讀取會清空密鑰,而儲存會保留密鑰;API 金鑰、權杖與 MCP 環境密鑰都留在遠端 Mac 上。
- 初次使用即信任。 完整用戶端在首次接觸時依端點釘選遠端的主機金鑰,並在之後任何變更時大聲警告。
- 客體無法偽造的同意。 執行中代理程式引發的 MITM 同意提示,會在終端機幫浦的主機側呈現,遭入侵的客體既看不到也無法偽造它們;任何逾時或脫離都解析為拒絕。請參閱遠端同意處理。
疑難排解
| 症狀 | 可能原因 | 該怎麼做 |
|---|---|---|
| 啟用時傳回錯誤 | 基底映像檔缺少或仍在安裝 | 在基底映像檔就緒之前伺服器無法啟動。完成安裝,然後再次啟用。 |
ssh 連上但要求以 ssh -t 重新連線 | 未要求 TTY | 遠端選單需要終端機;加上 -t(或使用 ssh -t -p 2222 <user>@<mac>)。 |
| OpenSSH 印出 "not using a post-quantum key exchange" | swift-nio-ssh 沒有 PQ 金鑰交換 | 預期且無害 — 連線仍然加密。 |
| 以位址連線一直要求密碼 | 這台 Mac 的金鑰未在遠端註冊 | 讓一次密碼登入自動註冊它,或在遠端執行 bromure-cli remote key add '<this Mac's key>'(顯示此 Mac 的金鑰可複製它)。 |
| bromure.io 連線仍要求密碼 | 金鑰註冊表尚未在該伺服器上授權此裝置 | 這裡免密碼是自動的——確認你在兩台 Mac 上都已登入 bromure.io、伺服器已開啟遠端存取,且兩者都在執行目前的組建(伺服器會發布其登入帳戶並拉取你的金鑰)。啟用遠端存取後請等待幾秒。 |
| 我的伺服器 · bromure.io 為空 | 未登入,或伺服器未在通告 | 登入(視窗 → 註冊至 bromure.io…);在遠端啟用遠端存取,使其送出心跳並出現。灰階的列代表它已停止送出心跳。 |
| 「無法透過 bromure.io 建立連線……」 | 兩台 Mac 之間沒有直接或中繼的網路路徑 | 確認兩者都能抵達 bromure.io;中繼需要 turns:5349 可達。再試一次——下次嘗試會重試一條路徑。 |
| 「已透過 bromure.io 抵達……,但其 SSH 前門未回應」 | 遠端上的遠端存取被關閉了 | 在遠端 Mac 上重新啟用遠端存取。 |
| 「這台 Mac 的 bromure.io 裝置已被撤銷。請重新登入。」 | 此裝置已被登出/撤銷(由你、網頁主控台,或閒置 90 天) | 重新註冊:視窗 → 註冊至 bromure.io…。 |
| 紅色的信任新金鑰並繼續工作表 | 遠端的主機金鑰自釘選以來已變更 | 頻外驗證;只有在你知道金鑰為何變更(重新安裝、新 Mac)時才繼續 — 否則它可能是中間人。 |
| 編輯金鑰後進行中的連線中斷 | 新增或移除已授權金鑰會重新啟動接聽器 | 預期行為;重新連線。 |
| 瀏覽器窗格維持空白 | SOCKS 轉送器或子網路尚未就緒 | 等待第一次 /state 輪詢;確認工作區正在執行且這台 Mac 已安裝瀏覽器映像檔。 |
| 轉送被拒絕 | 目標不是遠端 vmnet 子網路上的客體 | 轉送只能存取工作區 VM,永遠無法存取主機、閘道或網際網路。 |
| 通道切換卡在正在等待核准… | 特權輔助程式尚未獲核准 | 在系統設定 → 一般 → 登入項目中核准 Bromure Agentic Coding(需要管理員)。若沒有,SOCKS 仍可運作。 |
| 格線版面配置編輯在遠端無效 | 遠端是無頭的 | 格線編輯需要遠端上開啟一個 GUI 視窗;其他所有內容仍會鏡像。 |
檔案、連接埠與環境變數
伺服器端狀態位於 ~/Library/Application Support/BromureAC/remote/ 下:hostkey_ed25519(0600)及其 .pub、authorized_keys(0600),以及選用的 overlay-key 覆寫。完整用戶端的身分與狀態位於 ~/Library/Application Support/BromureAC/remote-client/ 下:id_ed25519(.pub)(註解 bromure-ac-fatclient)、known_hosts(TOFU 釘選)、hosts.json(已儲存的伺服器),以及位於 hosts/<host-UUID>/ 下的每主機鏡像持久性。整個支援目錄會在 CFFIXED_USER_HOME 下重新定位。
| 連接埠/介面 | 角色 |
|---|---|
TCP 2222(可設定,≥ 1024) | 內嵌 SSH 伺服器,預設繫結 0.0.0.0。 |
對外 TCP 443 + turns:5349 | 僅 bromure.io 帳戶路徑。 抵達你的帳戶(裝置目錄、會合),以及在無法建立任何直接點對點路徑時的 TURN 中繼(在 TLS 上)。對於帳戶路徑,兩者都必須能從每一台裝置抵達;與以位址路徑無關。 |
| 客體 vsock 5010 | 每一個 VM 中的常駐 loopback 中繼 — 連接埠轉送與 OAuth 回呼傳遞的路徑。 |
| 客體 vsock 5830 | 工作區代理程式的瀏覽器 MCP 串流,中繼至完整用戶端的瀏覽器窗格。 |
臨時連接埠,繫結 0.0.0.0 | 每主機 SOCKS5 轉送器(依對等端過濾為 loopback 與 192.168.127.x 瀏覽器子網路)。 |
192.168.127.0/24 | 完整用戶端釘選的本機瀏覽器 VM 子網路。 |
100.64.<n>.0/24 | 在機群子網路衝突時指派的 CGNAT 別名子網路。 |
相關的 UserDefaults 鍵(網域 io.bromure.agentic-coding)為 remoteAccess.enabled、remoteAccess.port、remoteAccess.bindAddress、remoteAccess.passwordAuth、remoteAccess.pubkeyAuth、fatclient.tunnel.<host-UUID> 與 cloudflareTunnel.consented。診斷用環境變數包括 BROMURE_OVERLAY_KEY(遠端選單鍵組)、BROMURE_FATCLIENT_LOG(詳細的完整用戶端記錄)與 BROMURE_FATCLIENT_UTUN(強制啟用系統範圍通道的選擇加入 — 工具列切換才是產品路徑)。完整的 CLI 參考,包括隱藏的 __forward、__forward-socks、__dial 與 __attach-window 管線,位於自動化與 CLI。