Los límites del túnel
Quién alcanza el servidor mientras el túnel está activo, qué impone el código, qué no impone, y qué pasa cuando el túnel falla o pierdes un teléfono.
Público mientras funciona #
Mientras el servidor funciona con un túnel, su dirección es alcanzable desde internet. La dirección es un nombre de host de túnel rápido de Cloudflare, aleatorio en cada ejecución, y muere con el servidor. No es una red privada, y nada en ella depende de que el teléfono sea tuyo: lo que hay entre internet y la ejecución es lo que impone el código, abajo.
AutoDev no tiene relay propio. El tráfico pasa por el servicio de túnel de Cloudflare, del que AutoDev ejecuta un cliente y que no opera. La dirección empieza por https://. El último salto, de cloudflared a AutoDev, es http sin cifrar en 127.0.0.1.
Qué impone el código #
| Petición | Qué necesita |
|---|---|
La página en /, sin credencial | Nada. Muestra la página de emparejamiento, sin nombre de proyecto, estado ni cuentas. |
POST /pair | Un código de emparejamiento abierto. 5 intentos fallidos lo cierran. |
/pairing, que abre y lee un código | El token del servidor. Una cookie de emparejamiento no se acepta. |
Cualquier otra ruta: la página de check-in, /answer, /command, /project, /unpair, /events y /view/<kind> | El token del servidor como Authorization: Bearer, o la cookie de un dispositivo emparejado. Cualquier otra cosa recibe 401. |
POST /command con una cookie | También la cabecera X-AutoDev-Device: 1. |
Otras tres reglas valen para toda petición:
- El servidor acepta solo nombres de host de loopback. El túnel reescribe la cabecera
Hosta127.0.0.1, de modo que la defensa del servidor contra el DNS rebinding se queda como está. La lista de permitidos no se relajó para el uso remoto. - Las páginas de check-in llevan una política de seguridad de contenido,
default-src 'none'; style-src 'unsafe-inline'; script-src 'unsafe-inline', así que una página no puede pedir nada a ningún sitio. - Lo que un teléfono sube se limita a imágenes, y cada imagen a 8 MB. Una petición se corta cuando es mayor de lo que puede ser un mensaje con sus fotos.
El token viene de --token, de AUTODEV_WEB_TOKEN o, cuando ninguno de los dos está definido, se genera: 24 bytes aleatorios. autodev serve imprime un token generado y dice que se trate como una contraseña. Un servidor independiente guarda su token en serve.json, en ~/.autodev/, para que el panel pueda conectarse a él.
Revocar un dispositivo #
Detener el servidor olvida todos los dispositivos emparejados, así que, para un teléfono perdido, la forma de cortarlo es desactivar el acceso remoto. Los dispositivos viven en la memoria del servidor y en ningún otro sitio.
Un teléfono puede desconectarse desde su propio menú. Nada revoca a otro dispositivo en particular, y el panel no tiene un control que revoque a todos sin detener el servidor.
La edad máxima de la cookie, unos 400 días, es una petición al navegador. El servidor no comprueba la edad de un dispositivo: acepta un token hasta que el servidor se detiene. Un token copiado de un teléfono funciona mientras el servidor esté en marcha.
Cuando el túnel falla #
Un túnel puede fallar al iniciarse de tres maneras, y el mensaje de cada una se escribe como aquí:
cloudflared did not announce a tunnel URL within 60scloudflared exited with code N before announcing a URLcloudflared is not installed or not on PATH, con el comando de instalación
En cada caso el servidor sigue funcionando en loopback, y solo esta máquina lo alcanza. Un servidor iniciado desde el panel escribe Tunnel unavailable — serving on loopback only. y el motivo en el registro de eventos como serve.tunnel_failed, y la línea de dirección del panel muestra Tunnel unavailable — loopback only. Falta cloudflared trata de la solución.
AutoDev sigue vigilando el túnel después de que anuncie su dirección. Si cloudflared sale más tarde, o su proceso falla, AutoDev retira la dirección, escribe un aviso serve.tunnel_down con el motivo, y la línea de dirección cambia al mismo Tunnel unavailable — loopback only. No reconstruye el túnel: uno nuevo tiene un nombre de host aleatorio nuevo, y todo teléfono se empareja de nuevo. Desactiva y vuelve a activar el acceso remoto para tener uno.
Lo que esto no hace #
- No tiene cuentas, y no da nombres a los dispositivos.
- No caduca un dispositivo en el servidor, y no revoca un solo dispositivo desde la máquina.
- No conserva la dirección entre ejecuciones. Una ejecución nueva tiene una dirección nueva, y todos los teléfonos se emparejan de nuevo.
- No limita lo que un teléfono emparejado puede leer, salvo por el nivel: en
full, el feed lleva lo que dijeron los agentes, los comandos que ejecutaron y los archivos que escribieron.
Activar el acceso remoto trata de iniciar y detener el servidor, y Todas las claves de configuración trata de los ajustes que no son específicos de él.