Eu tenho o Windows 11 com wsl2 (ubuntu) instalado nele.
Eu configurei um servidor de ouvinte gdb no meu localhost do Windows e quero acessá-lo de wsl2. mas parece que minha máquina windows e wsl vm estão usando adaptadores de rede diferentes.
>ipconfig
Windows IP Configuration
Ethernet adapter vEthernet (Default Switch):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::1114:bb:d0ad:93f8%18
IPv4 Address. . . . . . . . . . . : 172.29.192.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
Ethernet adapter vEthernet (WSL):
Connection-specific DNS Suffix . :
Link-local IPv6 Address . . . . . : fe80::897:849a:5fed:1c6e%52
IPv4 Address. . . . . . . . . . . : 172.21.128.1
Subnet Mask . . . . . . . . . . . : 255.255.240.0
Default Gateway . . . . . . . . . :
meu servidor está escutando ativamente na porta 8888 e está acessível nas janelas, mas não no Ubuntu.
Eu abri a porta 8888 tanto do firewall do windows quanto do firewall do ubuntu
Qual é a solução?
localhost
não funciona porque o WSL2 está sendo executado com uma rede virtual (vNIC) criada pela Windows Virtual Machine Platform (um subconjunto do Hyper-V). Dentro do WSL2,localhost
está o endereço do vNIC.O WSL2 configura um roteador virtual no host do Windows para permitir conectividade tanto com o mundo externo quanto com o host do Windows. Você pode ver isso através de:
O endereço "padrão via" é o endereço a ser usado para o host do Windows.
Você pode analisá-lo a partir do acima ou de
/etc/resolv.conf
, mas o WSL também configura um mDNS de conveniência, o.local
domínio, usando o "nome do computador" do Windows, que também é usado como ohostname
da instância do WSL.Acessá-lo é concatenar
$(hostname)
com.local
.Tentar:
Ou, se o ICMP estiver bloqueado (parece assim em novas instalações do Windows 11), use netcat. Está disponível por padrão na instalação do WSL Ubuntu, mas pode precisar ser instalado em outras distribuições como o openSUSE:
Referência: Acessar um host local em execução no Windows de dentro do WSL2?
"Localhost" sempre se refere ao próprio sistema. Quando você está executando um sistema operacional host e um sistema operacional virtualizado, você está executando 2 sistemas, os quais se referem a si mesmos como "localhost". Então você nunca pode acessar "localhost" de outro sistema, você precisa usar seu IP externo.
No seu caso, se você deseja acessar do sistema Ubuntu um serviço que está sendo executado no seu host Windows ouvindo a porta 8888, você precisa acessar
172.29.192.1:8888
. Somente o sistema que está realmente oferecendo o serviço deve escutar a porta e permitir novas conexões de entrada através dessa porta.Como o Ubuntu é um sistema separado, você não terá nada ouvindo a porta 8888, a menos que instale um serviço que ouça essa porta.
Elaborando ainda mais a resposta de @harrymc e @NotTheDr01ds:
Geralmente, você pode contatar os serviços do Windows a partir da linha de comando wsl2 usando
"$(hostname).local"
o nome do host. Se essas conexões parecem estar bloqueadas, você pode tentar o seguinte:Verifique se o Firewall do Windows bloqueia o tráfego. Uma verificação fácil seria desligá-lo por alguns segundos e repetir o teste. Se isso funcionar, adicione as regras de firewall apropriadas.
Problema
nslookup "$(hostname).local"
. Isso lhe dará um monte de IPs. Por padrão, o primeiro será usado, mas pode não ser o que funciona. Experimente os outros também. Se você encontrar um que funcione, você pode personalizar um script curto para seu próprio sistema, que sempre retornará o IP correto.