Compartilhar via


Acessando aplicativos de rede com WSL

Há algumas considerações a serem consideradas 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 espelhado para obter os recursos e melhorias mais recentes.

Identificar o endereço IP

Há dois cenários a serem considerados ao identificar o endereço IP usado para uma distribuição do Linux em execução por meio do WSL:

Cenário um: Do ponto de vista do host do Windows, você deseja consultar o endereço IP de uma distribuição Linux em execução por meio do WSL2, para que um programa no host do Windows possa se conectar a um programa de servidor em execução dentro da distribuição (instância).

O host do Windows pode usar o comando:

wsl -d <DistributionName> hostname -I

Se estiver consultando a distribuição padrão, essa parte do comando que designa a distribuição poderá ser omitida: -d <DistributionName>. Certifique-se de usar um sinalizador maiúsculo -I e não um minúsculo -i.

Sob o capô, o comando wsl.exe inicializa a instância de destino e executa o comando Linux hostname -I (notação curta para --all-ip-addresses). Em seguida, esse comando imprime o endereço IP da instância do WSL para STDOUT. Em seguida, o conteúdo do texto STDOUT é então retransmitido para wsl.exe. Por fim, wsl.exe exibe essa saída para a linha de comando.

Uma saída típica pode ser:

172.30.98.229

Cenário Dois: Um programa em execução dentro de uma distribuição do Linux por meio do WSL2 (instância) deseja saber o endereço IP do host do Windows para que um programa Linux possa se conectar a um programa de servidor host do Windows.

O usuário do WSL2 Linux pode usar o comando:

ip route show | grep -i default | awk '{ print $3}'

Uma saída típica pode ser:

172.30.96.1

Portanto, 172.30.96.1 é o endereço IP do host para Windows, neste exemplo.

Observação

Estas ações de consulta de endereço IP acima normalmente são necessárias quando o WSL2 está em execução com o modo de rede NAT padrão. Quando o WSL2 está em execução com o novo modo espelhado, o host do Windows e a VM WSL2 podem se conectar entre si usando localhost (127.0.0.1) como o endereço de destino, portanto, o truque de usar o endereço IP de um par de consultas não é necessário.

Modo de rede padrão: NAT

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

Acessando aplicativos de rede linux do 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 edge ou Chrome na Internet) usando localhost (assim como você normalmente faria).

Acessando aplicativos de rede do Windows do Linux (IP do host)

Se você 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 (ou seja, Ubuntu), será necessário usar o endereço IP do computador host. Embora este não seja um cenário comum, você pode seguir estas etapas para que funcione.

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

A imagem abaixo mostra um exemplo disso conectando-se a um servidor Node.js em execução no Windows via curl.

Conectar-se ao servidor NodeJS no Windows via Curl

Conectando-se por meio de endereços IP remotos

Ao usar endereços IP remotos para se conectar aos seus aplicativos, eles serão tratados como conexões da LAN (Rede de Área Local). Isso significa que você precisará garantir que seu aplicativo possa aceitar conexões LAN.

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

Acessando uma distribuição do WSL 2 na rede local (LAN)

Ao usar uma distribuição do WSL 1, se o computador tiver sido configurado para ser acessado pela 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 seu próprio endereço IP exclusivo. Atualmente, para habilitar esse fluxo de trabalho, você precisará passar pelas mesmas etapas que faria para uma máquina virtual regular. (Estamos procurando maneiras de melhorar essa experiência.)

Aqui está um exemplo de como usar o comando netsh interface portproxy do Windows 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 <yourPortToConnectToInWSL> valor para um número de porta em que deseja que o WSL se conecte, por exemplo connectport=4000. Por fim, o connectaddress valor precisa ser o endereço IP da distribuição do Linux instalada por meio do WSL 2 (o endereço da VM do WSL 2), que pode ser encontrado inserindo o comando: wsl.exe hostname -I.

Portanto, este 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 distribuição do Linux instalada por meio do WSL 2 (o endereço da VM do WSL 2)
  • cat /etc/resolv.conf para endereço IP da máquina Windows, visto a partir do WSL 2 (a VM do WSL 2)

O uso de listenaddress=0.0.0.0 ouvirá em todas as portas IPv4.

Observação

Usar um "i" minúsculo com o comando hostname 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 distribuição do Linux em execução por meio do WSL 2.

Acesso ao IPv6

  • wsl hostname -i para o endereço IP da 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 endereço IP da máquina Windows, visto a partir do WSL 2 (a VM do WSL 2)

O uso de listenaddress=0.0.0.0 ouvirá em todas as portas IPv4.

Rede de modo espelhado

Em computadores que executam o Windows 11 22H2 e superior, você pode configurar networkingMode=mirrored sob [wsl2] no arquivo .wslconfig para habilitar o modo de rede 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
  • Conecte-se a servidores Windows de dentro do Linux usando o endereço 127.0.0.1localhost. Não há suporte para o endereço ::1 localhost IPv6
  • 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 Hyper-V configurações de firewall 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 NAT (Conversão de Endereços de Rede). Encontre problemas conhecidos ou comentários de arquivo sobre quaisquer bugs identificados no repositório de produtos WSL no GitHub.

Túnel DNS

Em máquinas que executam o Windows 11 22H2 ou superior, definir dnsTunneling=true sob [wsl2] no arquivo .wslconfig faz com que o WSL use uma funcionalidade de virtualização para responder a solicitações DNS de dentro do WSL, em vez de requisitá-las via pacotes de rede. Esse recurso visa melhorar a compatibilidade com VPNs e outras configurações de rede complexas.

Proxy Automático

Em computadores que executam o Windows 11 22H2 e superior, definir autoProxy=true sob [wsl2] no arquivo .wslconfig obriga o WSL a usar 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 Hyper-V será ativado por padrão. Isso garantirá que: