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.

Identificación de 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 wsl.exe host inicia la instancia de destino y ejecuta el comando hostname -I linux (notación corta para --all-ip-addresses). 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 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, el 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 aplicaciones de red de Linux desde Windows (localhost)

Si va a compilar una aplicación de red (por ejemplo, una aplicación que se ejecuta en nodeJS o SQL Server) en la distribución de Linux, puede acceder a ella desde una aplicación de Windows (como el explorador de Internet Edge o Chrome) mediante localhost (como lo haría normalmente).

Acceso a aplicaciones de red de Windows desde Linux (IP de host)

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

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

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

conectar con el servidor NodeJS en Windows a través de Curl

Conexión a través de direcciones IP remotas

Al usar direcciones IP remotas para conectarse a las aplicaciones, se tratarán como conexiones desde la red de área local (LAN). Esto significa que deberá asegurarse de que la aplicación pueda aceptar conexiones LAN.

Por ejemplo, puede que tenga que enlazar la aplicación a 0.0.0.0 en lugar de 127.0.0.1. En el ejemplo de una aplicación de Python mediante 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 una distribución de WSL 2 desde la red de área local (LAN)

Al usar una distribución de WSL 1, si su equipo estaba configurado para ser accesible desde su LAN, entonces las aplicaciones que se ejecutan en WSL también podrían ser accedidas en su LAN.

Este no es el caso predeterminado en WSL 2. WSL 2 tiene un adaptador ethernet virtualizado con su propia dirección IP única. Actualmente, para habilitar este flujo de trabajo, deberá seguir los mismos pasos que lo haría 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 de <yourPortToConnectToInWSL> a un número de puerto en el que desea que WSL se conecte, por ejemplo, connectport=4000. Por último, el connectaddress valor 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 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 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 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 espejo

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 esta opción, WSL cambia a una arquitectura de red completamente nueva cuya finalidad es "reflejar" las interfaces de red que usted tiene en Windows dentro de Linux, para añadir nuevas características de red y mejorar la compatibilidad.

Estas son las ventajas actuales para habilitar este modo:

  • Compatibilidad con IPv6
  • Conéctese 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
  • Conéctese 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 de en GitHub.

Tunelización de DNS

En las máquinas que ejecutan Windows 11 22H2 y versiones posteriores, establecer dnsTunneling=true bajo [wsl2] en el archivo .wslconfig hace que WSL utilice una característica de virtualización para responder a las solicitudes DNS dentro de 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: