Tailscale es una VPN de malla basada en WireGuard: cada dispositivo se conecta directamente con los demás y el servicio de coordinación de Tailscale solo reparte claves y rutas. En este tutorial instalarás Tailscale en un servidor Ubuntu 24.04, lo unirás a tu red privada (tailnet), lo convertirás en subnet router y exit node, y controlarás el acceso con ACL y Tailscale SSH.

Requisitos previos

Para seguir esta guía necesitas:

  • Un servidor con Ubuntu 24.04 LTS, por ejemplo un VPS de CubePath.
  • Un usuario no root con privilegios sudo.
  • Una cuenta de Tailscale en login.tailscale.com con permisos de administrador de la tailnet.
  • Al menos otro dispositivo (tu portátil, por ejemplo) con Tailscale instalado y conectado a la misma tailnet, para probar la conexión.

Tailscale no necesita abrir puertos de entrada: atraviesa NAT y firewalls de forma automática. Si el tráfico directo no es posible, usa sus servidores de relay (DERP).

Paso 1: Instalar Tailscale desde el repositorio oficial

Tailscale publica paquetes para cada versión de Ubuntu. Añade su clave de firma y el repositorio para Ubuntu 24.04 (noble):

curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.noarmor.gpg | sudo tee /usr/share/keyrings/tailscale-archive-keyring.gpg > /dev/null
curl -fsSL https://pkgs.tailscale.com/stable/ubuntu/noble.tailscale-keyring.list | sudo tee /etc/apt/sources.list.d/tailscale.list

El archivo .list ya incluye la opción signed-by apuntando a la clave que acabas de descargar. Instala el paquete:

sudo apt update
sudo apt install tailscale

El paquete activa y arranca el servicio tailscaled. Compruébalo:

systemctl status tailscaled
tailscale version
● tailscaled.service - Tailscale node agent
     Loaded: loaded (/usr/lib/systemd/system/tailscaled.service; enabled; preset: enabled)
     Active: active (running) since ...

Paso 2: Unir el servidor a la tailnet

Ejecuta tailscale up para registrar el servidor. Como un servidor no tiene navegador, el comando imprime una URL que debes abrir en tu equipo:

sudo tailscale up
To authenticate, visit:

	https://login.tailscale.com/a/1a2b3c4d5e6f

Abre la URL, inicia sesión y autoriza el dispositivo. El comando termina solo cuando se completa la autorización.

Para desplegar servidores de forma automática, genera una clave de autenticación en la consola de administración (Settings > Keys > Generate auth key) y pásala al comando. Sustituye tskey-auth-xxxx por tu clave:

sudo tailscale up --auth-key=tskey-auth-xxxx

Comprueba la IP que Tailscale ha asignado al servidor (rango 100.64.0.0/10) y los demás dispositivos de la tailnet:

tailscale ip -4
tailscale status
100.101.102.103
100.101.102.103  vps-madrid   your_user@  linux    -
100.88.12.34     portatil     your_user@  macOS    -

Prueba la conectividad con otro dispositivo por su nombre. tailscale ping indica también si la conexión es directa o pasa por un relay DERP:

tailscale ping portatil
pong from portatil (100.88.12.34) via 203.0.113.25:41641 in 18ms

Si la respuesta dice via DERP(mad), la conexión funciona, pero a través de un relay y con más latencia.

Paso 3: Configurar el servidor como subnet router

Un subnet router permite que los dispositivos de la tailnet lleguen a una red que no tiene Tailscale instalado, por ejemplo la red privada donde están tus otros servidores. Primero activa el reenvío de paquetes IPv4 e IPv6 de forma permanente:

echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

Anuncia la subred. Sustituye 10.10.0.0/24 por el rango de tu red privada:

sudo tailscale set --advertise-routes=10.10.0.0/24

tailscale set cambia una opción sin tocar las demás, a diferencia de tailscale up, que exige repetir todas las opciones ya aplicadas. Después, en la consola de administración, abre el menú del servidor en Machines, entra en Edit route settings y aprueba la ruta.

Los clientes Linux no aceptan rutas anunciadas por defecto. Actívalo en cada cliente Linux que deba usarlas (Windows, macOS, iOS y Android las aceptan sin configuración):

sudo tailscale set --accept-routes

Desde un cliente, verifica que llegas a un equipo de la subred que no tiene Tailscale:

ping -c 3 10.10.0.5

Paso 4: Configurar el servidor como exit node

Un exit node envía todo el tráfico de Internet de un cliente a través del servidor, útil en redes Wi-Fi públicas o para salir con la IP del servidor. Con el reenvío ya activado en el paso anterior, anuncia el servidor como exit node:

sudo tailscale set --advertise-exit-node

Aprueba la opción Use as exit node en Edit route settings de la consola. Luego, en un cliente Linux, selecciona el servidor como salida. La segunda opción mantiene el acceso a la red local del cliente (impresoras, router):

sudo tailscale set --exit-node=vps-madrid --exit-node-allow-lan-access=true

En Windows, macOS y móviles se elige desde el menú de la aplicación, en Exit node. Comprueba desde el cliente que tu IP pública es ahora la del servidor:

curl -4 https://ifconfig.me

Para dejar de usarlo:

sudo tailscale set --exit-node=

Paso 5: Restringir el acceso con etiquetas y ACL

Por defecto, todos los dispositivos de la tailnet pueden conectarse entre sí. La política de acceso, que editas en Access controls de la consola, define quién puede llegar a qué. Primero declara una etiqueta para los servidores y quién puede asignarla. Esta política permite a los administradores todo, y a los demás miembros solo SSH y HTTPS hacia los servidores etiquetados:

{
  "tagOwners": {
    "tag:servidor": ["autogroup:admin"]
  },
  "acls": [
    {
      "action": "accept",
      "src": ["autogroup:admin"],
      "dst": ["*:*"]
    },
    {
      "action": "accept",
      "src": ["autogroup:member"],
      "dst": ["tag:servidor:22,443"]
    }
  ]
}

Guarda la política y asigna la etiqueta al servidor. Las etiquetas se cambian con tailscale up, que exige repetir todas las opciones que ya no están en su valor por defecto, en este caso las rutas y el exit node de los pasos anteriores:

sudo tailscale up --advertise-tags=tag:servidor --advertise-routes=10.10.0.0/24 --advertise-exit-node

Si olvidas alguna opción, el comando no aplica nada y muestra la línea completa que debes ejecutar. Un dispositivo etiquetado pasa a pertenecer a la tailnet en lugar de a tu usuario y su clave no caduca. Verifica que la etiqueta aparece junto al servidor en Machines.

Paso 6: Activar Tailscale SSH

Tailscale SSH autentica las conexiones SSH con la identidad de Tailscale, sin gestionar claves en cada servidor. Actívalo en el servidor:

sudo tailscale set --ssh

Añade a la política de acceso una sección ssh que permita a los administradores entrar en los servidores etiquetados como usuarios sin privilegios o como root:

{
  "ssh": [
    {
      "action": "accept",
      "src": ["autogroup:admin"],
      "dst": ["tag:servidor"],
      "users": ["autogroup:nonroot", "root"]
    }
  ]
}

Esta sección va dentro del mismo objeto JSON que tagOwners y acls. Desde otro dispositivo de la tailnet, conéctate con el nombre del servidor:

ssh your_user@vps-madrid

Tailscale SSH solo intercepta las conexiones que llegan por la interfaz de Tailscale. El SSH normal por la IP pública sigue funcionando igual.

Paso 7: Cerrar SSH público con UFW (opcional)

Si todo tu acceso va a ir por Tailscale, puedes permitir SSH solo por la interfaz tailscale0. Hazlo con una sesión ya abierta a través de Tailscale para no quedarte fuera:

sudo ufw allow in on tailscale0
sudo ufw delete allow OpenSSH
sudo ufw enable
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
Anywhere on tailscale0     ALLOW       Anywhere
Anywhere (v6) on tailscale0 ALLOW      Anywhere (v6)

Solución de problemas

El servidor aparece desconectado. Revisa el servicio y sus logs:

sudo systemctl status tailscaled
sudo journalctl -u tailscaled -n 50

La conexión siempre pasa por DERP. Ejecuta un diagnóstico de red. Si UDP: false, algo bloquea el UDP saliente; permitir la entrada del puerto 41641/udp en el firewall del servidor facilita las conexiones directas:

tailscale netcheck

Los clientes no llegan a la subred. Comprueba que la ruta está aprobada en la consola, que sysctl net.ipv4.ip_forward devuelve 1 en el servidor y que el cliente Linux tiene --accept-routes.

Conclusión

Tu servidor Ubuntu 24.04 forma parte de una tailnet, publica una subred privada, puede actuar como exit node y solo acepta el acceso que define tu política. Como siguientes pasos, puedes activar MagicDNS en DNS para resolver los equipos por nombre en todos los clientes, usar grupos en la política para separar equipos de desarrollo y operaciones, o repetir la instalación con una clave etiquetada en tus demás servidores.