Răspuns scurt pentru WSL1:
Configurați regulile pentru firewall o dată și totul ar trebui să „funcționeze”. Aceasta este cea mai ușoară metodă.
Răspuns scurt pentru WSL2:
După ce aveți lucrurile configurate corect, puteți iniția foarte ușor redirecționarea portului cu o singură comandă din Ubuntu/WSL2:
ssh -f -N -R 8080:localhost:8080 „$(hostname).local”
Detalii despre modul de configurare sunt mai jos. Nu este neapărat ușor, dar totul este o configurare o singură dată.
(Mult) mai multe detalii:
După cum a menționat Steeldriver în comentarii, WSL1 și WSL2 se comportă diferit aici.
Notă secundară doar pentru a clarifica terminologia (deoarece diferă ușor în comentarii): „WSL” se referă la subsistemul în sine care controlează ambele versiuni - WSL1 și WSL2.
Notă secundară 2. Vă rugăm să nu lăsați lungimea acestei postări să vă sperie. eu sunt doar foarte detaliat. Considerând problemă legată de Github este de până la (momentan) 536 de comentarii, cred că sunt destul de concis prin comparație ;-).
WSL1
WSL1 este cu siguranță cazul de utilizare mai ușor. Deoarece este un „strat de traducere” între apelurile de sistem Linux și kernel-ul Windows, acesta utilizează de fapt interfața(e) de rețea Windows „adevărată”. Din acest motiv, vă puteți conecta direct de pe un alt dispozitiv din rețea la un port din WSL1.
Probabil tu do mai trebuie totuși o regulă pentru firewall. Voi acoperi asta în răspunsul WSL2, deoarece este comun pentru ambele. Vezi New-NetFirewall Rule
comanda din secțiunea WSL2. Doar rulați acea comandă (o singură dată) pentru regula firewall.
Cu toate acestea, dacă aplicația dvs. web nu necesită WSL2 (și majoritatea o fac nu), este de obicei mult mai ușor să-l rulați dintr-o instanță WSL1 (sau cel puțin era înainte). Asta fac majoritatea oamenilor. Pe de altă parte, cu noua metodă (cel puțin pentru mine) WSL2/SSH pe care o propun mai jos, nu mai este atât de dureros ca înainte să faci asta în WSL2. Vă las pe voi ce rută să alegeți. În acest moment, consider că oricare dintre ele este la fel de valabil.
Dacă alegeți să utilizați WSL1, aș recomanda să păstrați două instanțe Ubuntu -- Una cu WSL1 și alta cu WSL2. Asta fac.
Pentru a copia instanța WSL2 existentă într-un nou WSL1, părăsiți cel existent și, din PowerShell:
# Ajustați calea de bază după cum doriți
$WSL_ROOT = "$env:USERPROFILE\WSL"
$WSL_IMAGE_NAME = "$(get-date -UFormat `"%Y-%m-%d`") Ubuntu Backup.tar"
mkdir -p „$WSL_ROOT\imagini”
mkdir -p „$WSL_ROOT\instances\Ubuntu_WSL1”
cd $WSL_ROOT
wsl -l -v
# Confirmați numele distribuției - Dacă nu este „Ubuntu”, ajustați următoarea linie după cum este necesar
wsl --export Ubuntu „$WSL_ROOT\images\$WSL_IMAGE_NAME”
wsl --import Ubuntu_WSL1 .\instances\Ubuntu_WSL1\ .\images\$WSL_IMAGE_NAME --versiunea 1
wsl ~ -d Ubuntu_WSL1
În acest moment, vă veți afla într-o instanță Ubuntu WSL1, dar veți fi root, deoarece WSL nu își „amintește” numele de utilizator implicit pentru --import
'd cazuri. Urmați „Metoda 1” din acest raspuns pentru a seta numele de utilizator implicit.
În acest moment, aveți două instanțe WSL Ubuntu, una pentru WSL1 (Ubuntu_WSL1
) și altul pentru WSL2 (probabil Ubuntu
sau poate Ubuntu-20.04
). Dacă utilizați Windows Terminal, acesta le va detecta pe ambele și va crea profiluri pentru lansare. Sau puteți lansa oricând manual folosind wsl ~ -d <distroname>
.
O altă opțiune ar fi cea simplă convertit la WSL1 și să-l folosească exclusiv. Pașii pentru aceasta sunt similari cu copierea acestuia, deoarece probabil că doriți totuși să faceți o copie de rezervă. Din nou, ieșiți din instanță și din PowerShell:
# Ajustați calea de bază după cum doriți
$WSL_ROOT = "$env:USERPROFILE\WSL"
$WSL_IMAGE_NAME = "$(get-date -UFormat `"%Y-%m-%d`") Ubuntu Backup.tar"
mkdir -p „$WSL_ROOT\imagini”
cd $WSL_ROOT
wsl -l -v
# Confirmați numele distribuției - Dacă nu este „Ubuntu”, ajustați următoarea linie după cum este necesar
wsl --export Ubuntu „$WSL_ROOT\images\$WSL_IMAGE_NAME”
wsl --set-version Ubuntu 1
Nu este nevoie să resetați numele de utilizator implicit în acest caz.
WSL2
WSL2 începe să devină mult mai complicat. Deși există un link în comentarii către un document despre cum să o faceți, vă voi indica problema originală Github și comentariu asta chiar a pus oamenii în această direcție.
Există două probleme reale care trebuie rezolvate pentru ca acest lucru să funcționeze în WSL2:
În primul rând, rețeaua WSL2 este o rețea virtuală (de fapt o vNIC Hyper-V). Nu se află în „rețeaua de birouri”, așa cum menționați în întrebarea dvs. Mai întâi trebuie să aveți o modalitate de a spune gazdei Windows să direcționeze pachetele către rețeaua virtuală WSL2 pentru acel port.
Această redirecționare este complicată de faptul că adresa rețelei virtuale WSL2 se modifică la fiecare repornire (sau wsl --oprire
). Asta înseamnă (cel puțin cu metoda documentată în comentarii și acea problemă Github) că trebuie să repeți procesul de:
- Găsirea adresei IP WSL2
- Stergerea vechilor reguli de firewall
- Ștergerea vechilor reguli de redirecționare
- Crearea de noi reguli de firewall
- Crearea de noi reguli de redirecționare
... de fiecare dată când reporniți. Ce durere, nu?!
Așa că o să propun ceea ce cred că este o metodă mai ușoară. Puteți încă să reveniți la cealaltă metodă dacă doriți. Aceasta are unele puțin configurație complicată, dar aproape toate trebuie făcute o singura data.
Această metodă utilizează SSH pentru a furniza redirecționarea portului. Deoarece aceasta este inițializată de la capătul WSL2, are câteva avantaje:
În primul rând, se poate face ca parte a aceluiași pas atunci când rulați aplicația (server web). Nu menționați arhitectura/limbajul aplicației, dar voi presupune că unul dintre cele mai comune -- Node. Dacă acesta este cazul, probabil că îl puteți include chiar și în dvs rulare npm
scenariu. Există aproape sigur o tehnică care va funcționa pentru orice arhitectură.
Cel mai important, nu are nevoie de adresa IP a WSL2. Acest lucru evită necesitatea de a face 4 dintre acești pași de mai sus de fiecare dată când reporniți.
Deci, iată-ne. În primul rând, există configurația „o singură dată”:
Activați serverul Windows OpenSSH. Puteți urmări Microsoft instrucțiuni, dar voi rezuma aici. Începeți prin a deschide un prompt PowerShell ca administrator, apoi:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Set-Service -Name sshd -StartupType 'Automatic'
Acest lucru ar trebui să creeze automat regulile de redirecționare SSH. Din nou, vezi doc dacă întâmpinați vreo problemă.
Editați | × C:\ProgramData\ssh\sshd_config
și asigură-te că GatewayPorts da
nu este comentat. Cred că este dezactivat implicit.
Înapoi în PowerShell de administrator, rulați:
Start-Service sshd
Nu menționați numărul portului pe care rulează aplicația dvs. web, așa că voi alege 8080
de dragul acestor exemple. Ajustați după cum este necesar. Încă în admin PowerShell, rulați:
New-NetFirewallRule -DisplayName 8080 -Direction Inbound -LocalPort 8080 -Protocol TCP -Action Allow -Profil Privat
Acest:
- Permite traficul TCP de intrare
- Pe portul 8080
- De pe dispozitivele din rețeaua privată
Dacă rețeaua dvs. este setată Public
, aruncați -Profil Privat
Ieșiți din PowerShell de administrator
Cu asta din drum, totul este la locul lui. Pentru a începe redirecționarea în acest moment, executați următoarele din Ubuntu/WSL2:
ssh -f -N -R 8080:localhost:8080 „$(hostname).local”
Foloseste-ti Windows nume de utilizator și parolă.
În acest moment, ar trebui să aveți acces la aplicația dvs. web de pe alt computer (sau telefon, sau orice altceva) din aceeași rețea de birou.
Explicaţie:
- Se conectează din Ubuntu/WSL2
- La serverul OpenSSH pe care l-am configurat
- Folosind
„$(nume gazdă).local”
care (ar trebui) să găsească întotdeauna numele DNS corect prin mDNS (explicația în acest raspuns.
- Nu alocă un terminal (
-N
) și rulează în fundal (-f
) după solicitarea acreditărilor de conectare
- Îi spune gazdei SSH la distanță (Windows) să redirecționeze traficul primit pe portul său 8080 către portul local (WSL2) 8080.
- Pentru că noi am precizat
GatewayPorts da
în configurația serverului, aceasta înseamnă că va extinde acea redirecționare către alte gazdele din rețea.