feat: agregar script para habilitar acceso LAN a Vite desde WSL2
This commit is contained in:
parent
b45925f3e2
commit
3f0effd571
@ -28,9 +28,30 @@ Si se cambia PORT, configurar API_PROXY_TARGET al arrancar Vite (por defecto htt
|
|||||||
|
|
||||||
## Acceso desde la red local
|
## Acceso desde la red local
|
||||||
|
|
||||||
En este equipo se utiliza http://192.168.0.2:5173. Vite usa server.host: true y la orden de desarrollo respeta esa configuración. En WSL2 con NAT, esto permite conexiones dentro de la red de WSL, pero no elimina la necesidad de reenviar el puerto desde Windows. El script activar.ps1 obtiene la IPv4 actual de Ubuntu-24.04 y configura el reenvío desde 192.168.0.2:5173 hacia esa dirección en WSL. La API y MariaDB siguen escuchando únicamente en loopback. La regla de cortafuegos se limita al perfil privado y a equipos de la subred local.
|
La dirección de acceso es http://192.168.0.2:5173. Vite escucha en la red de WSL y redirige `/api` a la API interna. En WSL2 con NAT se necesita además reenviar el puerto desde Windows, siguiendo el [procedimiento de Microsoft](https://learn.microsoft.com/en-us/windows/wsl/networking#accessing-a-wsl-2-distribution-from-your-local-area-network-lan).
|
||||||
|
|
||||||
Ejecutar activar.ps1 desde PowerShell como administrador y mantener pnpm dev en WSL. Los scripts activar.ps1 y desactivar.ps1 están en la carpeta metis-desk-lan del espacio de trabajo de Windows. Para acceder y guardar datos desde la dirección de red, establecer APP_ORIGIN=http://192.168.0.2:5173 en .env y reiniciar pnpm dev. Solo se permite un origen: con esa configuración, las operaciones desde localhost serán rechazadas. Si cambia la dirección de este ordenador, retirar el reenvío anterior, actualizar los scripts y APP_ORIGIN y volver a activarlo. La activación requiere privilegios de Windows. El reenvío y la regla privada están activados y se ha comprobado la respuesta HTTP y la sesión por la dirección LAN. Si WSL cambia de dirección después de reiniciar, volver a ejecutar activar.ps1 para actualizar el destino. La comprobación desde un segundo equipo depende de disponer de ese equipo en la red.
|
El script versionado `scripts/enable-lan-access.ps1` detecta la IPv4 de `eth0` en Ubuntu-24.04, comprueba que Vite responde, configura el reenvío TCP y crea una regla de firewall para el perfil privado y la subred local. La interfaz de Windows con IP 192.168.0.2 debe tener perfil Privado. Mantener `pnpm dev` ejecutándose en WSL.
|
||||||
|
|
||||||
|
Copiar el script a una carpeta de Windows y ejecutarlo desde PowerShell **como administrador**, en esa carpeta:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .\enable-lan-access.ps1
|
||||||
|
```
|
||||||
|
|
||||||
|
La excepción de ejecución solo afecta a ese proceso. Se pueden indicar `-Distribution`, `-ListenAddress` y `-Port` si cambian los valores. Comprobar el puerto anunciado por Vite: si 5173 está ocupado, puede usar otro.
|
||||||
|
|
||||||
|
En `.env`, establecer `APP_ORIGIN=http://192.168.0.2:5173` y reiniciar `pnpm dev` para permitir guardar datos desde la dirección LAN. Solo se admite un origen: con esa configuración, las operaciones desde localhost serán rechazadas. No se publican el puerto de la API ni el de MariaDB.
|
||||||
|
|
||||||
|
Volver a ejecutar el script después de un cambio de IP de WSL. El script actualiza el destino del mismo reenvío. Si cambia la IP de Windows o el puerto, retirar primero las reglas anteriores y actualizar también `APP_ORIGIN`.
|
||||||
|
|
||||||
|
Para retirar el acceso con los valores predeterminados, ejecutar en PowerShell como administrador:
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
netsh interface portproxy delete v4tov4 listenaddress=192.168.0.2 listenport=5173 protocol=tcp
|
||||||
|
Remove-NetFirewallRule -Name 'MetisDesk-WSL-LAN-192.168.0.2-5173'
|
||||||
|
```
|
||||||
|
|
||||||
|
El script reinicia IP Helper (`iphlpsvc`) después de configurar las reglas para que aplique el reenvío; esto interrumpe brevemente otros reenvíos gestionados por ese servicio. Espera hasta diez segundos a que aparezca el listener IPv4 y comprueba una respuesta HTTP 200 a través de la IP de Windows, sin usar el proxy del sistema, antes de anunciar éxito. Si falla, muestra los reenvíos y los listeners y conserva las reglas para diagnóstico. Esta comprobación local no garantiza acceso desde otro dispositivo: verificarlo también desde la red local. El reinicio manual del servicio resolvió el fallo observado; el script actualizado queda pendiente de ejecución en Windows.
|
||||||
|
|
||||||
## Diagnóstico de conexión con MariaDB
|
## Diagnóstico de conexión con MariaDB
|
||||||
|
|
||||||
|
|||||||
120
scripts/enable-lan-access.ps1
Normal file
120
scripts/enable-lan-access.ps1
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
#Requires -Version 5.1
|
||||||
|
#Requires -RunAsAdministrator
|
||||||
|
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
Publica Vite desde WSL2 en la red local mediante el reenvio TCP de Windows.
|
||||||
|
.DESCRIPTION
|
||||||
|
Ejecutar en PowerShell de Windows como administrador, con pnpm dev activo en WSL.
|
||||||
|
Volver a ejecutar si cambia la IP de WSL. Solo admite el perfil de red privado.
|
||||||
|
La API sigue siendo accesible a traves del proxy /api de Vite.
|
||||||
|
Reinicia IP Helper para aplicar las reglas; interrumpe brevemente otros reenvios.
|
||||||
|
#>
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[System.Net.IPAddress]$ListenAddress = '192.168.0.2',
|
||||||
|
[ValidateRange(1, 65535)]
|
||||||
|
[int]$Port = 5173,
|
||||||
|
[ValidateNotNullOrEmpty()]
|
||||||
|
[string]$Distribution = 'Ubuntu-24.04'
|
||||||
|
)
|
||||||
|
|
||||||
|
Set-StrictMode -Version Latest
|
||||||
|
$ErrorActionPreference = 'Stop'
|
||||||
|
|
||||||
|
if ($ListenAddress.AddressFamily -ne [System.Net.Sockets.AddressFamily]::InterNetwork) {
|
||||||
|
throw 'ListenAddress debe ser una direccion IPv4 del ordenador Windows.'
|
||||||
|
}
|
||||||
|
|
||||||
|
$localAddress = Get-NetIPAddress -AddressFamily IPv4 -IPAddress $ListenAddress.IPAddressToString
|
||||||
|
$profiles = @(Get-NetConnectionProfile -InterfaceIndex $localAddress.InterfaceIndex)
|
||||||
|
if (-not ($profiles | Where-Object { $_.NetworkCategory -eq 'Private' })) {
|
||||||
|
throw 'La interfaz debe tener perfil Privado en Windows. Revisar la red antes de ejecutar el script.'
|
||||||
|
}
|
||||||
|
|
||||||
|
# eth0 evita seleccionar la direccion de un bridge de Docker con hostname -I.
|
||||||
|
$addressOutput = & wsl.exe --distribution $Distribution --exec ip -4 -o addr show dev eth0
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw "No se pudo consultar eth0 en la distribucion $Distribution."
|
||||||
|
}
|
||||||
|
|
||||||
|
$addressMatch = [regex]::Match(($addressOutput -join "`n"), '\binet\s+(\d{1,3}(?:\.\d{1,3}){3})/')
|
||||||
|
if (-not $addressMatch.Success) {
|
||||||
|
throw 'No se encontro una direccion IPv4 en eth0 de WSL.'
|
||||||
|
}
|
||||||
|
|
||||||
|
$wslAddress = [System.Net.IPAddress]::Parse($addressMatch.Groups[1].Value)
|
||||||
|
if (-not (Test-NetConnection -ComputerName $wslAddress.IPAddressToString -Port $Port -InformationLevel Quiet -WarningAction SilentlyContinue)) {
|
||||||
|
throw "WSL no responde en ${wslAddress}:$Port. Comprobar pnpm dev y el puerto anunciado por Vite."
|
||||||
|
}
|
||||||
|
|
||||||
|
# add actualiza tambien el destino del reenvio existente para esta direccion y puerto.
|
||||||
|
& netsh.exe interface portproxy add v4tov4 `
|
||||||
|
listenaddress=$($ListenAddress.IPAddressToString) listenport=$Port `
|
||||||
|
connectaddress=$($wslAddress.IPAddressToString) connectport=$Port protocol=tcp
|
||||||
|
if ($LASTEXITCODE -ne 0) {
|
||||||
|
throw 'No se pudo configurar el reenvio TCP de Windows.'
|
||||||
|
}
|
||||||
|
|
||||||
|
$ruleName = "MetisDesk-WSL-LAN-$($ListenAddress.IPAddressToString)-$Port"
|
||||||
|
$existingRule = Get-NetFirewallRule -Name $ruleName -ErrorAction SilentlyContinue
|
||||||
|
if ($existingRule) {
|
||||||
|
$existingRule | Remove-NetFirewallRule
|
||||||
|
}
|
||||||
|
|
||||||
|
New-NetFirewallRule -Name $ruleName -DisplayName "Metis Desk WSL LAN ($Port)" `
|
||||||
|
-Direction Inbound -Action Allow -Enabled True -Profile Private `
|
||||||
|
-Protocol TCP -LocalAddress $ListenAddress.IPAddressToString -LocalPort $Port `
|
||||||
|
-RemoteAddress LocalSubnet | Out-Null
|
||||||
|
|
||||||
|
# El servicio puede estar activo sin haber aplicado los reenvios registrados.
|
||||||
|
Write-Host 'Reiniciando IP Helper para aplicar el reenvio...'
|
||||||
|
Restart-Service -Name iphlpsvc
|
||||||
|
|
||||||
|
$accessUrl = "http://${ListenAddress}:$Port/"
|
||||||
|
# Una regla creada no garantiza que Windows este escuchando o reenviando HTTP.
|
||||||
|
# Evitar el proxy del sistema permite comprobar directamente el reenvio local.
|
||||||
|
$request = [System.Net.WebRequest]::Create($accessUrl)
|
||||||
|
$request.Proxy = $null
|
||||||
|
$request.Timeout = 10000
|
||||||
|
$request.ReadWriteTimeout = 10000
|
||||||
|
$request.AllowAutoRedirect = $false
|
||||||
|
$response = $null
|
||||||
|
|
||||||
|
try {
|
||||||
|
# Running no garantiza que el listener este listo: esperar hasta diez segundos.
|
||||||
|
$listenerTimer = [System.Diagnostics.Stopwatch]::StartNew()
|
||||||
|
do {
|
||||||
|
$listener = Get-NetTCPConnection -State Listen -LocalPort $Port -ErrorAction SilentlyContinue |
|
||||||
|
Where-Object { $_.LocalAddress -eq $ListenAddress.IPAddressToString -or $_.LocalAddress -eq '0.0.0.0' }
|
||||||
|
if ($listener) {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if ($listenerTimer.Elapsed.TotalSeconds -ge 10) {
|
||||||
|
throw "Windows no ha abierto el listener IPv4 ${ListenAddress}:$Port tras reiniciar IP Helper."
|
||||||
|
}
|
||||||
|
Start-Sleep -Milliseconds 200
|
||||||
|
} while ($true)
|
||||||
|
|
||||||
|
$response = $request.GetResponse()
|
||||||
|
if ([int]$response.StatusCode -ne 200) {
|
||||||
|
throw "Respuesta HTTP inesperada: $([int]$response.StatusCode)."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Write-Warning 'Las reglas se han creado, pero la comprobacion HTTP desde Windows ha fallado. Se conservan para diagnostico.'
|
||||||
|
& netsh.exe interface portproxy show all
|
||||||
|
Get-NetTCPConnection -State Listen -LocalPort $Port -ErrorAction SilentlyContinue |
|
||||||
|
Format-Table LocalAddress, LocalPort, OwningProcess | Out-Host
|
||||||
|
throw "No se pudo verificar ${accessUrl}: $($_.Exception.Message)"
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
if ($null -ne $response) {
|
||||||
|
$response.Close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "HTTP verificado desde Windows: $accessUrl -> ${wslAddress}:$Port"
|
||||||
|
Write-Host 'Comprobar ahora el acceso desde otro dispositivo de la red local.'
|
||||||
|
Write-Host "En WSL, establecer APP_ORIGIN=http://${ListenAddress}:$Port en .env y reiniciar pnpm dev."
|
||||||
|
Write-Host 'Volver a ejecutar este script si cambia la IP de WSL.'
|
||||||
Loading…
Reference in New Issue
Block a user