← Tu laboratorio en cualquier parteSerie Remoto · paso 2 de 11

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.

Dificultadfácil
Tiempo45 min
IngredientesTailscale · SSH · systemd

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:

  1. Escuchar en 127.0.0.1 y publicarlo con tailscale 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 status

    Es 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).

  2. 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.