コンテンツにスキップ

ターミナルからポートを転送

会話のターミナルで起動したサーバーは、そのスペース にだけ公開されます。ポートパネルは、このアプリがそこで起動したリスナーを検出してマッピングし、到達したいあらゆる場所から使えるアドレスを提示します。2 つのスペースがどちらも 5173 をリッスンしていても、それぞれのマッピングが混ざることはありません。

ここでの操作がマシンを開放することはありません。すべての経路はリクエストに応じてサーバーが作成し、ターミナルまたはリグとともに消えます。

  1. 会話の ターミナル(VM) またはホストシェル(スペース内または PR ページ上)を開きます。
  2. サーバーを起動します — pnpm dev、python -m http.server 8000、何でもかまいません。
  3. 数秒以内に、ターミナル右上隅の プラグアイコン にドットが付きます。 クリックします。

パネルには、リッスンしているすべてのポートが、それを所有するプロセスとともに 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 上のサーバーに到達できるように なるわけではありません。 ゲストには独自のループバックがあり、ブラウザタブが 同じスペース にあるとき、 サーバーがそのゲストへトンネルを張ります。

同じ会話 でエンクロージャーのブラウザを開きます。localhost:<左側のポート> と入力します — プロセスがバインドした番号です。リマップ(5173 → 3000)の場合も そのブラウザでは右側の番号で応答するため、URL のコピーもそこでは機能します。 エージェントの browser_use はどちらへもナビゲートできます。スペース A の サーバーが、スペース B のブラウザに localhost:5173 として現れることは決して ありません。

LAN IP や --host ではなく、localhost を使ってください。ゲストには独自の ループバックがあり、トンネルはそこで IPv4 と IPv6 の両方をリッスンします。

一度に多数の接続を開くページ(数十のアセット、ライブリロードソケット)は、 その同じトンネルを共有します。ブラウザ(VM)はそれらを 1 つの永続的な exec に 多重化するため、大量のフェッチが接続ごとに 1 プロセスを起動することはなく、 真っ白なページとしてタイムアウトすることもありません。

1 つのスペース内では、同じ番号に対してターミナル(VM)の転送がホストシェルより 優先されます。スペース間には優先順位はありません — それぞれ別のマップです。

そのスペースの Android タブを開きます。エミュレータの localhost:<port> が、 このスペースの公開ポートにリバースされます(adb reverse)。1 つのエミュレータは デバイス全体で共通です。スペース B をアタッチすると :5173 が B に付け替えられ、 A のものは失われます。タブを閉じると、このリグが張ったリバースは削除されます。

iOS シミュレータはすでに Mac そのものです — リバースは不要です。物理的な iPhone には引き続き LAN 共有が必要です。

⋯ → ローカルネットワークで共有 は、ポートを <server-ip>:<random port> で公開します — スマートフォンでページを開くときや、 サーバーが別のマシンで動いているときに便利です。

  • LAN ポートは常に OS が割り当てるもので、ゲストの番号になることはないため、 公開されるのは推測可能な番号ではなく、意図的で目に見えるアドレスになります。
  • 切り替えるまでは非公開(ループバックのみ)のままで、⋯ → ローカルのみ で ネットワークから外せます。

⋯ → ブラウザのドメインを設定(.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 のために開いたままにするリバーストンネルです。 ホストシェルがマシン全体をスキャンすることはありません。サーバーが置いていない リスナーがゲスト内に作成されることは一切なく、すべてはターミナルまたは リグとともに破棄されます。設計は リグとエンクロージャー で説明しています。予約ポートとドメインの正確なルールは リグのリファレンス にあります。