Um SO rodando no
WSL2, por padrão, não consegue comunicar com uma VM rodando no
Hyper-V. Por exemplo, a partir de um
Linux no WSL2 não é possível disparar ping contra um outro Linux hospedado no Hyper-V ou mesmo acessá-lo por SSH.
Uma causa pode ser o encaminhamento de pacotes (forwarding) desabilitado na interface e no switch virtual que atende ao WSL2.
Para verificação, se usarmos o
netsh dump para consultarmos as configurações de rede aplicadas no Windows, é possível observar que todas as interfaces estão com o forwarding habilitado - forwarding=enabled (no exemplo estou usando o PowerShell mas o mesmo acontece usando o CMD):
PS C:Usersuser-name>
netsh dump
# ----------------------------------
# Configuração de IPv4
# ----------------------------------
pushd interface ipv4
reset
set global icmpredirects=enabled
add route prefix=0.0.0.0/0 interface="Ethernet" nexthop=10.67.61.1 publish=Sim
set interface interface="Conexão Local* 2" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="VirtualBox Host-Only Network" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Conexão de Rede Bluetooth" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Wi-Fi" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Ethernet" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Npcap Loopback Adapter" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Conexão Local* 3" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="vEthernet (NATSwitch)" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="Conexão Local* 1" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="vEthernet (Default Switch)" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
set interface interface="vEthernet (WSL)" forwarding=enabled advertise=enabled nud=enabled ignoredefaultroutes=disabled
add address name="vEthernet (NATSwitch)" address=192.168.0.1 mask=255.255.255.0
add address name="Ethernet" address=10.67.61.138 mask=255.255.255.0
add address name="vEthernet (Default Switch)" address=172.25.48.1 mask=255.255.240.0
add address name="vEthernet (WSL)" address=172.30.64.1 mask=255.255.240.0
popd
A confirmação da situação virá quando confrontarmos a saída do netsh dump com a saída do comdlet Get-NetIPInterface do PowerShell. No exemplo abaixo, para facilitar a nossa análise, estamos filtrando a saída do Get-NetInterface para que sejam exibidas, em ordem crescente da identificação do objeto e em formato de tabela, algumas propriedades específicas dos objetos.
PS C:Usersuser-name>
Get-NetIPInterface | select ifIndex,InterfaceAlias,AddressFamily,ConnectionState,Forwarding | Sort-Object -Property IfIndex | Format-Table
ifIndex InterfaceAlias AddressFamily ConnectionState Forwarding
1 Loopback Pseudo-Interface 1 IPv6 Connected Disabled
1 Loopback Pseudo-Interface 1 IPv4 Connected Disabled
9 Conexão Local* 2 IPv6 Disconnected Disabled
9 Conexão Local* 2 IPv4 Disconnected Disabled
12 Conexão Local* 3 IPv4 Disconnected Disabled
12 Conexão Local* 3 IPv6 Disconnected Disabled
14 Conexão de Rede Bluetooth IPv4 Disconnected Disabled
14 Conexão de Rede Bluetooth IPv6 Disconnected Disabled
17 vEthernet (NATSwitch) IPv4 Connected Enabled
17 vEthernet (NATSwitch) IPv6 Connected Enabled
20 Wi-Fi IPv4 Disconnected Disabled
20 Wi-Fi IPv6 Disconnected Disabled
26 Ethernet IPv4 Connected Enabled
26 Ethernet IPv6 Connected Enabled
29 vEthernet (Default Switch) IPv4 Connected Disabled
29 vEthernet (Default Switch) IPv6 Connected Disabled
75 vEthernet (WSL) IPv6 Connected Disabled
75 vEthernet (WSL) IPv4 Connected Disabled
Observe que existe uma diferença no estado do forwarding das interfaces vEthernet (WSL) e vEthernet (Default Switch) exibidos nos comandos netsh dump e Get-NetIPInterface.
Como o Linux em execução no WSL2 está associada a interface vEthernet (WSL) e Linux no Hyper-V está conectado ao switch virtual vEthernet (Default Switch), basta habilitarmos o forwarding nessas duas interfaces.
Para fazer isso, precisamos de permissão elevadas. Então, executando o PowerShell como super usuário, vamos usar o cmdlet Set-NetIPInterface para habilitar o forwarding das interfaces desejadas que, neste exemplo, são identificadas pelo ifIndex 29 e 75:
PS C:Usersuser-name>
Set-NetIPInterface -ifIndex 29 -Forwarding Enabled
PS C:Usersuser-name>
Set-NetIPInterface -ifIndex 75 -Forwarding Enabled
Para testar, vamos acessar o host ubuntu02 (em execução no Hyper-V) por SSH a partir do host ubuntu00 (em execução no WSL2) e também disparar um ping nesse mesmo sentido:
ssh root@ubuntu01
ping -c 1 ubuntu01
PING ubuntu01 (192.168.0.21) 56(84) bytes of data.
64 bytes from ubuntu01 (192.168.0.21): icmp_seq=1 ttl=63 time=0.491 ms
--- ubuntu01 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.491/0.491/0.491/0.000 ms