Portless: rutas locales con nombre
Seguridad de Portless: loopback, cabeceras y autorización de hosts-sync
Distingue exposición local y pública, comprende cabeceras no confiables y revisa la autenticación del endpoint interno en el código fijado.
Qué aprenderás
- Local, LAN y público son ámbitos distintos
- El endpoint interno comprueba más que loopback
- No conviertas el experimento en certificación
Antes de empezar
- Conceptos de orígenes HTTP, puertos y terminal
- Distinguir loopback, LAN y exposición pública
Traza una petición, define límites de instalación y separa comportamiento observado de integraciones no probadas.
Conclusiones clave
- Loopback, LAN, tailnet y túneles públicos exigen decisiones separadas.
- Las cabeceras conservadas no son identidad de seguridad saneada.
- Una prueba acotada de autorización no es auditoría completa.
Local, LAN y público son ámbitos distintos
El proxy documentado escucha en loopback por defecto. LAN cambia listeners y anuncia nombres .local; Tailscale, Funnel y ngrok tienen alcances y dependencias distintos. En particular, un túnel público no equivale a una ruta local privada. Revisa el modo LAN recordado y las variables de acceso compartido antes de exponer una aplicación con depuración o credenciales de ejemplo.
El proxy inspeccionado conserva X-Forwarded-Proto, Host y Port suministrados, y añade la dirección del par a X-Forwarded-For. El experimento confirmó este comportamiento. Esas cabeceras no constituyen una identidad saneada por un perímetro público confiable. La aplicación necesita una política explícita de proxies confiables antes de utilizarlas para autorización, redirecciones de seguridad o identidad del cliente.
El endpoint interno comprueba más que loopback
POST /.portless/hosts-sync solo se intercepta con una autoridad loopback literal. El manejador verifica el par real, rechaza Origin y Sec-Fetch-Site, exige exactamente una cabecera de token válida y compara con el token configurado mediante timingSafeEqual. Sin credenciales devolvió 401; con credenciales ficticias válidas llegó a un contador inocuo, no a un escritor del sistema.
El callback distingue sincronización activa y deshabilitada, con respuestas 204 y 409. La misma ruta bajo el nombre de una aplicación sigue llegando a esa aplicación. HEAD / puede añadir una prueba HMAC bajo condiciones restringidas, incluso acompañando un 404. Verificar identidad del daemon no equivale a exigir un HTTP 200 de una ruta ordinaria.
No conviertas el experimento en certificación
La prueba rechazó tokens duplicados y metadatos de origen del navegador aunque el token ficticio fuera válido. También comprobó desafíos inválidos o sin prueba. Es evidencia de ramas inspeccionadas, no un ensayo de DNS rebinding, todos los pares de red, certificados, servicios o túneles. Nunca publiques tokens reales de la máquina en un informe de diagnóstico.
Fuera del manejador HTTP siguen importando los permisos: reemplazar una ruta con force puede terminar un proceso registrado, confiar certificados cambia la frontera de confianza e instalar servicios puede crear ejecución persistente privilegiada. Revisa cada acción aparte. El contador de saltos detecta bucles accidentales, pero una cabecera controlada por el cliente no es autenticación ni defensa completa contra denegación de servicio.
Pasos de implementación
- 1
Inspecciona listeners y opciones de acceso antes de iniciar.
- 2
Define qué proxy confía la aplicación.
- 3
Prueba autorización con tokens ficticios y callbacks sin escritura.
- 4
Exige aprobación para force, certificados y servicios.
Ejemplo para copiar
{
"resultadosLoopback": {
"sinToken": 401,
"tokenVálidoConOrigin": 401,
"cabecerasDuplicadas": 401,
"callbackContadorAutorizado": 204,
"callbackDeshabilitado": 409,
"estadoConPruebaHeadVálida": 404
},
"archivoHostsModificado": false,
"tokensRealesUsados": false
}Preguntas frecuentes
¿Por qué una prueba válida puede acompañar un 404?
La cabecera de prueba se añade antes de continuar el enrutamiento normal. La autoridad loopback literal puede no tener aplicación registrada y devolver 404.
¿Aprobar estos casos demuestra seguridad pública?
No. Cubren ramas HTTP loopback seleccionadas. Exposición pública, autenticación de la aplicación y otras amenazas de integración requieren trabajo separado.
Fuentes
- packages/portless/src/proxy.tsFuente verificada 2026-09-08
- packages/portless/src/hosts-sync-auth.tsFuente verificada 2026-09-08
- packages/portless/src/routes.tsFuente verificada 2026-09-08
- README.mdFuente verificada 2026-09-08