Acessar aplicativos de rede com o WSL

Há algumas considerações a se ter em mente ao trabalhar com aplicativos de rede e WSL. Por padrão, o WSL usa uma arquitetura baseada em NAT e recomendamos experimentar o novo Modo de rede espelhada para obter os recursos e melhorias mais recentes.

Modo de rede padrão: NAT

Por padrão, o WSL usa uma arquitetura baseada em Conversão de Endereços de Rede (NAT) para rede. Tenha as seguintes considerações em mente ao trabalhar com uma arquitetura de rede baseada em NAT:

Como acessar aplicativos de rede do Linux no Windows (localhost)

Se você estiver criando um aplicativo de rede (por exemplo, um aplicativo em execução em um NodeJS ou SQL Server) em sua distribuição do Linux, poderá acessá-lo de um aplicativo do Windows (como seu navegador de Internet Microsoft Edge ou Chrome) usando localhost (assim como faria normalmente).

Como acessar aplicativos de rede do Windows no Linux (IP do host)

Se quiser acessar um aplicativo de rede em execução no Windows (por exemplo, um aplicativo em execução em um NodeJS ou SQL Server) de sua distribuição do Linux (por exemplo, Ubuntu), você precisará usar o endereço IP do seu computador host. Embora esse não seja um cenário comum, você pode seguir estas etapas para fazê-lo funcionar.

  1. Obtenha o endereço IP do seu computador host executando este comando da sua distribuição do Linux: ip route show | grep -i default | awk '{ print $3}'
  2. Conecte-se a qualquer servidor Windows usando o endereço IP copiado.

A imagem abaixo mostra um exemplo disso por meio da conexão com um servidor Node.js em execução no Windows via curl.

Conectar-se ao servidor NodeJS no Windows via Curl

Conectar-se via endereços IP remotos

Ao usar endereços IP remotos para se conectar aos seus aplicativos, eles serão tratados como conexões de LAN (rede local). Isso significa que você precisará verificar se seu aplicativo pode aceitar conexões de LAN.

Por exemplo, talvez seja necessário associar seu aplicativo a 0.0.0.0 em vez de 127.0.0.1. No exemplo de um aplicativo Python usando Flask, isso pode ser feito com o comando: app.run(host='0.0.0.0'). Lembre-se da segurança ao fazer essas alterações, pois isso permitirá conexões de sua LAN.

Como acessar uma distribuição do WSL 2 usando a LAN (rede local)

Ao usar uma distribuição do WSL 1, se o computador tiver sido configurado para ser acessado pela sua LAN, os aplicativos executados no WSL também poderão ser acessados em sua LAN.

Esse não é o caso padrão no WSL 2. O WSL 2 tem um adaptador Ethernet virtualizado com um endereço IP exclusivo. No momento, para habilitar esse fluxo de trabalho, será necessário percorrer as mesmas etapas que você faria para uma máquina virtual normal. (Estamos analisando maneiras de aprimorar essa experiência.)

Aqui está um exemplo de como usar o comando portproxy do Windows da interface Netsh para adicionar um proxy de porta que escuta na porta do host e conecta esse proxy de porta ao endereço IP da VM do WSL 2.

netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)

Neste exemplo, você precisará atualizar <yourPortToForward> para um número de porta, por exemplo listenport=4000. listenaddress=0.0.0.0 significa que as solicitações de entrada serão aceitas de QUALQUER endereço IP. O Endereço de Escuta especifica o endereço IPv4 para o qual escutar e pode ser alterado para valores que incluem: endereço IP, nome NetBIOS do computador ou nome DNS do computador. Se um endereço não for especificado, o padrão é o computador local. Você precisa atualizar o valor <yourPortToConnectToInWSL> para um número de porta ao qual você deseja que o WSL se conecte, por exemplo connectport=4000. Por fim, o valor connectaddress precisa ser o endereço IP da distribuição do Linux instalada por meio do WSL 2 (o endereço de VM do WSL 2), que pode ser encontrado inserindo o comando: wsl.exe hostname -I.

Portanto, esse comando pode ser semelhante a:

netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100

Para obter o endereço IP, use:

  • wsl hostname -I para o endereço IP da sua distribuição do Linux instalada por meio do WSL 2 (o endereço da VM do WSL 2)
  • cat /etc/resolv.conf para o endereço IP do computador Windows, como visto no WSL 2 (a VM do WSL 2)

Usar listenaddress=0.0.0.0 escutará em todas as portas IPv4.

Observação

Usar um "i" minúsculo com o comando hostname irá gerar um resultado diferente do uso de um "I" maiúsculo. wsl hostname -i é o computador local (127.0.1.1 é um endereço de diagnóstico de espaço reservado), enquanto wsl hostname -I retornará o endereço IP do computador local como visto por outros computadores e deverá ser usado para identificar a connectaddress da sua distribuição do Linux em execução por meio do WSL 2.

Acesso IPv6

  • wsl hostname -i para o endereço IP da sua distribuição do Linux instalada por meio do WSL 2 (o endereço da VM do WSL 2)
  • ip route show | grep -i default | awk '{ print $3}' para o endereço IP do computador Windows, como visto no WSL 2 (a VM do WSL 2)

Usar listenaddress=0.0.0.0 escutará em todas as portas IPv4.

Rede de Modo espelhado

Você pode definir networkingMode=mirrored em [wsl2] no arquivo.wslconfig para habilitar a rede de modo espelhado. Habilitar isso altera o WSL para uma arquitetura de rede totalmente nova, que tem o objetivo de "espelhar" as interfaces de rede que você tem no Windows no Linux, para adicionar novos recursos de rede e melhorar a compatibilidade.

Aqui estão os benefícios atuais para habilitar este modo:

  • Suporte a IPv6
  • Conectar-se a servidores Windows de dentro do Linux usando o endereço de localhost 127.0.0.1. Não há suporte para o endereço de localhost IPv6 ::1
  • Compatibilidade de rede aprimorada para VPNs
  • Suporte a multicast
  • Conectar-se ao WSL diretamente da LAN (rede local)

Observação

Execute o seguinte comando na janela do PowerShell com privilégios de administrador para Definir as configurações de firewall do Hyper-V para permitir conexões de entrada: Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow ou New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80.

Esse novo modo aborda os problemas de rede vistos com o uso de uma arquitetura baseada em Conversão de Endereços de Rede (NAT). Encontre problemas conhecidos ou comentários de arquivo sobre quaisquer bugs identificados no repositório de produtos WSL no GitHub.

Túnel DNS

Configurar dnsTunneling=true em [wsl2] no .wslconfigarquivo faz com que o WSL use um recurso de virtualização para responder a solicitações DNS de dentro do WSL, em vez de solicitá-las por meio de um pacote de rede. Esse recurso visa melhorar a compatibilidade com VPNs e outras configurações de rede complexas.

Proxy automático

Configurar autoProxy=true em [wsl2] no arquivo .wslconfig impõe que o WSL use as informações de proxy HTTP do Windows. Se você já tiver um proxy configurado no Windows, habilitar esse recurso também fará com que esse proxy seja definido automaticamente no WSL.

WSL e firewall

Em computadores que executam o Windows 11 22H2 e superior, com o WSL 2.0.9 e superior, o recurso de firewall do Hyper-V estará ativado por padrão. Isso garantirá que: