<# .SYNOPSIS Instala y conecta Tailscale en un PC Windows (malla privada para acceso remoto). .DESCRIPTION Idempotente. Tailscale une los equipos (sobremesa, portatil...) en una red privada cifrada, sin abrir puertos en el router ni depender de la red local. Hace: 1. Instala Tailscale via winget (si falta). 2. Ejecuta `tailscale up --hostname ` (autenticacion en el navegador, una vez). 3. Muestra estado y la IP de la tailnet. Ejecutar en CADA equipo que quiera usar la malla (sobremesa Y portatil). .EXAMPLE powershell -ExecutionPolicy Bypass -File setup_tailscale.ps1 -Hostname sobremesa #> [CmdletBinding()] param( [string]$Hostname = $env:COMPUTERNAME.ToLower() ) $ErrorActionPreference = 'Continue' function Get-TailscaleExe { $cmd = Get-Command tailscale -ErrorAction SilentlyContinue if ($cmd) { return $cmd.Source } foreach ($p in @("$env:ProgramFiles\Tailscale\tailscale.exe", "${env:ProgramFiles(x86)}\Tailscale\tailscale.exe")) { if (Test-Path $p) { return $p } } return $null } Write-Host '== Tailscale (malla privada para acceso remoto) ==' -ForegroundColor Cyan $ts = Get-TailscaleExe if (-not $ts) { Write-Host ' - Instalando Tailscale via winget...' -ForegroundColor Yellow $wg = Get-Command winget -ErrorAction SilentlyContinue if (-not $wg) { Write-Error 'winget no disponible. Instala Tailscale manualmente desde https://tailscale.com/download/windows'; exit 1 } winget install --id Tailscale.Tailscale -e --accept-source-agreements --accept-package-agreements Start-Sleep -Seconds 5 $ts = Get-TailscaleExe if (-not $ts) { Write-Error 'No se encuentra tailscale.exe tras la instalacion.'; exit 1 } } Write-Host " - tailscale: $ts" -ForegroundColor Green $svc = Get-Service -Name Tailscale -ErrorAction SilentlyContinue if ($svc) { Set-Service -Name Tailscale -StartupType Automatic; if ($svc.Status -ne 'Running') { Start-Service Tailscale } } Write-Host " - Conectando a la tailnet como '$Hostname' (se abrira el navegador para autenticar)..." -ForegroundColor Yellow & $ts up --hostname $Hostname Write-Host '' Write-Host 'Estado:' -ForegroundColor Cyan & $ts status $ip = (& $ts ip -4 2>$null) -join ', ' Write-Host "IP Tailscale : $ip" Write-Host "Conexion : ssh $env:USERNAME@$Hostname (o a la IP Tailscale)"