远程访问与富客户端

工作区虚拟机运行在某一台 Mac 上,但想要驾驭它的人并不总是坐在那台 Mac 前。Bromure Agentic Coding 可以远程访问,而每一条远程路径都经由同一扇可选的、默认禁用的 SSH 前门。开启它后,你会得到三种接入方式:任何人都可以从任意终端 ssh 登录并进入一个菜单;你可以从命令行管理这扇前门本身;还有一个富客户端——另一台运行本应用的 Mac,或 iOS / iPadOS 应用——可以连接并在一个实时窗口中 1:1 镜像整个实例(它的网格、工作区、终端与仪表板)。

富客户端有两种方式连到服务器。在同一网络中,你直接按地址添加它。从其他任何地方,你登录一个 bromure.io 账户,并从目录中挑选服务器:两台设备由 bromure.io 相互引荐,随后以点对点通信,无需端口转发、无需 VPN、也无需记住任何地址——而且一旦登录,你自己的设备便会彼此授权,因此连接是免密码的,无需手动配置密钥。

本章介绍如何在宿主机上启用远程访问、各个入口、富客户端如何 1:1 镜像远程主机(按地址以及经由 bromure.io)、如何访问远程虚拟机内部的服务、如何将开发服务器暴露到互联网,以及保障这一切安全的安全模型。设备群规模的注册与云端遥测完全是另一套系统——参见企业版。完整的命令参考见自动化与 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 controlforward <ip> <port>forward-udp <ip>browser-mcp <vm>);人类输入的其他任何内容都会被当作登录处理并落入菜单。

注意: 远程访问窗口将该服务器描述为“应用自有的系统 SSH 服务器实例”。更准确地说,它是一个嵌入式 swift-nio-ssh 服务器,刻意不是 macOS 的 sshd——正是这一点让它无需远程登录或管理员权限即可工作。

在宿主机上启用远程访问

远程访问在你开启之前始终处于关闭状态,并且可以通过两种等价方式管理:远程访问窗口或 bromure-cli remote CLI。两者写入同一处,因此在其中一处所做的更改会反映到另一处,并实时生效。

远程访问窗口

打开 Bromure Agentic Coding(应用名菜单)→ 远程访问…。窗口标题为远程访问。一个绿色或灰色圆点显示 sshd runningsshd stopped;当服务器运行时,标题下方会出现一个可复制的连接字符串,形如 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端口后按回车键使更改实时生效。认证区域标注根据 <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-pubkeyremote enable 会拒绝执行;在基础镜像缺失或正在安装时它也会报错。当应用未运行时,statusdisablekey 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 容器。

使用方向键导航,回车键选择,q 或 Esc 返回;退出(断开连接)结束会话。选择附加会将终端交给客户机的 tmux;Ctrl-b d 分离回菜单。在附加期间,一个覆盖层组合键(默认 Ctrl-])会弹出一个宿主机侧控制器——切换标签页、打开新标签页、管理工作树、切换 Fusion 或路由、编辑设置、重启、挂起或断开连接——而该按键从不会传到客户机。附加到容器时会提示输入 shell(回车 = sh)。

注意: 该菜单需要一个真正的终端。在没有 TTY 的情况下连接会打印提示,让你用 ssh -t 重新连接。启动一个冷工作区时,会等待客户机的 tmux 会话最多约 20 秒后再附加。如果某个工作区使用订阅认证,菜单会提醒你在虚拟机启动后在其内部运行该工具的登录命令(例如 claude login)。

覆盖层组合键可在被连接的宿主机 Mac 上通过文件 ~/Library/Application Support/BromureAC/remote/overlay-key 配置——可接受的形式为 C-]^]0x1d29——或通过 BROMURE_OVERLAY_KEY 环境变量配置。

使用富客户端镜像远程主机

富客户端把这台 Mac 上的 Bromure Agentic Coding 副本变成远程副本的实时镜像。你会得到一个完整的窗口,它使用你已经熟悉的完全相同的侧栏、网格和终端视图来渲染远程主机——与下方展示的本地实例布局相同——但标题为远程 — <name>,你所做的每一次编辑都会在远程运行并回显。

Bromure Agentic Coding 工作区浏览器:一个带有网格和自动化区域的“工作区”侧栏,以及一个详情窗格,在配置摘要上方显示 CPU、内存、vCPU、磁盘和运行时长卡片。一个富客户端镜像窗口使用这套相同的布局渲染一个远程实例。

连接

打开工作区 → 连接到远程 Bromure…(⇧⌘K)。窗口会概括这个选择:“镜像另一台运行 Bromure 的 Mac——它的网格、工作区、标签页和自动化。登录以从任何地方访问你的服务器,或在你的 LAN 上直接按地址添加一个。” 两条路径都会到达同一个镜像窗口;它们的区别仅在于两台 Mac 如何互相找到并授权。

按地址(同一网络)

当你知道 Mac 的地址且不需要 bromure.io 账户时,在 LAN 上使用这种方式。

  1. 在远程 Mac 上,启用远程访问(远程访问窗口或 bromure-cli remote enable)。
  2. 在这台 Mac 上,点击 +,输入名称(例如 rack mini)、地址端口(默认 2222)和远程用户,然后点击连接。已保存的行会显示 user@address:port 以及上次连接时间。
  3. 首次接触时,一个面板会显示远程主机的 SSH 主机密钥指纹。对照远程主机的远程访问窗口进行核对,然后点击信任并继续。该固定信息会为此端点记住;除非密钥更改,否则后续连接都是静默的,若更改则按钮会变红并显示信任新密钥并继续——这可能是中间人攻击。
  4. 客户端会用这台 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 之间始终保持端到端加密。

  1. 登录。 选择窗口 → 注册到 bromure.io…,输入你的 bromure.io 账户提供的注册码(由你的管理员铸造的六词短语,或个人账户由 Web 控制台铸造)以及一个设备名称。你注册的每台设备都共享同一个账户。
  2. 在远程 Mac 上,启用远程访问。只有当某台服务器的前门开启且正在向 bromure.io 发送心跳时,它才会出现在目录中。
  3. 在这台 Mac 上,打开连接到远程 Bromure…。你的服务器会列在 我的服务器 · bromure.io 下,带有一个实时在线圆点和上次可见时间。双击其中一个(或选中它并点击连接)。状态会显示*“正在通过 bromure.io 连接到 <name>…”*,其间会建立一条点对点路径——直连、路由器端口映射或中继——然后镜像窗口打开。

在这条路径中,没有要输入的地址、没有主机密钥面板、也没有密码:你自己的设备通过你的账户彼此信任(见下文),主机密钥会被自动固定。

在你自己的设备之间免密码

一旦你登录,你注册的每台设备都会通过你的账户共享其 SSH 身份,因此你的任意设备都能到达你的任意服务器,无需密码,也无需手动 bromure-cli remote key add

  • 每台设备在启动时将其 SSH 公钥发布到 bromure.io。你的每台服务器(远程访问已开启)会拉取你各设备的密钥,并在数秒内将它们安装进自己的 authorized_keys——通过同一条设备通道,因此你刚刚注册的设备几乎立即被授权,无需手动复制密钥。
  • 服务器还会发布它所运行的 macOS 登录账户,因此客户端会自动以正确的用户拨号连接(正是按地址路径要求你填写的那个字段)。
  • 密钥仅限于你自己的设备——即使在同一组织内,也绝不属于其他用户。
  • 在某台设备上登出会让它退役:它的密钥会从你的服务器上移除,它也会从目录中消失,因此重新登录绝不会留下过时的重复项。闲置 90 天的设备也会停止被授权,直到它下次签到。此外,你还可以从 bromure.io 的 Web 控制台按需登出你的任意设备。

注意: 富客户端会在你首次使用它时生成自己的专用 ed25519 密钥对(注释 bromure-ac-fatclient),存储于远程客户端目录下——这就是发布到你账户的那把密钥。对于按地址连接,主机密钥固定属于端点(address:port),而非用户,因此编辑已保存服务器的地址或端口会丢弃该固定信息并重新触发指纹面板;而 bromure.io 连接则改为通过账户固定对端的密钥。macOS 应用和 **iOS / iPadOS 应用(“Bromure Client”)**都使用这套账户模型——移动应用是一个纯客户端镜像,以完全相同的方式接入(登录、挑选服务器、连接)。按地址路径仅限 macOS。

镜像窗口

镜像窗口会在成功连接后自动打开。点击一个工作区行以挂载其实时终端(若正在运行)或其带有启动 / 恢复的虚拟机仪表板(若已关闭或已挂起);舞台会实时跟随状态转换。标签页点击会乐观切换,并由下一次状态轮询确认。

它的标题栏工具栏镜像本地的每台虚拟机胶囊,从左到右:网络隧道开关(仅远程窗口)、IP 胶囊、Fusion 闪电、浏览文件(文件夹)、重启虚拟机编辑工作区(齿轮)、弹出到独立窗口显示或隐藏代理浏览器(⌃⌘B)(地球)以及显示或隐藏仓库文件(⌃⌘E)。Docker 仪表板从侧栏打开,与本地完全相同。

一些交互在镜像上表现特殊:

  • 编辑工作区打开与本地相同的配置文件编辑器,但基于机密置空的读取和机密保留的存储(参见机密始终留在宿主机)。生成新的 SSH 密钥可用,并会向你显示新的公钥。
  • 浏览文件打开一个类似 Finder 的每台虚拟机窗口,标题为文件 — <workspace><host>,覆盖客户机文件系统——主目录加上最多八个共享文件夹——支持通过隧道拖入和拖出传输。
  • 重启虚拟机会在本地询问重启还是重启,然后发送该动作。
  • 弹出会打开一个额外的实时终端窗口,若工作区停止则自动关闭。

在底层,镜像每 0.75 秒通过一个 SSH 隧道化的控制套接字桥轮询远程主机的 /state 快照,并通过与本地窗口相同的视图渲染它。短控制调用在每个宿主机一个 SSH ControlMaster 连接上多路复用;交互式终端附加则刻意使用各自专用的 SSH 连接,因为多路复用通道会缓冲终端需要立即得到的自发输出(tmux 重绘)。在 bromure.io 连接上,同一个桥和终端流会走点对点 SSH 路径(经由一个本地环回垫片到达),镜像的行为完全相同。

哪些会镜像,哪些能远程工作

镜像是全面的。它渲染每个工作区及其实时运行状态、所有标签页和工作树(完全嵌套)、网格布局、自动化、关闭和已挂起工作区的虚拟机仪表板、Docker 仪表板、各项指标(CPU、内存、负载、磁盘、运行时长、IP、端口)以及实时交互式终端。编辑是双向的,并在下一次轮询时收敛到每个已连接的客户端:启动/停止/挂起/重启、标签页操作、网格编辑(整体布局,后写者胜出)、自动化编辑、Fusion 开关、Docker 操作、设置存储和文件传输。

在此版本中,有少数操作无法从富客户端进行:

  • 由提示驱动的工作树操作——创建新工作树、合并、解决冲突或播种自动化——在 v1 中未做远程化。请在宿主机自己的 GUI 上或通过远程菜单(它确实支持创建、合并和解决)执行这些操作。镜像仍会显示每个工作树,且移除附加终端可远程工作。
  • 网格布局编辑需要在远程主机上打开一个 GUI 窗口。一个完全无头的远程主机(应用在运行、无统一窗口)会镜像其他一切,但无法接受布局更改。
  • 仅宿主机侧的交互——从文件导入 SSH 密钥,以及订阅注册——在远程设置编辑器中被隐藏。

待处理的决策提示

你在远程发起的某些操作会在远程主机上引发一个决策——主目录存储升级、基础镜像漂移重置或已被入侵虚拟机的清除。这些会在 /state 快照中以待处理提示的形式浮现,并作为本地警报出现在你的镜像窗口中;你的回答会通过隧道回传。如果某个提示无人回应,它会超时至安全的、非破坏性的选择。运行中的代理可能触发的 MITM 许可提示(凭据使用、供应链放行、护栏写入、提示注入)由一条独立的、客户机无法伪造的路径处理,见远程许可处理

机密始终留在宿主机

机密从不跨越链路。当富客户端读取远程配置文件以填充编辑器时,每个机密字段都以置空状态到达。存储时,空白字段意味着“保留已存储的值”,而输入的值则会替换它。API 密钥、令牌和 MCP 环境机密都留在远程 Mac 上。配对后,富客户端仅通过 SSH 密钥进行认证——镜像期间没有密码提示。

访问远程主机虚拟机上的服务

远程工作区的开发服务器位于远程主机网络上的一个私有地址,例如 http://192.168.64.5:3000。Bromure 为你提供两个层级的访问方式——一个自动且限定于浏览器,一个需选择加入且系统级。

浏览器窗格(自动,PAC 限定作用域)

镜像窗口可折叠的右侧浏览器窗格(地球工具栏按钮,或 ⌃⌘B)是一个本地 Chromium 虚拟机,其到远程工作区子网的页面流量通过 SSH 隧道传输。一个生成的 PAC(代理自动配置)脚本仅将远程子网通过每个宿主机一个的 SOCKS 转发器路由,其余一切走 DIRECT,且目标地址在远程侧解析——因此导航到远程开发服务器的字面地址 http://192.168.64.x:port 即可正常工作。远程代理自己的浏览器控制 MCP 流会被中继到这个窗格,所以远程编码代理会驱动你正在看的浏览器。

选择一个正在运行的远程工作区并按 ⌃⌘B。在第一个 /state 快照送达远程主机的子网并且 SOCKS 转发器就绪之前,该窗格什么都不做(在此之前一条日志行会标注 “tunnel not ready”)。它的本地浏览器虚拟机被固定在子网 192.168.127.0/24(网关 192.168.127.1),因此它永远不会与工作区子网冲突。持久化的浏览器配置文件存储在这台 Mac 上,以远程工作区 ID 为键。

注意: 浏览器窗格要求这台 Mac 为 Apple Silicon 且本地已安装浏览器基础镜像。SOCKS 转发器绑定 0.0.0.0(以便浏览器虚拟机能在 vmnet 网关处访问它),但只接受来自环回和固定的 192.168.127.x 浏览器子网的连接——它绝不是一个开放中继。

SOCKS 转发与固定端口转发

每个已连接的远程主机都会自动获得一个本地 SOCKS5 转发器,绑定于一个临时端口的 0.0.0.0(对等端过滤为环回和 192.168.127.x 浏览器子网)。每一次 CONNECT 都会打开一个 forward <ip> <port> SSH 通道,由远程主机——经由客户机始终开启的 vsock 5010 环回中继——桥接到该客户机自己的 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 代理服务器。两者默认都绑定环回,并接受 --bind-all

警告: 远程主机会拒绝任何目标不是其自身 vmnet 子网上客户机的转发。你无法用转发来访问远程 Mac 本身、它的网关或互联网——只能访问工作区虚拟机。

系统级网络隧道

当你希望任意本地应用——而不仅仅是浏览器窗格——都能在远程虚拟机的字面地址访问它们时,用镜像工具栏的网络开关(三角形路径图标,工具栏中的第一个)启用每个宿主机的隧道。它的工具提示为启用对远程主机虚拟机的直接网络访问(任意本地应用均可访问 192.168.x.x)

一个一次性的特权辅助程序——通过 SMAppService 安装的 launchd 守护进程,无需 sudo——创建一个 utun 接口并将远程子网路由到它,然后把该接口的文件描述符交回给应用。应用中的一个用户态 TCP/UDP 栈会终止每一条流,并使用你的 SSH 身份将其拼接到同样的 SSH 转发通道上。没有 pf 规则,也没有内核转发。

第一次启用它时,一个标题为允许 Bromure 的网络辅助程序的警报会说明这次一次性的 macOS 批准:

  1. 点击工具栏开关。
  2. 在警报中,打开系统设置 → 通用 → 登录项,并允许 Bromure Agentic Coding(macOS 会索要一次管理员凭据)。
  3. 应用会轮询批准(每 2 秒一次,最多 5 分钟),并在批准落地的一刻自动连接。在等待期间,开关工具提示为正在等待“系统设置 › 登录项”中的批准…

当隧道建立后,工具提示为对远程主机虚拟机的直接网络访问已开启——点击关闭;如果失败,则为网络隧道失败——点击重试。关闭开关会停止隧道,当最后一个宿主机禁用它时,守护进程会被注销。该设置按宿主机记住。

注意: 隧道的一次性批准需要一个管理员账户。没有它时,Bromure 会继续通过内置的 SOCKS 路径工作——只有从其他应用访问远程虚拟机时才需要该辅助程序。如果 macOS 直接拒绝注册,一个标题为无法安装网络辅助程序的警报会加以说明,且开关会在下次点击时重试。对远程客户机的 ping 会由隧道在本地应答:它确认路由已建立,而非确认客户机存活。

多个远程主机(每次安装独立子网 + 设备群路由)

你可以同时镜像多个远程主机;每个都会打开自己的窗口、SOCKS 转发器以及(可选的)隧道。以前常踩的坑是:历史上每次安装都为其工作区虚拟机使用相同的 192.168.64.0/24 网络,因此两个被镜像的远程主机会通告完全相同的子网,而系统级 VPN 无法区分它们。

每次安装独立子网从源头解决了这一点。现在每台 Mac 都在 172.16.0.0/12 内挑选一个随机/24——跳过 Docker 的 172.17172.20 范围以及宿主机已经所在的任何 /24——并将其用于其所有工作区虚拟机,因此两个独立的安装几乎永远不会冲突(172.16/12 也是最不可能与企业 LAN 或 VPN 冲突的私有范围)。在更新后的首次启动时,Bromure 会提议将这台 Mac 迁移到一个私有子网——立即迁移稍后不再询问——你也可以随时在设置 → 资源 → 工作区子网下更改或重新随机化它。客户机寻址是来自 Bromure 自己交换机的纯 DHCP,因此这完全在宿主机侧完成(无需重建镜像),并且远程主机会在 /state 中通告其所选子网,让富客户端和隧道自动跟随。

对于两个远程主机仍然共享子网的罕见情况,第一个按字面路由,第二个会被赋予一个 100.64.<n>.0/24 的 CGNAT 空间别名,并进行 1:1 保留宿主机八位组的重映射,从而两者可以同时被访问。

警告: 多宿主机别名路由已实现并经过单元测试,但在多个宿主机之间缝合别名感知的 PAC 和浏览器 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 的边缘访问它们。当一个工作区的虚拟机挂起或关闭时,它的所有隧道都会被拆除。下载时的哈希不匹配会拒绝安装,直到在某个应用版本中更新该固定值。

OAuth 回调转发

运行在工作区虚拟机内部的 CLI——ghgcloud、一次订阅登录——通常会通过在你的宿主机 Mac 上打开浏览器并等待重定向到 http://127.0.0.1:<port>/callback 来完成 OAuth 流程。Bromure 会自动桥接:宿主机在 IPv4 和 IPv6 上都绑定该环回端口,并在第一个真实请求到来时通过 vsock 5010 将其拼接到客户机自己的 127.0.0.1:<port>redirect_uri 从不会被重写,因此 PKCE 和重定向验证仍然通过。无需配置任何东西——在工作区内部启动登录,重定向就会被送达客户机。

该转发器会在 300 秒后自行拆除,因此环回端口绝不会被无限期占用。如果宿主机端口已被占用,流程会在没有桥接的情况下原生进行,而推测性的浏览器预连接(打开但从不发送数据的套接字)会被忽略,从而它们无法卡住一个单次回调服务器。

安全模型

远程访问功能强大,因此值得精确说明它的边界。

  • 默认关闭,唯一一扇门。 在你启用 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 设备已被吊销。请重新登录。”此设备已被登出/吊销(由你、Web 控制台,或闲置 90 天)重新注册:窗口 → 注册到 bromure.io…
红色的信任新密钥并继续面板远程主机的主机密钥自固定以来已更改带外核实;只有在你知道密钥为何更改(重装、新 Mac)时才继续——否则它可能是中间人攻击。
编辑密钥后正在进行的连接中断添加或移除授权密钥会重启监听器预期之内;重新连接。
浏览器窗格保持空白SOCKS 转发器或子网尚未就绪等待第一次 /state 轮询;确保工作区正在运行且这台 Mac 已安装浏览器镜像。
转发被拒绝目标不是远程主机 vmnet 子网上的客户机转发只能到达工作区虚拟机,绝不能到达宿主机、网关或互联网。
隧道开关卡在正在等待批准…特权辅助程序尚未获批在系统设置 → 通用 → 登录项中批准 Bromure Agentic Coding(需要管理员)。没有它,SOCKS 仍然可用。
网格布局编辑在远程主机上不生效远程主机是无头的网格编辑需要在远程主机上打开一个 GUI 窗口;其他一切仍会镜像。

文件、端口与环境变量

服务器端状态位于 ~/Library/Application Support/BromureAC/remote/ 下:hostkey_ed25519(0600)及其 .pubauthorized_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每个虚拟机中始终开启的环回中继——端口转发和 OAuth 回调送达的路径。
客户机 vsock 5830工作区代理的浏览器 MCP 流,中继到富客户端的浏览器窗格。
临时端口,绑定 0.0.0.0每个宿主机的 SOCKS5 转发器(对等端过滤为环回和 192.168.127.x 浏览器子网)。
192.168.127.0/24富客户端固定的本地浏览器虚拟机子网。
100.64.<n>.0/24在设备群子网冲突时分配的 CGNAT 别名子网。

相关的 UserDefaults 键(域 io.bromure.agentic-coding)为 remoteAccess.enabledremoteAccess.portremoteAccess.bindAddressremoteAccess.passwordAuthremoteAccess.pubkeyAuthfatclient.tunnel.<host-UUID>cloudflareTunnel.consented。诊断环境变量包括 BROMURE_OVERLAY_KEY(远程菜单组合键)、BROMURE_FATCLIENT_LOG(富客户端详细日志)和 BROMURE_FATCLIENT_UTUN(强制启用系统级隧道的选择加入——工具栏开关才是产品路径)。完整的 CLI 参考,包括隐藏的 __forward__forward-socks__dial__attach-window 管道,见自动化与 CLI