Hoppa till innehåll

Vidarebefordra portar från en terminal

En server som du startar i ett samtals terminal publiceras bara för den ytan. Portpanelen upptäcker lyssnare som den här appen har startat där, mappar dem och ger dig en adress för varje plats du kan tänkas nå dem från. Två ytor kan båda lyssna på 5173; deras mappningar blandas aldrig.

Ingenting här öppnar upp maskinen: varje väg skapas av servern, på begäran, och dör med terminalen eller stationen.

  1. Öppna samtalets Terminal (VM) eller värdskal (i en yta eller på en PR-sida).
  2. Starta din server – pnpm dev, python -m http.server 8000, vad som helst.
  3. Inom några sekunder får kontaktikonen i terminalens övre högra hörn en prick. Klicka på den.

Panelen listar varje lyssnande port med processen som äger den, som 3000 → 3000: porten som processen band till till vänster, porten som den svarar på lokalt till höger (samma nummer närhelst den var ledig på din maskin). Varje rad säger också om localhost på skrivbordet, Webbläsare (VM) och Android kan nå den.

Upptäckten är avgränsad: en Terminal (VM) avfrågas inuti den gästen; ett värdskal avfrågas från den sessionens PTY-processträd. Andra ytor, och andra processer på din Mac, listas inte.

Nya portar i den här terminalen vidarebefordras automatiskt. Stäng av Vidarebefordra portar automatiskt i samma panel om du bara vill ha dem du lägger till själv.

Använd Kopiera lokal URL på raden – http://localhost:3000. Vidarebefordran lyssnar bara på loopback, så ingenting annat i ditt nätverk kan se den.

Om två ytor båda exponerar gästporten 5173 och din maskin redan har 127.0.0.1:5173, behåller den andra ytan gästporten 5173 och får en tillfällig lokal port. Kopiera lokal URL använder siffran till höger.

I ett värdskal finns processen redan på din maskin. Att mappa samma lokala port har ingen effekt; väljer du en annan lokal port binds en loopback-proxy till den du valde.

--host (eller att binda 0.0.0.0) gör inte att en avskild Webbläsare (VM) kan nå en server på Macen. Gästen har sin egen loopback; servern planterar en tunnel in i den gästen när fliken Webbläsare finns i samma yta.

Öppna den avskilda webbläsaren i samma samtal. Skriv localhost:<left-hand port> – numret som processen band till. En ommappning (5173 → 3000) svarar också på numret till höger i den webbläsaren, så Kopiera lokal URL fungerar där också. En agents browser_use kan navigera till någon av dem. En server i yta A visas aldrig som localhost:5173 i yta B:s webbläsare.

Använd localhost, inte en LAN-IP och inte --host. Gästen har sin egen loopback; tunneln lyssnar där på både IPv4 och IPv6.

Sidor som öppnar många anslutningar på en gång (dussintals resurser, en live reload-socket) delar samma tunnel. Webbläsare (VM) multiplexar dem över en enda persistent exec, så en skur av hämtningar startar inte en process per anslutning och slår inte i tidsgränsen som en vit sida.

Inom en yta vinner en vidarebefordran från Terminal (VM) över ett värdskal på samma nummer. Mellan ytor finns ingen prioritet – de är åtskilda mappningar.

Öppna den ytans Android-flik. Emulatorns localhost:<port> vänds då mot den här ytans publicerade port (adb reverse). En emulator är enhetsglobal: ansluter du yta B riktas :5173 om till B och A:s försvinner. Stäng fliken, och de omvända vidarebefordringar som den här stationen lade upp tas bort.

iOS-simulatorn är redan Macen – ingen omvändning. En fysisk iPhone behöver fortfarande en LAN-delning.

⋯ → Dela på det lokala nätverket publicerar porten på <server-ip>:<random port> – användbart för att öppna sidan i telefonen, eller när servern körs på en annan maskin.

  • LAN-porten tilldelas alltid av operativsystemet, aldrig gästens nummer, så exponeringen är en avsiktlig, synlig adress i stället för en som går att gissa.
  • Den förblir privat (endast loopback) tills du slår om den, och ⋯ → Endast lokalt tar den av nätverket igen.

⋯ → Ange en webbläsardomän (.test) tilldelar porten en dev-domän som myapp.test. I Webbläsare (VM) laddar https://myapp.test då din server med ett giltigt hänglås – användbart för allt som beter sig annorlunda på en namngiven origin eller i en säker kontext (cookies, service workers, OAuth-callbackar).

  • Domäner måste sluta på .test eller .localhost – de två toppdomäner som är reserverade för utveckling, så ett dev-namn aldrig kan skugga en riktig webbplats.
  • Domännamn är unika på servern; portnummer är det inte. Två ytor får båda använda 5173, men de kan inte båda göra anspråk på myapp.test.
  • Certifikatet kommer från en lokal certifikatutfärdare som skapas på din server första gången det behövs. Dess nycklar ligger under serverns datakatalog och hamnar aldrig i någon gäst; den avskilda webbläsaren litar på exakt den enda nyckeln, så TLS mot det riktiga internet valideras fortfarande normalt.
  • Domänen löses bara inuti Webbläsare (VM). Din egen webbläsare på värden använder localhost:<port> i stället.
  • Även vanlig http://myapp.test fungerar.

Lägg till port längst ned i panelen mappar en port innan (eller oavsett om) något lyssnar på den. En manuell vidarebefordran behåller sin adress medan din server startar om – raden visar lyssnar inte tills den är tillbaka – medan automatiska vidarebefordringar försvinner när deras port gör det. I ett värdskal kan du också ange en annan lokal port.

Portar är nycklade efter arbetsyta och yta. Hypervisorns egen portmappning är fast när en maskin startar, så en Terminal (VM) färdas över två smala kanaler som servern styr: en i förväg skapad inkommande bana in i gästen som vägrar ansluta till någon port som gästen faktiskt inte lyssnar på, och omvända tunnlar som servern håller öppna för Webbläsare (VM) och Android. Ett värdskal skannar aldrig hela maskinen. Ingen lyssnare skapas någonsin inuti en gäst som servern inte själv har satt dit, och allt rivs ned med terminalen eller stationen. Designen förklaras i Stationer och avskilda miljöer; de exakta reserverade portarna och domänreglerna finns i stationsreferensen.