Compartir a través de


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.

Identificar la dirección IP

Hay dos escenarios que se deben tener en cuenta al identificar la dirección IP que se usa para una distribución de Linux que se ejecuta a través de WSL:

Escenario uno: desde la perspectiva del host de Windows, quiere consultar la dirección IP de una distribución de Linux que se ejecuta a través de WSL2, de modo que un programa en el host de Windows pueda conectarse a un programa de servidor que se ejecuta dentro de la distribución (instancia).

El host de Windows puede usar el comando:

wsl -d <DistributionName> hostname -I

Si consulta la distribución predeterminada, esta parte del comando que designa la distribución se puede omitir: -d <DistributionName>. Asegúrese de usar una marca mayúscula -I y no una minúscula -i.

En segundo plano, el comando host wsl.exe inicia la instancia de destino y ejecuta el comando hostname -I de Linux. A continuación, este comando imprime la dirección IP de la instancia de WSL en STDOUT. A continuación, el contenido del texto STDOUT se reenvía a wsl.exe. Por último, wsl.exe muestra esa salida en la línea de comandos.

Una salida típica podría ser:

172.30.98.229

Escenario dos: un programa que se ejecuta dentro de una distribución de Linux a través de WSL2 (instancia) quiere conocer la dirección IP del host de Windows, para que un programa de Linux pueda conectarse a un programa de servidor host de Windows.

El usuario de WSL2 Linux puede usar el comando:

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

Una salida típica podría ser:

172.30.96.1

Por lo tanto, 172.30.96.1 es la dirección IP del host para Windows, en este ejemplo.

Nota:

Estas acciones de consulta de direcciones IP anteriores suelen ser necesarias cuando WSL2 se ejecuta con el modo de red NAT predeterminado. Cuando WSL2 se ejecuta con el nuevo modo reflejado, el host de Windows y la máquina virtual WSL2 se pueden conectar entre sí mediante localhost (127.0.0.1) como dirección de destino, por lo que no es necesario usar la dirección IP del mismo nivel de consulta.

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

En las máquinas que ejecutan Windows 11 22H2 y versiones posteriores, puede establecer networkingMode=mirrored en [wsl2] el archivo .wslconfig para habilitar las redes en modo reflejado. 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

En las máquinas que ejecutan Windows 11 22H2 y versiones posteriores, establecer dnsTunneling=true en [wsl2] el archivo .wslconfig tiene WSL usar una característica de virtualización para responder a las solicitudes DNS desde WSL, en lugar de solicitarlas a través de un paquete de red. Esta característica está destinada a mejorar la compatibilidad con VPN y otras complejas redes configuradas.

Proxy automático

En las máquinas que ejecutan Windows 11 22H2 y versiones posteriores, establecer autoProxy=true en [wsl2] el archivo .wslconfig exige que WSL use 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: