Puncte:2

Cum se accesează serviciul care rulează pe gazdă de la WSL2 (conexiune refuzată)

drapel cn

Am seleniu care rulează pe mașina mea gazdă, iar aplicația mea se află într-un container docker (în interiorul WSL2).

Încerc să conectez aplicația la selenium, care ascultă pe portul 4445. Funcționa acum câteva luni, cred că ceva s-a schimbat în WSL.

Gazda ascultă la 4445:

PS> netstat -ano | findstr :4445
  TCP 0.0.0.0:4445 0.0.0.0:0 ASCULTARE 11604
  TCP [::]:4445 [::]:0 ASCULTARE 11604

Pot accesa seleniul de pe mașina gazdă Windows:

>curl -X POST http://DESKTOP-HED9HVG:4445/wd/hub
{"stat":".....}

dar nu de la WSL2:

$ curl -X POST http://172.22.241.214:4445/wd/hub
curl: (7) Nu s-a putut conecta la portul 172.22.241.214 4445: Conexiunea a fost refuzată

Am încercat mai multe opțiuni pentru ip-ul pe care l-am folosit în curl:

  • adresa ip eth0 ip
  • $(nume gazdă)
  • adrese IP din rezultatele de ipconfig /all | findstr IPv4
  • rezultat adresa ip a ruta -n | grep UG | cap -n1 | awk „{printează $2}”

Am instalat tcptraceroute pe WSL și l-am rulat. Aceasta este ieșirea:

$ tcptraceroute $(nume gazdă) 4445
Dispozitivul selectat, adresa 127.0.0.1, portul 53915 pentru pachetele de ieșire
Urmărirea căii către DESKTOP-WXYZ1 (127.0.1.1) pe portul TCP 4445, 30 de hopuri maxim
 1 DESKTOP-WXYZ1.localdomain (127.0.1.1) [închis] 0,075 ms 0,082 ms 0,074 ms

Apropo, ping de la WSL la gazdă funcționează:

$ ping $(nume gazdă)
PING DESKTOP-WXYZ1.localdomain (127.0.1.1) 56(84) octeți de date.
64 de octeți de la DESKTOP-WXYZ1.localdomain (127.0.1.1): icmp_seq=1 ttl=64 time=0,053 ms

Am încercat să dezactivez complet firewall-ul Windows, dar nu ajută. De asemenea, am adăugat o regulă în „Windows Defender Firewall” pentru a activa în mod specific portul 4445. Tot nu a ajutat

Informații despre WSL:

>wsl -l -v
  NUME STARE VERSIUNE
* Ubuntu-20.04 Running 2
  docker-desktop Running 2
  docker-desktop-data Rulează 2

Ai idee cum să rezolv asta?

Puncte:2
drapel jp

Vedeți ghidul aici

https://docs.microsoft.com/en-us/windows/wsl/networking#accessing-windows-networking-apps-from-linux-host-ip

Dacă doriți să accesați o aplicație de rețea care rulează pe Windows (de exemplu, o aplicație care rulează pe un server NodeJS sau SQL) din distribuția dvs. Linux (adică Ubuntu), atunci trebuie să utilizați adresa IP a mașinii dvs. gazdă. Deși acesta nu este un scenariu obișnuit, puteți urma acești pași pentru ca acesta să funcționeze.

Obțineți adresa IP a mașinii dvs. gazdă rulând această comandă din distribuția dvs. Linux: cat /etc/resolv.conf Copiați adresa IP după termenul: nameserver. Conectați-vă la orice server Windows folosind adresa IP copiată. Imaginea de mai jos arată un exemplu în acest sens prin conectarea la un server Node.js care rulează în Windows prin curl.

De asemenea, va trebui să permiteți conexiuni de intrare către acel port din gazdă. (Printr-o regulă firewall).

drapel cn
Există o captură cu asta. Dacă rulați docker daemon pe wsl, serverul de nume resolv.conf va indica aparent către gateway-ul wsl din wsl, și nu către ip-ul gazdei Windows.
drapel jp
Îți poți rula în continuare serviciile pe gazdă, iar solicitările din interiorul WSL vor fi direcționate către ei.
drapel cn
Cum le-ai accesa? Presupun că prin host.docker.internal? Acesta este specific pentru desktopul docker și, chiar și atunci când nu este (folosind soluția de soluție gazdă-gateway), atunci va căuta servicii pe WSL ca gazdă pentru demon, nu cele care rulează pe Windows.
drapel jp
Le puteți accesa direct prin IP. Intrarea dns este „numele gazdei” gazdei. Acel IP expune serviciile pe gazda Windows, nu WSL. Oricum, acest lucru nu este legat/specific de docker. Încercați să accesați un serviciu pe gazdă din interiorul unui container?
drapel cn
Cred că ai reușit comunicarea greșită. Vorbesc despre accesarea serviciilor Windows dintr-un container care rulează pe un daemon găzduit de wsl. Solicitările wsl vor ajunge la serviciul Windows, cererile de containere vor căuta servicii pe wsl este ceea ce am întâlnit.
Puncte:0
drapel cn

După multe încercări, soluția a venit dintr-un comentariu obscur în problemele github: https://github.com/Microsoft/WSL/issues/1032#issuecomment-891618766

Pe scurt:

dacă utilizați și Docker Desktop, vă puteți accesa gazda Windows cu host.docker.internal
Puncte:0
drapel cn

De fapt, am întâmpinat această problemă și eu într-un proiect la care lucram pentru serviciu și nu am putut folosi desktopul docker.

Ceea ce trebuia să fac a fost să stabilesc reguli de firewall și portproxy pentru a ocoli firewall-urile wsl și Windows. Veți avea nevoie de ip-ul adaptorului ethernet gazdă, așa că rulați ipconfig în Windows pentru a-l obține. Veți avea nevoie, de asemenea, de portul de ascultare pentru serviciul pe Windows și de ip-ul WSL (ifconfig în wsl, căutând valoarea inet ivp4 a eth0).

Comenzile pentru regulile firewall de la powershell pe gazdă:

New-NetFireWallRule -DisplayName 'WSL firewall unlock' -Direction Outbound -LocalPort your_port_here -Action Allow -Protocol TCP

New-NetFireWallRule -DisplayName 'WSL firewall unlock' -Direction Inbound -LocalPort your_port_here -Action Allow -Protocol TCP

Cu firewall-ul Windows ocolit, puteți apoi „redirecționa” porturile către wsl și dintr-un prompt Windows:

netsh interface portproxy add v4tov4 listenport=your_port_here listenaddress=host_ip_here connectport=your_port_here connectaddress=wsl_ip_here

După ce ați rulat toate comenzile, ar trebui să puteți accesa serviciul gazdă prin <host_ip>:<host_port> din container.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.