リモートアクセスとリッチクライアント

ワークスペース VM は 1 台の Mac 上に存在しますが、それを操作したい人が常にその Mac の前に座っているとは限りません。Bromure Agentic Coding にはリモートで接続でき、あらゆるリモート経路は単一の、オプションで、デフォルトでは無効になっている SSH の玄関口を通ります。これを有効にすると 3 つの入り口が得られます。任意のターミナルから ssh で接続してメニューに到達でき、コマンドラインから玄関口そのものを管理でき、そして リッチクライアント — アプリを実行している別の Mac、または iOS / iPadOS アプリ — が接続してインスタンス全体(そのグリッド、ワークスペース、ターミナル、ダッシュボード)をライブウィンドウで 1:1 にミラーリングできます。

リッチクライアントはサーバーに 2 つの方法で到達します。同じネットワーク上では、直接アドレスで 追加します。それ以外のどこからでも、bromure.io アカウントにサインイン し、ディレクトリからサーバーを選びます。2 台のデバイスは bromure.io によって引き合わされ、その後は ピアツーピア で通信します。ポート転送も VPN も、覚えておくべきアドレスもありません — そしてサインインすれば、あなた自身のデバイス同士が互いを認可するので、接続は パスワード不要 で、手動の鍵設定も要りません。

この章では、ホストでのリモートアクセスの有効化、各入り口、リッチクライアントがリモートを 1:1 でミラーリングする仕組み(アドレスで、および bromure.io 経由で)、リモート VM 内のサービスへの到達、開発サーバーのインターネットへの公開、そしてそのすべてを安全に保つセキュリティモデルを扱います。フリート規模の登録とクラウドテレメトリはまったく別のシステムです — エンタープライズ を参照してください。完全なコマンドリファレンスは 自動化と CLI にあります。

3 つの入り口

以下のすべては SSH の玄関口が有効になっていることに依存します(デフォルトでは無効です)。いったん実行されると、同じサーバーが 3 つの利用者すべてに対応します。

入り口使う人得られるもの
プレーン SSH任意のターミナルの人(ssh -p 2222 you@macリモートメニュー — curses スタイルの TUI。生のシェルには決して到達できません。
bromure-cli remote CLIホスト自身での操作玄関口の管理:有効化/無効化、キー、ステータス。ホストでのリモートアクセスの有効化 を参照。
リッチクライアントアプリを実行している別の Mac、または iOS / iPadOS アプリリモートインスタンスのライブ 1:1 ミラーウィンドウ。双方向編集が可能 — LAN 上では アドレスで、どこからでも bromure.io アカウント経由で 到達できます。

サーバーは 組み込み です — macOS 自身の sshd ではなく、アプリに組み込まれた Apple の swift-nio-ssh ライブラリです。この違いは重要です。アプリが独自のサーバーを実行するため、システム設定で リモートログイン を有効にすることも管理者権限も一切なしに、OpenDirectory を通じて macOS アカウントのパスワードを検証できます。サーバーは bromure-cli を起動したちょうどその macOS ユーザーのためだけにリッスンし、すべての対話的ログインをリモートメニューへと強制します。マシン向けの例外は、リッチクライアントが使う 4 つのホワイトリスト登録済みコマンド(bromure-fatclient/1 controlforward <ip> <port>forward-udp <ip>browser-mcp <vm>)だけです。人間が入力するそれ以外のものはログインと同じように扱われ、メニューに落ちます。

メモ: リモートアクセスウィンドウはサーバーを「アプリが所有するシステム SSH サーバーのインスタンス」と説明します。より正確には、これは組み込みの swift-nio-ssh サーバーであり、macOS の sshd では ない ように意図的に作られています — それこそが、リモートログインや管理者権限なしで動作させることを可能にしている点です。

ホストでのリモートアクセスの有効化

リモートアクセスは有効にするまでは無効であり、2 つの等価な方法で管理できます。リモートアクセス ウィンドウか、bromure-cli remote CLI です。どちらも同じ場所に書き込むので、一方で行った変更はもう一方にも反映され、ライブで適用されます。

リモートアクセスウィンドウ

Bromure Agentic Coding(アプリ名メニュー)→ リモートアクセス… を開きます。ウィンドウのタイトルは リモートアクセス です。緑またはグレーのドットが 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 経由で検証)。オン
認証公開鍵下の authorized-keys リストのキーを受け入れます。オン
サーバーホストキーフィンガープリントアウトオブバンド検証用の、サーバー自身の ed25519 ホストキーのフィンガープリント。最初の使用まで (初回有効化時に生成) と表示されます。
認可済み公開鍵リスト登録された ssh-ed25519 / ecdsa 公開鍵。キー行を貼り付けて追加し、ゴミ箱アイコンで削除します。空のときは 登録されたキーはありません。 と表示されます。

バインド IP または ポート を編集して Return を押すと、変更がライブで適用されます。認証 セクションには <user> に対して検証 — bromure-cli を実行しているユーザー。 と注記され、誰のパスワードが玄関口を開けるのかが明確になっています。

警告: 少なくとも 1 つの認証方法は有効なままにしておく必要があります — パスワード認証と公開鍵認証の両方をオフにすることはできません。無効なキーを貼り付けると 有効な公開鍵ではありません として拒否されます。認可済みキーの追加または削除はリスナーを再起動し、ライブ接続をすべて切断します。

bromure-cli remote CLI

CLI は実行中のアプリと、その所有者専用の制御ソケット経由で通信するので、アプリが唯一の信頼できる情報源であり続けます。既存のシェル経由で到達したヘッドレス 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 ls1 始まりのインデックス、フィンガープリント、コメント付きで認可済みキーを一覧表示します。
bromure-cli remote key rm <index|fingerprint>インデックスまたはフィンガープリントの部分文字列でキーを削除します。

remote enable--no-password--no-pubkey の両方を渡すと拒否し、ベースイメージが欠けているかインストール中はエラーになります。アプリが実行されていないとき、statusdisablekey lsbromure-cli エージェントが実行されていません。 と出力します。

メモ: ベースイメージが存在しないか、まだインストール中の間はサーバーは起動しません — 有効化すると、暗黙のうちに何もしないのではなく、対処可能なエラーが返されます。これは起動時にもトグルを切り替えたときにも当てはまります。まずベースイメージをインストールするか、インストールを完了してください。

ホストキー、フィンガープリント、信頼

初回の有効化時に、サーバーは ed25519 ホストキーを生成します。そのフィンガープリント — サーバーホストキー の行と bromure-cli remote status で、256 SHA256:… bromure-ac-remote (ED25519) の形式で表示されます — は、接続するクライアントが正しい Mac に到達したことを確認するために検証するものです。中間者攻撃者がホストになりすませないように、このフィンガープリントを接続する人に渡してください(またはリッチクライアントの初回接触シートで自分で確認してください)。リッチクライアントがどのようにこれをピン留めするかは 初回使用時の信頼 を参照してください。

レート制限

パスワード試行はトークンバケットによってソース IP ごとにスロットリングされます。フルスピードで 5 回試行でき、その後は約 2 秒ごとに 1 回のペースで補充され、課される遅延は最大 8 秒までです。試行は 遅延 されるだけで、拒否されることは決してなく、誰もロックアウトされません。1 つのうるさい IP が別の IP を遅くすることはできません。公開鍵認証は決してスロットリングされません。

プレーン SSH でのサインイン

任意のターミナルは ssh -p 2222 <user>@<mac> でホストに到達できます。接続はシェルではなく リモートメニュー に落ちます — これは curses スタイルの TUI(内部的には bromure-cli __remote-menu)で、すべての人間のログインに強制されます。それを通じて生のシェルに到達することは決してできません。

メニューはアプリを反映します。ライブ状態のグリフ(● 実行中、◌ 起動中、⏸ サスペンド中、○ オフ)付きの統合された ワークスペース リストに加え、モデルトレース のセクションがあります。そこから次のことができます。

  • 単一画面のフォームで ワークスペースを作成 します。すべての設定… の入り口から 14 個すべての設定ペイン(一般、エージェント、ローカルモデル、Fusion、フォルダ、認証情報、環境、MCP、トレース、ガードレール、サプライチェーン、プロンプトインジェクション、外観、リソース)にアクセスできます。
  • 任意のワークスペースを 開始、サスペンド、強制終了、再起動、または削除 します。
  • すべての設定を編集 します。シークレットは •••• (set) と表示され、シークレットを空欄のままにすると保存済みの値が保持されます。
  • GUI と同じネストで worktree を管理 します — 作成、マージ、ターミナルのアタッチ、破棄。
  • SSH キーを生成 し、Fusion とモデルルーティングを切り替え、トレースの要約を閲覧します。
  • 任意の tmux タブまたは実行中の Docker コンテナに アタッチ します。

矢印キーで移動し、Enter で選択、q または Esc で戻ります。終了(切断) でセッションを終了します。アタッチ を選択するとターミナルがゲストの tmux に渡されます。Ctrl-b d でメニューに戻ってデタッチします。アタッチ中は、オーバーレイのキーコード(デフォルトは Ctrl-])でホスト側のコントローラーが表示され — タブの切り替え、新しいタブを開く、worktree の管理、Fusion やルーティングの切り替え、設定の編集、再起動、サスペンド、切断が — キーストロークがゲストに届くことなく行えます。コンテナへのアタッチではシェルの入力を求められます(Enter = sh)。

メモ: メニューには実際のターミナルが必要です。TTY なしで接続すると ssh -t で再接続するようヒントが出力されます。コールドなワークスペースを開始すると、アタッチする前にゲストの tmux セッションを最大約 20 秒待ちます。ワークスペースが サブスクリプション 認証を使う場合、メニューは VM の起動後にツールのログイン(例えば claude login)を VM 内で実行するよう促します。

オーバーレイのコードは ホスト Mac(接続先のマシン)でファイル ~/Library/Application Support/BromureAC/remote/overlay-key を通じて設定できます — 受け付ける形式は C-]^]0x1d29 です — または BROMURE_OVERLAY_KEY 環境変数でも設定できます。

リッチクライアントでのリモートのミラーリング

リッチクライアントは、この Mac の Bromure Agentic Coding のコピーをリモートのライブミラーに変えます。すでに慣れ親しんだのとまったく同じサイドバー、グリッド、ターミナルビューを使ってリモートをレンダリングするフルウィンドウが得られます — 下にローカルインスタンスで示すのと同じレイアウトです — ただしタイトルは リモート — <name> で、行うすべての編集はリモート上で実行され、エコーバックされます。

Bromure Agentic Coding のワークスペースブラウザ:グリッドと AUTOMATIONS セクションを持つ WORKSPACES サイドバーと、CONFIGURATION の要約の上に CPU、メモリ、vCPU、ディスク、稼働時間のカードを示す詳細ペイン。リッチクライアントのミラーウィンドウはこの同じレイアウトを使ってリモートインスタンスをレンダリングします。

接続する

ワークスペース → リモート Bromure に接続…(⇧⌘K)を開きます。ウィンドウは選択肢を要約します。「Bromure を実行している別の Mac をミラーリングします — そのグリッド、ワークスペース、タブ、自動化。サインインしてどこからでもサーバーに到達するか、LAN 上でアドレスを指定して直接追加します。」 どちらの経路も同じ ミラーウィンドウ に到達します。異なるのは、2 台の 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 は 2 台の Mac を引き合わせ、直接の経路が不可能なときにだけバイトを中継します。SSH セッション自体は 2 台の Mac の間でエンドツーエンドに暗号化されたままです。

  1. サインインします。 ウィンドウ → bromure.io に登録… を選択し、bromure.io アカウントから提供される登録コード(管理者が、または個人アカウントの場合は Web コンソールが発行する 6 語のフレーズ)と デバイス名 を入力します。登録するすべてのデバイスは同じアカウントを共有します。
  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 専用です。

ミラーウィンドウ

ミラーウィンドウは接続成功後に自動的に開きます。ワークスペースの行をクリックすると、そのライブターミナル(実行中の場合)か、開始 / 再開 付きの VM ダッシュボード(オフまたはサスペンド中の場合)がマウントされます。ステージは状態遷移をライブで追従します。タブのクリックは楽観的に切り替わり、次の状態ポーリングで確定します。

そのタイトルバーのツールバーは、ローカルの VM ごとのピルを左から右に反映します。ネットワークトンネルのトグル(リモートウィンドウのみ)、IP ピル、Fusion のボルト、ファイルを参照(フォルダ)、VM を再起動ワークスペースを編集(歯車)、独自のウィンドウにポップアウトエージェント型ブラウザの表示/非表示(⌃⌘B)(地球儀)、リポジトリファイルの表示/非表示(⌃⌘E) です。Docker ダッシュボードはローカルとまったく同じようにサイドバーから開きます。

いくつかの機能はミラー上で特別に動作します。

  • ワークスペースを編集 はローカルと同じプロファイルエディタを開きますが、シークレットを空欄にした読み込みとシークレットを保持する保存に支えられています(シークレットはホストに留まる を参照)。新しい SSH キーを生成 は機能し、新しい公開鍵を表示します。
  • ファイルを参照 は、ゲストファイルシステム上で ファイル — <workspace><host> というタイトルの Finder のような VM ごとのウィンドウを開きます — ホームと最大 8 個の共有フォルダ — トンネル経由でのドラッグイン・ドラッグアウト転送が可能です。
  • VM を再起動 はローカルで ソフトハード かを尋ね、その動詞を送信します。
  • ポップアウト は追加のライブターミナルウィンドウを開き、ワークスペースが停止すると自動的に閉じます。

内部では、ミラーは SSH トンネル経由の制御ソケットブリッジ越しにリモートの /state スナップショットを 0.75 秒ごとにポーリングし、ローカルウィンドウと同じビューを通じてレンダリングします。短い制御呼び出しはホストごとに 1 つの SSH ControlMaster 接続で多重化されます。対話的なターミナルのアタッチは意図的に独自の専用 SSH 接続を使います。多重化されたチャネルは、ターミナルが即座に必要とする自発的な出力(tmux の再描画)をバッファリングしてしまうためです。bromure.io 接続では、同じブリッジとターミナルストリームがピアツーピアの SSH 経路(ローカルのループバックシム経由で到達)を通り、ミラーは同一に振る舞います。

何がミラーされ、何がリモートで動作するか

ミラーは包括的です。各ワークスペースをそのライブ実行状態、すべてのタブと worktree(完全にネスト)、グリッドレイアウト、自動化、オフおよびサスペンド中のワークスペースの VM ダッシュボード、Docker ダッシュボード、バイタル(CPU、メモリ、負荷、ディスク、稼働時間、IP、ポート)、そしてライブの対話的ターミナルとともにレンダリングします。編集は双方向で、次のポーリングで接続中のすべてのクライアントに収束します。開始/停止/サスペンド/再起動、タブ操作、グリッド編集(レイアウト全体、最終書き込み優先)、自動化の編集、Fusion トグル、Docker アクション、設定の保存、ファイル転送です。

いくつかの操作はこのバージョンではリッチクライアントから利用 できません

  • プロンプト駆動の worktree 操作 — 新しい worktree の作成、マージ、競合の解決、自動化のシード — は v1 ではリモート化されていません。それらはホスト自身の GUI か、リモートメニュー(作成、マージ、解決を サポートしている)で行ってください。ミラーはすべての worktree を引き続き表示し、削除ターミナルのアタッチ はリモートで動作します。
  • グリッドレイアウトの編集 にはリモートで GUI ウィンドウが開いている必要があります。完全にヘッドレスなリモート(アプリは実行中だが統合ウィンドウなし)は、それ以外のすべてをミラーしますが、レイアウトの変更を受け付けることはできません。
  • ホスト側専用の機能 — ファイルからの SSH キーのインポートとサブスクリプション登録 — はリモート設定エディタでは非表示です。

保留中の判断プロンプト

リモートで開始する一部のアクションは、リモート上で判断を求めます — ホームストレージのアップグレード、ベースイメージのドリフトのリセット、侵害された VM のワイプなどです。これらは /state スナップショットに保留中のプロンプトとして表れ、あなたの ミラーウィンドウにローカルアラートとして現れます。あなたの回答はトンネル経由で戻ります。プロンプトが未回答のままだと、安全で非破壊的な選択肢へとタイムアウトします。実行中のエージェントがトリガーできる MITM 同意プロンプト(認証情報の使用、サプライチェーンのパススルー、ガードレールの書き込み、プロンプトインジェクション)は、リモートの同意処理 に記載された、別個のゲストが偽造できない経路で処理されます。

シークレットはホストに留まる

シークレットはリンクを決して越えません。リッチクライアントがエディタに入力するためにリモートプロファイルを読み込むとき、すべてのシークレットフィールドは 空欄 で到着します。保存時、空欄のフィールドは「保存済みの値を保持する」を意味し、入力されたフィールドはそれを置き換えます。API キー、トークン、MCP 環境シークレットはリモート Mac に留まります。リッチクライアントは、いったんペアリングされると SSH キーだけで認証します — ミラーリング中にパスワードの入力を求められることはありません。

リモートの VM 上のサービスへの到達

リモートワークスペースの開発サーバーは、リモートの ネットワーク上で http://192.168.64.5:3000 のようなプライベートアドレスに存在します。Bromure はそれへの 2 段階のアクセスを提供します — 1 つは自動でブラウザスコープ、もう 1 つはオプトインでシステム全体です。

ブラウザペイン(自動、PAC スコープ)

ミラーウィンドウの折りたたみ可能な右側のブラウザペイン(地球儀のツールバーボタン、または ⌃⌘B)は ローカルの Chromium VM であり、リモートワークスペースのサブネットへのページトラフィックが SSH 経由でトンネリングされます。生成された PAC(プロキシ自動構成)スクリプトは、リモートサブネットのみをホストごとの SOCKS フォワーダー経由でルーティングし、それ以外のすべてを DIRECT にします。宛先はリモート側で解決されるので、リモート開発サーバーの文字通りの http://192.168.64.x:port へのナビゲーションがそのまま機能します。リモートエージェント自身のブラウザ制御 MCP ストリームはこのペインにリレーされるので、リモートのコーディングエージェントがあなたが見ているブラウザを操作します。

実行中のリモートワークスペースを選択して ⌃⌘B を押します。最初の /state スナップショットがリモートのサブネットを配信し、SOCKS フォワーダーが起動するまで、ペインは何もしません(それまでは「トンネルが準備できていません」というログ行が出ます)。そのローカルブラウザ VM はサブネット 192.168.127.0/24(ゲートウェイ 192.168.127.1)に固定されているので、ワークスペースのサブネットと衝突することは決してありません。永続的なブラウザプロファイルは、リモートワークスペース ID をキーとしてこの Mac 上に存在します。

メモ: ブラウザペインには、この Mac が Apple Silicon であり、ブラウザベースイメージがローカルにインストールされていることが必要です。SOCKS フォワーダーは 0.0.0.0 にバインドします(ブラウザ VM が vmnet ゲートウェイでそれに到達できるように)が、接続を受け付けるのはループバックと固定された 192.168.127.x ブラウザサブネットからのみです — オープンリレーになることは決してありません。

SOCKS フォワーディングと固定ポートフォワード

接続された各リモートホストは、0.0.0.0 にバインドされたエフェメラルポート上のローカル SOCKS5 フォワーダーを自動的に取得します(ループバックと 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 配管があります。ssh -L スタイルのフォワードには bromure-cli __forward <hostID> <localPort> <remoteIP> <remotePort>、スタンドアロンの SOCKS プロキシには bromure-cli __forward-socks <hostID> <localPort> です。どちらもデフォルトでループバックにバインドし、--bind-all を受け付けます。

警告: リモートは、ターゲットが自身の vmnet サブネット上のゲストでないフォワードをすべて拒否します。フォワードを使ってリモート Mac 自身、そのゲートウェイ、またはインターネットに到達することはできません — ワークスペース VM のみです。

システム全体のネットワークトンネル

ブラウザペインだけでなく あらゆる ローカルアプリがリモート VM にその文字通りのアドレスで到達できるようにしたいときは、ミラーツールバーのネットワークトグル(三角形のパスアイコン、ツールバーの最初)でホストごとのトンネルを有効にします。そのツールチップには リモートの VM への直接ネットワークアクセスを有効にする(任意のローカルアプリから 192.168.x.x) と表示されます。

1 回限りの特権ヘルパー — SMAppService 経由でインストールされる launchd デーモン、sudo なし — が utun インターフェースを作成してリモートサブネットをそこにルーティングし、そのインターフェースのファイルディスクリプタをアプリに返します。アプリ内のユーザースペース TCP/UDP スタックが各フローを終端し、あなたの SSH アイデンティティを使って同じ SSH フォワードチャネルにスプライスします。pf ルールもカーネルフォワーディングもありません。

初めて有効にするとき、Bromure のネットワークヘルパーを許可 というタイトルのアラートが 1 回限りの macOS 承認について説明します。

  1. ツールバーのトグルをクリックします。
  2. アラートで システム設定 → 一般 → ログイン項目 を開き、Bromure Agentic Coding を許可します(macOS は 1 回だけ管理者の認証情報を求めます)。
  3. アプリは承認をポーリングし(2 秒ごと、最大 5 分)、承認された瞬間に自動的に接続します。待機中、トグルのツールチップには システム設定 › ログイン項目での承認を待機中… と表示されます。

トンネルが起動しているとき、ツールチップには リモートの VM への直接ネットワークアクセスがオンです — クリックしてオフにする と表示されます。失敗した場合は ネットワークトンネルが失敗しました — クリックして再試行 です。オフに切り替えるとトンネルが停止し、最後のホストがそれを無効にするとデーモンは登録解除されます。この設定はホストごとに記憶されます。

メモ: トンネルには 1 回限りの承認のために管理者アカウントが必要です。それがなくても、Bromure は組み込みの SOCKS 経路で動作し続けます — ヘルパーは 他の アプリからリモート VM に到達する場合にのみ必要です。macOS が登録をきっぱり拒否した場合、ネットワークヘルパーをインストールできませんでした というタイトルのアラートが説明し、トグルは次のクリックで再試行します。リモートゲストへの ping はトンネルによってローカルで応答されます。これはルーティングが起動していることを確認するものであり、ゲストが生きていることを確認するものではありません。

複数のリモート(インストールごとのサブネット+フリートルーティング)

複数のリモートを同時にミラーリングできます。それぞれが独自のウィンドウ、SOCKS フォワーダー、そして(オプションで)トンネルを開きます。これがかつて陥っていた罠:すべてのインストールは歴史的にワークスペース VM に同じ 192.168.64.0/24 ネットワークを使っていたので、2 つのミラーされたリモートが同一のサブネットを広告し、システム全体の VPN がそれらを区別できませんでした。

インストールごとのサブネット はこれを根本から修正します。各 Mac は現在、172.16.0.0/12 内の ランダムな /24 を選び — Docker の 172.17172.20 の範囲とホストがすでに使っている任意の /24 を避けて — それをすべてのワークスペース VM に使います。したがって、独立した 2 つのインストールがほぼ衝突しなくなります(172.16/12 は、企業の LAN や VPN と衝突する可能性が最も低いプライベート範囲でもあります)。更新後の初回起動時に、Bromure はこの Mac をプライベートサブネットに移行するよう提案します — 今すぐ移行後で今後尋ねない — そして 設定 → リソース → ワークスペースサブネット でいつでも変更または再ランダム化できます。ゲストのアドレッシングは Bromure 自身のスイッチからの純粋な DHCP なので、これは完全にホスト側で行われ(イメージの再構築なし)、リモートは選択したサブネットを /state で広告するので、リッチクライアントとトンネルは自動的にそれに従います。

2 つのリモートが それでも サブネットを共有する稀なケースのために、最初のものは文字通りにルーティングされ、2 番目のものには 100.64.<n>.0/24 CGNAT 空間のエイリアスが与えられ、1:1 のホストオクテット保持リマップで両方に同時に到達できるようになります。

警告: マルチホストのエイリアスルーティングは実装されユニットテストされていますが、エイリアスを認識する PAC とブラウザ MCP リマップをホスト間で縫い合わせるランタイム配線はまだ保留中です。単一のリモートホストが今日完全にサポートされている構成です。 エイリアシングの既知の制限は、配線された後、エイリアスされた リモート内で絶対的な文字通りの http://192.168.64.x リンクを出力する開発ページが誤ってルーティングされる可能性があることです。文字通りの(エイリアスされていない)リモートは影響を受けません。

開発サーバーのインターネットへの公開

上記のすべてとは別に、ワークスペース内で実行中の個別の HTTP サービスは、ポートごとの Cloudflare クイックトンネル でパブリックインターネットに公開できます。実行中のワークスペースのダッシュボードを開き、ポートカードでサービスを見つけ、地球儀(ツールチップ:インターネットに公開(Cloudflare クイックトンネル))をクリックします。Bromure はそのオリジンに対して 1 つの cloudflared プロセスを実行し、ランダムな https://<name>.trycloudflare.com URL を提供します — Cloudflare アカウントは不要です。サービスごとに 1 つのトンネルと 1 つの URL で、あるものを公開または非公開にしても他のものが乱されることはありません。

地球儀の色は状態を追跡します。グレー = オフ、オレンジ = インストール中または起動中、緑 = 実行中、赤 = 失敗。ポートの下のステータス行が進捗(cloudflared をダウンロード&検証中(約 18 MB、1 回限り)…、次に トンネルを起動中…)またはコピーボタン付きのクリック可能なパブリックホスト名を表示します。

初めて何かを公開するとき、Cloudflare Tunnel 経由でサービスをインターネットに公開しますか? というタイトルの 1 回限りの同意ダイアログが、ダウンロード、検証、Cloudflare の利用規約、そしてランダムな URL を持つ誰もがサービスに到達できるという事実をカバーします。地球儀を再度クリックすると停止します。

cloudflared バイナリは固定されたリリースで、実行される前に 2 回検証されます。ダウンロードされたアーカイブの 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 — ghgcloud、サブスクリプションのサインイン — は、ホスト Mac でブラウザを開いて http://127.0.0.1:<port>/callback へのリダイレクトを待つことで OAuth フローを完了することがよくあります。Bromure はこれを自動的にブリッジします。ホストはループバックポートを IPv4 と IPv6 の両方でバインドし、最初の実際のリクエストで vsock 5010 経由でゲスト自身の 127.0.0.1:<port> にスプライスします。redirect_uri は決して書き換えられないので、PKCE とリダイレクト検証は引き続き通ります。設定するものは何もありません — ワークスペース内でログインを開始すれば、リダイレクトはゲストに配信されます。

フォワーダーは 300 秒後に自身を破棄するので、ループバックポートが無期限に保持されることはありません。ホストポートがすでに使用中の場合、フローはブリッジなしでネイティブに進行し、投機的なブラウザのプリコネクト(開いても何も送信しないソケット)は無視されるので、単発のコールバックサーバーを詰まらせることはできません。

セキュリティモデル

リモートアクセスは強力なので、その境界について正確に述べる価値があります。

  • デフォルトでオフ、1 つの玄関口。 SSH サーバーを有効にするまで、リモート経路は存在しません。あらゆる経路 — 人間のメニュー、CLI、リッチクライアント、ポートフォワード、ブラウザ MCP — はその 1 つのサーバーに乗り、他のものには乗りません。
  • 暗号化とトランスポート。 すべてのトラフィックは SSH です。リッチクライアントの制御ポーリング、ターミナルのアタッチ、ファイル転送、ポートフォワード、ブラウザ MCP リレーはすべて SSH 接続の内部を移動します。swift-nio-ssh はポスト量子鍵交換を持たないため、最新の OpenSSH クライアントは「ポスト量子鍵交換を使用していません」という警告を出力します。これは想定内であり、ダウングレード攻撃を示すものではありません。
  • bromure.io はブローカーであり、中間者ではありません。 アカウント経路では、bromure.io はあなたの 2 台のデバイスを 引き合わせる だけで、直接のピアツーピア経路を構築できないときには不透明なバイトを TURN リレー(TLS 上)経由で中継します。SSH セッションを終端することは決してありません。暗号化されたトンネルはあなたの 2 台の Mac の間でエンドツーエンドに実行されます。SSH 鍵は あなた自身のアカウント のデバイス間でのみ共有され(他のユーザーのものとは決して共有されません)、各サーバーは所有者のデバイス鍵を自ら取得し、登録/サインアウトがデバイスの信頼を付与・取り消しする方法です。サインアウトされた、または 90 日間アイドルのデバイスは認可されなくなります。
  • 誰がログインできるか。 アプリを起動したちょうどその macOS ユーザーのみです。パスワード認証は OpenDirectory に対して検証され(リモートログインなし、PAM の変更なし、管理者権限なし)、公開鍵認証はあなたが登録したキーのみを受け付けます。パスワード試行はソース IP ごとにレート制限されます。キーは制限されません。
  • セッションで何ができるか。 人間のログインはリモートメニューにしか到達できず — シェルには決して到達できません — ワークスペースの作成、設定、操作はできますが、任意のホストコマンドを実行することはできません。リッチクライアントの 4 つのマシン動詞も同様に狭いです。制御ソケットブリッジ、vmnet サブネット上のゲストへのフォワード、ブラウザ MCP リレーです。ホスト自身、ゲートウェイ、インターネットへのフォワードは拒否されます。
  • シークレットはホストを決して離れない。 リモートプロファイルの読み込みはシークレットが空欄化され、保存はシークレットを保持します。API キー、トークン、MCP 環境シークレットはリモート Mac に留まります。
  • 初回使用時の信頼。 リッチクライアントは初回接触時にエンドポイントごとにリモートのホストキーをピン留めし、その後の変更に対して大声で警告します。
  • ゲストが偽造できない同意。 実行中のエージェントが引き起こす MITM 同意プロンプトは、ターミナルポンプの ホスト 側でレンダリングされます。そこでは侵害されたゲストはそれらを見ることも偽造することもできません。タイムアウトやデタッチはすべて拒否に解決します。リモートの同意処理 を参照してください。

トラブルシューティング

症状考えられる原因対処
有効化がエラーを返すベースイメージが欠けているか、まだインストール中ベースイメージが存在するまでサーバーは起動できません。インストールを完了してから再度有効にしてください。
ssh は接続するが ssh -t で再接続するよう言われるTTY が要求されなかったリモートメニューにはターミナルが必要です。-t を追加してください(または ssh -t -p 2222 <user>@<mac> を使う)。
OpenSSH が「ポスト量子鍵交換を使用していません」と出力するswift-nio-ssh に PQ 鍵交換がない想定内で無害です — 接続は依然として暗号化されています。
アドレスで の接続がパスワードを求め続けるこの Mac のキーがリモートに登録されていない1 回のパスワードログインで自動的に登録させるか、リモートで bromure-cli remote key add '<this Mac's key>' を実行してください(この Mac のキーを表示 でコピーできます)。
bromure.io の接続がまだパスワードを求める鍵レジストリがこのデバイスをそのサーバーでまだ認可していないここではパスワード不要は自動です — 両方の Mac で bromure.io にサインインしていること、サーバーの リモートアクセス がオンであること、両方が最新のビルドを実行していること(サーバーがログインを公開し、あなたの鍵を取得します)を確認してください。リモートアクセスを有効にした後、数秒待ってください。
マイサーバー · bromure.io が空サインインしていない、またはサーバーが広告していないサインインしてください(ウィンドウ → bromure.io に登録…)。リモートで リモートアクセス を有効にして、ハートビートを送り表示されるようにします。グレーアウトした行はハートビートが止まったことを意味します。
「bromure.io 経由で接続を確立できませんでした…」2 台の Mac の間に直接または中継のネットワーク経路がない両方が bromure.io に到達できることを確認してください。リレーには turns:5349 への到達性が必要です。再試行してください — 次の試行で経路が再試行されます。
「bromure.io 経由で … に到達しましたが、その SSH の玄関口が応答しませんでした」リモートでリモートアクセスがオフにされたリモート Mac で リモートアクセス を再度有効にしてください。
「この Mac の bromure.io デバイスは取り消されました。再度サインインしてください。」このデバイスがログアウト/取り消された(あなた、Web コンソール、または 90 日間のアイドルによる)再登録してください:ウィンドウ → bromure.io に登録…
赤い 新しいキーを信頼して続行 シートピン留め後にリモートのホストキーが変わったアウトオブバンドで検証してください。キーが変わった理由がわかっている場合のみ続行してください(再インストール、新しい Mac)— そうでなければ中間者攻撃の可能性があります。
キーを編集した後にライブ接続が切れる認可済みキーの追加または削除はリスナーを再起動する想定内です。再接続してください。
ブラウザペインが空白のままSOCKS フォワーダーまたはサブネットがまだ準備できていない最初の /state ポーリングを待ってください。ワークスペースが実行中で、この Mac にブラウザイメージがインストールされていることを確認してください。
フォワードが拒否されるターゲットがリモートの vmnet サブネット上のゲストではないフォワードはワークスペース VM にしか到達できません。ホスト、ゲートウェイ、インターネットには決して到達できません。
トンネルトグルが 承認を待機中… で止まる特権ヘルパーがまだ承認されていないシステム設定 → 一般 → ログイン項目で 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:5349bromure.io アカウント経路のみ。 あなたのアカウント(デバイスディレクトリ、ランデブー)への到達、および直接のピアツーピア経路を構築できないときの TURN リレー(TLS 上)。アカウント経路では両方が各デバイスから到達可能である必要があります。アドレス経路とは無関係です。
ゲスト vsock 5010すべての VM 内の常時稼働ループバックリレー — ポートフォワードと OAuth コールバック配信の経路。
ゲスト vsock 5830ワークスペースエージェントのブラウザ MCP ストリーム、リッチクライアントのブラウザペインにリレーされる。
エフェメラルポート、バインド 0.0.0.0ホストごとの SOCKS5 フォワーダー(ループバックと 192.168.127.x ブラウザサブネットにピアフィルタリング)。
192.168.127.0/24リッチクライアントの固定されたローカルブラウザ VM サブネット。
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(システム全体のトンネルオプトインを強制的に有効化 — ツールバーのトグルが製品としての経路)が含まれます。隠れた __forward__forward-socks__dial__attach-window の配管を含む完全な CLI リファレンスは 自動化と CLI にあります。