ターミナルからポートを転送
会話のターミナルで起動したサーバーは、そのスペース にだけ公開されます。ポートパネルは、このアプリがそこで起動したリスナーを検出してマッピングし、到達したいあらゆる場所から使えるアドレスを提示します。2 つのスペースがどちらも 5173 をリッスンしていても、それぞれのマッピングが混ざることはありません。
ここでの操作がマシンを開放することはありません。すべての経路はリクエストに応じてサーバーが作成し、ターミナルまたはリグとともに消えます。
何がリッスンしているかを確認する
「何がリッスンしているかを確認する」というセクション- 会話の ターミナル(VM) またはホストシェル(スペース内または PR ページ上)を開きます。
- サーバーを起動します —
pnpm dev、python -m http.server 8000、何でもかまいません。 - 数秒以内に、ターミナル右上隅の プラグアイコン にドットが付きます。 クリックします。
パネルには、リッスンしているすべてのポートが、それを所有するプロセスとともに
3000 → 3000 の形式で一覧表示されます。左がプロセスがバインドしたポート、
右がローカルで応答するポートです(マシン上で空いていれば同じ番号になります)。
各行には、デスクトップの localhost、ブラウザ(VM)、Android から到達できる
かどうかも表示されます。
検出は閉じた範囲で行われます。ターミナル(VM)はそのゲスト内でポーリングされ、 ホストシェルはそのセッションの PTY プロセスツリーからポーリングされます。 他のスペースや、あなたの Mac 上の他のプロセスは一覧に含まれません。
この ターミナルで新しく開いたポートは自動的に転送されます。自分で追加した ポートだけを使いたい場合は、同じパネルで ポートを自動転送 をオフにします。
このコンピュータから到達する
「このコンピュータから到達する」というセクション行の ローカル URL をコピー を使います — http://localhost:3000。転送は
ループバック上だけでリッスンするため、あなたのネットワーク上の他のものからは
見えません。
2 つのスペースがどちらもゲストの 5173 を公開していて、あなたのマシンがすでに
127.0.0.1:5173 を保持している場合、2 つ目のスペースはゲストの 5173 を保った
まま、一時的なローカルポートを取得します。URL のコピーには右側の番号が使われます。
ホストシェルでは、プロセスはすでにあなたのマシン上にあります。同じローカル ポートをマッピングしても何も起こりません。別の ローカルポートを選ぶと、 選んだポートにループバックプロキシがバインドされます。
--host(または 0.0.0.0 へのバインド)を使っても、エンクロージャー内の
ブラウザ(VM)が Mac 上のサーバーに到達できるように なるわけではありません。
ゲストには独自のループバックがあり、ブラウザタブが 同じスペース にあるとき、
サーバーがそのゲストへトンネルを張ります。
ブラウザ(VM)から到達する
「ブラウザ(VM)から到達する」というセクション同じ会話 でエンクロージャーのブラウザを開きます。localhost:<左側のポート>
と入力します — プロセスがバインドした番号です。リマップ(5173 → 3000)の場合も
そのブラウザでは右側の番号で応答するため、URL のコピーもそこでは機能します。
エージェントの browser_use はどちらへもナビゲートできます。スペース A の
サーバーが、スペース B のブラウザに localhost:5173 として現れることは決して
ありません。
LAN IP や --host ではなく、localhost を使ってください。ゲストには独自の
ループバックがあり、トンネルはそこで IPv4 と IPv6 の両方をリッスンします。
一度に多数の接続を開くページ(数十のアセット、ライブリロードソケット)は、 その同じトンネルを共有します。ブラウザ(VM)はそれらを 1 つの永続的な exec に 多重化するため、大量のフェッチが接続ごとに 1 プロセスを起動することはなく、 真っ白なページとしてタイムアウトすることもありません。
1 つのスペース内では、同じ番号に対してターミナル(VM)の転送がホストシェルより 優先されます。スペース間には優先順位はありません — それぞれ別のマップです。
Android から到達する
「Android から到達する」というセクションそのスペースの Android タブを開きます。エミュレータの localhost:<port> が、
このスペースの公開ポートにリバースされます(adb reverse)。1 つのエミュレータは
デバイス全体で共通です。スペース B をアタッチすると :5173 が B に付け替えられ、
A のものは失われます。タブを閉じると、このリグが張ったリバースは削除されます。
iOS シミュレータはすでに Mac そのものです — リバースは不要です。物理的な iPhone には引き続き LAN 共有が必要です。
ネットワークで共有する
「ネットワークで共有する」というセクション⋯ → ローカルネットワークで共有 は、ポートを
<server-ip>:<random port> で公開します — スマートフォンでページを開くときや、
サーバーが別のマシンで動いているときに便利です。
- LAN ポートは常に OS が割り当てるもので、ゲストの番号になることはないため、 公開されるのは推測可能な番号ではなく、意図的で目に見えるアドレスになります。
- 切り替えるまでは非公開(ループバックのみ)のままで、⋯ → ローカルのみ で ネットワークから外せます。
名前を付ける — HTTPS 付きで
「名前を付ける — HTTPS 付きで」というセクション⋯ → ブラウザのドメインを設定(.test) は、ポートに myapp.test のような
開発ドメインを割り当てます。ブラウザ(VM)内では、https://myapp.test が有効な
鍵アイコン付きであなたのサーバーを読み込みます — 名前付きオリジンやセキュア
コンテキストで挙動が変わるもの(Cookie、Service Worker、OAuth コールバック)に
便利です。
- ドメインは
.testまたは.localhostで終わる必要があります — 開発用に予約 された 2 つの TLD なので、開発用の名前が本物のサイトを覆い隠すことは決して ありません。 - ドメイン 名 はサーバー上で一意ですが、ポート 番号 はそうではありません。
2 つのスペースがどちらも
5173を使うことはあっても、両方がmyapp.testを 要求することはできません。 - 証明書は、初めて必要になったときにあなたのサーバー上で発行されるローカル認証局 から提供されます。その鍵はサーバーのデータディレクトリの下にあり、どのゲストにも 入りません。エンクロージャーのブラウザはまさにその 1 つの鍵だけを信頼するため、 実際のインターネットへの TLS は通常どおり検証されます。
- ドメインは ブラウザ(VM)内でのみ 解決されます。ホスト上のあなた自身の
ブラウザは、代わりに
localhost:<port>を使います。 - プレーンな
http://myapp.testも機能します。
手動でポートを転送する
「手動でポートを転送する」というセクションパネル下部の ポートを追加 は、何かがリッスンする前(またはリッスンしている かどうかに関係なく)にポートをマッピングします。手動転送はサーバーが再起動して いる間もアドレスを保ちます — サーバーが戻るまで、その行は 未リッスン と表示 されます — 一方、自動転送はポートが消えるとともになくなります。ホストシェルでは、 別のローカルポートも設定できます。
どのように閉じた範囲を保つか
「どのように閉じた範囲を保つか」というセクションポートはワークスペースとスペースでキー付けされます。ハイパーバイザー自身の ポートマップはマシンの起動時に固定されるため、ターミナル(VM)はサーバーが 制御する 2 つの狭いチャネルに乗ります。1 つはゲストへの事前作成された受信用の レーンで、ゲストが実際にリッスンしていないポートへの接続を拒否します。もう 1 つは、 サーバーがブラウザ(VM)と Android のために開いたままにするリバーストンネルです。 ホストシェルがマシン全体をスキャンすることはありません。サーバーが置いていない リスナーがゲスト内に作成されることは一切なく、すべてはターミナルまたは リグとともに破棄されます。設計は リグとエンクロージャー で説明しています。予約ポートとドメインの正確なルールは リグのリファレンス にあります。
- エージェントにテスト用マシンを渡す — リグを開き、 見守り、引き継ぐ
- リグのリファレンス — 予約ポート、開発 TLD、 デフォルト