Acceso a aplicaciones de red con WSL

Hay algunas consideraciones que debe tener en cuenta al trabajar con aplicaciones de red y WSL. De forma predeterminada, WSL usa una arquitectura basada en NAT y se recomienda probar el nuevo modo de red reflejado para obtener las características y mejoras más recientes.

Modo de red predeterminado: NAT

De forma predeterminada, WSL usa una arquitectura basada en NAT (traducción de direcciones de red) para las redes. Tenga en cuenta las siguientes consideraciones al trabajar con una arquitectura de red basada en NAT:

Acceso a las aplicaciones de red de Linux desde Windows (localhost)

Si vas a crear una aplicación de red (por ejemplo, una aplicación que se ejecute en NodeJS o SQL Server) en la distribución de Linux, puedes acceder a ella desde una aplicación de Windows (como el explorador de Internet Edge o Chrome) mediante localhost (como lo harías de manera habitual).

Acceso a aplicaciones de red de Windows desde Linux (dirección IP del host)

Si quieres acceder a una aplicación de red que se ejecuta en Windows (por ejemplo, una aplicación que se ejecuta en NodeJS o SQL Server) desde tu distribución de Linux (por ejemplo, Ubuntu), debes usar la dirección IP de la máquina host. Aunque no se trata de un escenario común, puedes seguir estos pasos para que funcione.

  1. Para obtener la dirección IP de la máquina host, ejecuta este comando desde la distribución de Linux: ip route show | grep -i default | awk '{ print $3}'
  2. Conéctate a cualquier servidor de Windows con la dirección IP copiada.

La imagen siguiente muestra un ejemplo con la conexión a un servidor de Node.js que se ejecuta en Windows a través de curl.

Conexión al servidor de NodeJS en Windows a través de cURL

Conexión a través de direcciones IP remotas

Si se usan direcciones IP remotas para conectarse a las aplicaciones, estas se tratarán como conexiones desde la red de área local (LAN). Esto significa que tendrás que asegurarte de que la aplicación puede aceptar conexiones LAN.

Por ejemplo, es posible que tengas que enlazar la aplicación a 0.0.0.0 en lugar de a 127.0.0.1. En el ejemplo de una aplicación de Python que usa Flask, esto se puede hacer con el comando app.run(host='0.0.0.0'). Tenga en cuenta la seguridad al realizar estos cambios, ya que esto permitirá las conexiones desde la LAN.

Acceso a la distribución de WSL 2 desde la red de área local (LAN)

Al usar una distribución de WSL 1, si el equipo está configurado para ser accesible desde la LAN, también se podrá acceder a las aplicaciones que se ejecuten en WSL en la LAN.

Esto no ocurre de forma predeterminada en WSL 2. WSL 2 tiene un adaptador Ethernet virtualizado con su propia dirección IP única. Actualmente, para habilitar este flujo de trabajo, tendrás que seguir los mismos pasos que para una máquina virtual normal. (Estamos buscando maneras de mejorar esta experiencia).

A continuación se muestra un ejemplo de uso del comando Netsh interface portproxy Windows para añadir un proxy de puerto que escucha en el puerto de su host y conecta ese proxy de puerto a la dirección IP para la VM WSL 2.

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

En este ejemplo, deberá actualizar <yourPortToForward> a un número de puerto, por ejemplo listenport=4000. listenaddress=0.0.0.0 significa que las solicitudes entrantes se aceptarán desde CUALQUIER dirección IP. La dirección de escucha especifica la dirección IPv4 para la que se va a escuchar y se puede cambiar a valores que incluyen: dirección IP, nombre NetBIOS del equipo o nombre DNS del equipo. Si no se especifica una dirección, el valor predeterminado es el equipo local. Debe actualizar el valor <yourPortToConnectToInWSL> a un número de puerto al que desee que WSL se conecte, por ejemplo connectport=4000. Por último, el valor connectaddress debe ser la dirección IP de la distribución de Linux instalada a través de WSL 2 (la dirección de máquina virtual de WSL 2), que se puede encontrar escribiendo el comando: wsl.exe hostname -I.

Por lo tanto, este comando puede tener un aspecto similar al siguiente:

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

Para obtener la dirección IP, use:

  • wsl hostname -I para la dirección IP de la distribución de Linux instalada a través de WSL 2 (la dirección de máquina virtual de WSL 2)
  • cat /etc/resolv.conf para la dirección IP de la máquina Windows como se ve en WSL 2 (la máquina virtual WSL 2)

Con listenaddress=0.0.0.0 se escuchará en todos los puertos IPv4.

Nota:

El uso de "i" en minúsculas con el comando hostname generará un resultado diferente al de usar una "I" mayúscula. wsl hostname -i es la máquina local (127.0.1.1 es una dirección de diagnóstico de marcador de posición), mientras que wsl hostname -I devolverá la dirección IP de la máquina local tal como se ve en otras máquinas y se debe usar para identificar la connectaddress de distribución de Linux que se ejecuta a través de WSL 2.

Acceso IPv6

  • wsl hostname -i para la dirección IP de la distribución de Linux instalada a través de WSL 2 (la dirección de máquina virtual de WSL 2)
  • ip route show | grep -i default | awk '{ print $3}' para la dirección IP de la máquina Windows como se ve en WSL 2 (la máquina virtual WSL 2)

Con listenaddress=0.0.0.0 se escuchará en todos los puertos IPv4.

Redes en modo reflejo

Puede establecer networkingMode=mirrored en [wsl2] en el archivo.wslconfig para habilitar las redes en modo reflejo. Al habilitar este cambio de WSL en una arquitectura de red completamente nueva que tiene el objetivo de "crear reflejo" de las interfaces de red que tiene en Windows en Linux, para agregar nuevas características de red y mejorar la compatibilidad.

Estas son las ventajas actuales para habilitar este modo:

  • Compatibilidad de IPv6
  • Conectar a servidores Windows desde Linux mediante la dirección localhost 127.0.0.1. No se admite la dirección localhost IPv6 ::1
  • Compatibilidad mejorada de redes para VPN
  • Compatibilidad con multidifusión
  • Conectar a WSL directamente desde la red de área local (LAN)

Nota:

Ejecute el siguiente comando en la ventana de PowerShell con privilegios de administrador para configurar la configuración del firewall de Hyper-V para permitir conexiones entrantes: Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow o New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80.

Este nuevo modo aborda los problemas de red detectados con una arquitectura basada en NAT (traducción de direcciones de red). Busque problemas conocidos o envíe comentarios sobre los errores identificados en el repositorio de productos WSL en GitHub.

Tunelización de DNS

Si se establece dnsTunneling=true en [wsl2] en el archivo .wslconfig, WSL usa una característica de virtualización para responder a las solicitudes DNS desde WSL, en lugar de solicitarlas mediante un paquete de red. Esta característica está destinada a mejorar la compatibilidad con VPN y otras complejas redes configuradas.

Proxy automático

Al establecer autoProxy=true en [wsl2] en el archivo .wslconfig se aplica WSL para usar la información del proxy HTTP de Windows. Si ya tiene un proxy configurado en Windows, habilitar esta característica hará que ese proxy también se establezca automáticamente en WSL.

WSL y firewall

En las máquinas que ejecutan Windows 11 22H2 y versiones posteriores, con WSL 2.0.9 y versiones posteriores, la característica de firewall de Hyper-V se activará de forma predeterminada. Esto garantizará que: