La red privada que lo une todo: Tailscale entre servidor, GPUs, portátil y móvil
Dos GX10, un servidor, un portátil Windows y los móviles hablando entre sí como si estuvieran en la misma mesa, sin abrir un solo puerto del router. Cómo lo montamos y las tres trampas que nos encontramos.
En el laboratorio hay tres redes y conviene no confundirlas:
| red | qué une | para qué |
|---|---|---|
| LAN de casa | todo lo que está enchufado al router | internet, y poco más |
| Tailscale | servidor, las dos GX10, el portátil, los móviles | administrar y usar los servicios desde cualquier sitio |
| Cable directo entre las dos GX10 | solo las dos GX10, 200 Gb/s | que un modelo repartido entre ambas se hable rápido |
Esta guía va de la segunda: la que hace que dé igual si estás en casa, en el trabajo o en otro país.
Por qué una red mesh y no abrir puertos
Abrir el puerto 22 del router a una máquina con modelos de 300 GB y acceso a tus proyectos es
invitar a medio internet a probar contraseñas. Tailscale monta una red WireGuard entre tus
dispositivos: cada uno recibe una IP 100.x.y.z estable y solo tus dispositivos la ven.
La consecuencia práctica es enorme: nada del laboratorio escucha en internet salvo el Nginx del servidor. Las GX10, el portátil y los paneles internos solo existen dentro de la red.
Instalación en cada máquina
# Linux (servidor, GX10)
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --ssh
--ssh activa Tailscale SSH, que autentica con la identidad de tu cuenta. Es opcional:
nosotros seguimos usando SSH normal con claves, solo que por dentro de la red de
Tailscale (entre las dos GX10 hay además una clave dedicada sin contraseña para que una
pueda arrancar procesos en la otra). En Windows, macOS, iOS y Android es la app oficial y un
inicio de sesión.
Activa MagicDNS en el panel: a partir de ahí las máquinas se llaman por su nombre.
Cerrar el SSH público
Con Tailscale funcionando, en el servidor ya no necesitas el 22 abierto a internet:
sudo ufw delete allow OpenSSH
sudo ufw allow in on tailscale0 to any port 22 proto tcp
Hazlo desde una sesión por Tailscale, no desde una por la IP pública, o te cortarás la rama en la que estás sentado.
Escuchar solo en la interfaz de Tailscale
Un servicio interno (un panel, una API) no debería escuchar en 0.0.0.0. Tienes dos opciones:
-
Escuchar en
127.0.0.1y publicarlo contailscale serve, que le pone HTTPS con un certificado válido para tu red:tailscale serve --bg --https=9443 http://127.0.0.1:3082 tailscale serve statusEs lo que hacemos en el portátil con el arnés de agentes: el proceso solo escucha en loopback y Tailscale Serve lo expone solo dentro de la red (nunca actives Funnel para esto: Funnel lo publica en internet).
-
Escuchar directamente en la IP de Tailscale. Funciona, pero tiene una trampa.
La trampa del arranque: escuchar en una IP que todavía no existe
Tras un reinicio, un servicio que intenta escuchar en 100.x.y.z antes de que Tailscale haya
levantado la interfaz recibe EADDRNOTAVAIL y muere. Lo peor es cómo muere: en nuestro caso
el contenedor seguía «Up» porque un vigilante de ficheros mantenía vivo el proceso padre, así
que Docker no lo reiniciaba nunca (P-041).
Dos arreglos, de mejor a peor:
-
El programa reintenta el bind cada pocos segundos si falla con
EADDRNOTAVAIL. -
La unidad systemd espera a Tailscale:
[Unit] After=tailscaled.service network-online.target Wants=network-online.target
Y la regla general: docker ps dice Up no significa nada. Comprueba las tres capas:
docker ps | grep mi-panel
ss -ltnp | grep :5555
curl -fsS http://100.x.y.z:5555/api/health
Quién puede hablar con quién
Por defecto, en Tailscale todos tus dispositivos se ven entre sí. Para un laboratorio con servicios delicados conviene restringir. Nosotros aplicamos la idea incluso por encima de Tailscale: el puente que da acceso a los modelos desde el portátil solo acepta peticiones de la IP de Tailscale del portátil, y cualquier otra recibe un rechazo aunque esté dentro de la red. Defensa en profundidad: si un día un dispositivo de la red se ve comprometido, no hereda acceso a todo.
Nombres por papel, no por modelo
Una regla que nos ahorró muchos líos: en los clientes, las máquinas se nombran por nodo y papel («Residente en GX10-1»), nunca por el modelo que tienen cargado. El modelo cambia cada semana; el nombre del nodo no. Si pones «DeepSeek» en la etiqueta, mientes en cuanto rotas el modelo.
Comprobación
tailscale status # todos tus dispositivos y si hay conexión directa
tailscale ping gx10-1 # ¿directo o a través de un relay?
tailscale serve status # qué está publicado y dónde
Si tailscale ping dice que va por relay (DERP), funciona pero con más latencia; revisa que
UDP saliente no esté bloqueado en esa red.
Siguiente: cómo enseñar al mundo una web que vive en tu portátil sin abrirle ni un puerto.