[{"data":1,"prerenderedAt":287},["ShallowReactive",2],{"seo-verification":3,"blog-auto-alojar-headscale-en-un-vps-servidor-tailscale-ma-es":6,"promo-bar-likely":286},{"google":4,"bing":5},"EycwPY2XMyTkVzas3n1ygeNJFGAH513qrMjfDljzsMQ","",{"key":7,"data":8},"blog-auto-alojar-headscale-en-un-vps-servidor-tailscale-ma-es",{"id":9,"slug":10,"slugs":11,"title":15,"excerpt":16,"readTime":17,"views":18,"isPinned":19,"noindex":19,"publishedAt":20,"updatedAt":21,"category":22,"categories":28,"featuredImage":30,"bgImage":31,"posterImage":32,"relatedSolution":33,"intro":36,"sections":37,"ctaTitle":226,"ctaBody":227,"ctaButton":228,"ctaUrl":229,"relatedPosts":230},164,"auto-alojar-headscale-en-un-vps-servidor-tailscale",{"fr":12,"en":13,"ar":14,"es":10},"self-host-headscale-tailscale-vps","self-host-headscale-on-a-vps-your-own-tailscale-control-server","استضافة-headscale-على-vps-خادم-تحكم-tailscale-خاص-بك","Alojar Headscale en un VPS: servidor de control Tailscale","Sustituya el servidor de control en la nube de Tailscale por Headscale en su VPS: usuarios ilimitados, malla WireGuard completa, magic DNS y ACL, sin SaaS.",19,2,false,"2026-07-05T00:00:00+00:00","2026-11-08T01:13:12+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},8,"Seguridad y monitorización","securite-monitoring","bg-rose-500\u002F10 text-rose-400","security",[29],{"id":23,"name":24,"slug":25,"color":26,"icon":27},null,"\u002Fblog\u002Fcovers\u002Fbg.svg","\u002Fblog\u002Fcovers\u002Fself-host-headscale-tailscale-vps-poster.svg",{"categorySlug":34,"appSlug":35},"redes-vpn","headscale","El plan gratuito de Tailscale (Personal) se detiene en 6 usuarios, el plan Standard se factura después por puesto y, en cualquier caso, el mapa de su red se guarda en la nube de Tailscale. Headscale (BSD-3-Clause, más de 45 000 estrellas en GitHub) es un reemplazo de código abierto directo del servidor de coordinación de Tailscale: despliéguelo en su VPS y siga usando los clientes oficiales de Tailscale en cada dispositivo. Su equipo se conecta mediante túneles WireGuard zero-trust, magic DNS y control de acceso basado en ACL, todo auto-alojado y sin límite.\n\nEsta guía cubre la instalación (Docker o paquete `.deb`), el reverse proxy HTTPS, la verificación de la malla, el paso de un equipo que ya usa Tailscale, el cálculo del umbral de rentabilidad y lo que Headscale no sabe hacer.",[38,42,56,59,66,91,94,109,112,116,119,131,134,146,149,164,167,208,211,218],{"type":39,"title":40,"body":41},"h2","Por qué auto-alojar el servidor de control","Tailscale es un software excepcional: el rendimiento de WireGuard, clientes multiplataforma y un magic DNS que funciona a la primera. Sin embargo, no transporta su tráfico: los paquetes WireGuard circulan directamente de un nodo a otro, cifrados de extremo a extremo. Lo que se ejecuta en la nube de Tailscale es el plano de control, el servidor de coordinación que intercambia las claves públicas, hace que los pares se descubran, asigna las direcciones `100.x.y.z`, publica los nombres MagicDNS y distribuye las ACL y el mapa de relés DERP. Sin él, los nodos no se encuentran. Headscale reimplementa ese servidor de coordinación en Go de código abierto, con el mismo protocolo, para que usted pueda ejecutarlo en su propia infraestructura: sus clientes Tailscale solo cambian de URL de conexión.\n\nMás allá del tope de 6 usuarios del plan gratuito, la principal razón para auto-alojarlo es la residencia de los datos: el plano de control sabe qué máquinas están en su red, sus IP, sus nombres y sus políticas de ACL. Ejecutar Headscale significa que esa información se queda en su VPS, y no en la nube de otra persona, y que su red ya no depende de una decisión de precios ni de una caída en un tercero.",{"type":43,"title":44,"items":45},"ul","Lo que le aporta Headscale auto-alojado",[46,47,48,49,50,51,52,53,54,55],"Usuarios y dispositivos sin tope: ningún límite impuesto por el software ni tarifas por puesto; su red mallada crece con su equipo, limitada solo por los recursos del VPS.","Los clientes oficiales de Tailscale en todas partes: Linux, macOS, Windows, iOS, Android; no hace falta ningún fork propio ni cliente alternativo.","Túneles WireGuard punto a punto: Headscale solo gestiona el intercambio de claves y la distribución de las ACL; todo el tráfico real circula directamente por WireGuard entre los pares.","Magic DNS: resuelva cada nodo de su red mallada por su nombre de host (`portatil.mesh.su-dominio.com`) sin tocar su DNS público.","Políticas HuJSON: el mismo formato de archivo de política que Tailscale, con ACL y Grants; defina qué usuarios y qué dispositivos pueden acceder a qué servicios.","Compatibilidad con los relés DERP: use el mapa DERP público de Tailscale para atravesar el NAT, o active el servidor DERP integrado en Headscale para mantener también los relés en casa.","API y CLI headscale: cree usuarios, emita claves de preautenticación y gestione los nodos mediante programación.","Registro sin cuenta en tailscale.com: sus colaboradores se unen a la red con una clave que usted genera, o a través del proveedor OpenID Connect que ya utiliza (Keycloak, Authelia, Google Workspace…).","Subredes, exit nodes, Taildrop y Tailscale SSH: el servidor admite las funciones básicas de Tailscale.","Menos de 50 MB de RAM en reposo: funciona con holgura en un VPS de 1 GB junto a otras cargas de trabajo.",{"type":39,"title":57,"body":58},"Requisitos previos","Un VPS con al menos 1 vCPU y 512 MB de RAM (1 GB deja margen al sistema) bajo Ubuntu 22.04 o posterior, o Debian 12 o posterior: son las distribuciones a las que apuntan los paquetes oficiales. Para la vía Docker, instale Docker y Docker Compose v2. Hace falta una IP pública; se recomienda una configuración de doble pila IPv4 + IPv6.\n\nUn nombre de dominio que apunte al VPS es **obligatorio**: los clientes Tailscale se conectan al servidor de control por URL, y el proyecto recomienda encarecidamente servir Headscale en HTTPS por el puerto 443, ya que el cliente Tailscale da por hecho ese puerto en ciertas situaciones. Prevea un subdominio para el servidor (`vpn.su-dominio.com`) y otro distinto para los nombres MagicDNS (`mesh.su-dominio.com`): Headscale rechaza que el dominio MagicDNS sea el de `server_url`.",{"type":43,"title":60,"items":61},"Los puertos que hay que abrir en el VPS",[62,63,64,65],"TCP 443: obligatorio. Por HTTPS se registran los clientes y reciben el mapa de la red; es el único puerto imprescindible para el servidor de coordinación.","TCP 80: solo para la validación Let's Encrypt HTTP-01 y la redirección a HTTPS.","UDP 3478: solo si activa el servidor DERP integrado, que lo necesita para STUN. Con el mapa DERP público de Tailscale no hace falta abrirlo.","TCP 8080 (Headscale), 9090 (métricas) y 50443 (gRPC): déjelos en `127.0.0.1`. El reverse proxy habla con 8080 en local; no exponga nunca la interfaz de administración gRPC si no la necesita.",{"type":67,"title":68,"steps":69},"steps","Desplegar Headscale con Docker Compose",[70,73,76,79,82,85,88],{"title":71,"body":72},"Redactar el archivo Compose","La stack solo tiene un servicio: la imagen oficial `docker.io\u002Fheadscale\u002Fheadscale:0.29.7`, última versión estable a 7 de noviembre de 2026, lanzada con el comando `serve`. Headscale guarda todo (claves, base de datos, registros de los nodos) en dos carpetas del host: la configuración, montada en solo lectura en `\u002Fetc\u002Fheadscale`, y los datos, en `\u002Fvar\u002Flib\u002Fheadscale`. No hace falta ningún servicio externo de base de datos ni de caché; SQLite viene integrado.\n\n```bash\nmkdir -p \u002Fopt\u002Fheadscale\u002Fconfig \u002Fopt\u002Fheadscale\u002Flib\ncat > \u002Fopt\u002Fheadscale\u002Fcompose.yaml \u003C\u003C'EOF'\nservices:\n  headscale:\n    image: docker.io\u002Fheadscale\u002Fheadscale:0.29.7\n    container_name: headscale\n    restart: unless-stopped\n    read_only: true\n    tmpfs:\n      - \u002Fvar\u002Frun\u002Fheadscale\n    ports:\n      - \"127.0.0.1:8080:8080\"\n    volumes:\n      - \u002Fopt\u002Fheadscale\u002Fconfig:\u002Fetc\u002Fheadscale:ro\n      - \u002Fopt\u002Fheadscale\u002Flib:\u002Fvar\u002Flib\u002Fheadscale\n    command: serve\n    healthcheck:\n      test: [\"CMD\", \"headscale\", \"health\"]\nEOF\n```\n\nEl puerto solo se publica en `127.0.0.1`: es el reverse proxy el que da la cara a Internet.",{"title":74,"body":75},"Generar la configuración","Parta del archivo de ejemplo de la versión exacta que despliega y modifique solo las claves siguientes. `server_url` es la URL HTTPS a la que se conectarán sus clientes Tailscale; `listen_addr` debe escuchar en `0.0.0.0` dentro del contenedor. La base de datos se declara bajo `database` (`type: sqlite`). Solo queda indicar la ruta de la clave noise: Headscale la genera en el primer arranque si el archivo no existe.\n\n```bash\ncurl -Lo \u002Fopt\u002Fheadscale\u002Fconfig\u002Fconfig.yaml \\\n  https:\u002F\u002Fraw.githubusercontent.com\u002Fjuanfont\u002Fheadscale\u002Fv0.29.7\u002Fconfig-example.yaml\n```\n\n```yaml\nserver_url: https:\u002F\u002Fvpn.su-dominio.com\nlisten_addr: 0.0.0.0:8080\nnoise:\n  private_key_path: \u002Fvar\u002Flib\u002Fheadscale\u002Fnoise_private.key\ndatabase:\n  type: sqlite\n  sqlite:\n    path: \u002Fvar\u002Flib\u002Fheadscale\u002Fdb.sqlite\ndns:\n  magic_dns: true\n  base_domain: mesh.su-dominio.com\n```\n\nEn ServOrbit, el job de aprovisionamiento escribe `config.yaml` a partir de su dominio automáticamente.",{"title":77,"body":78},"Arrancar el contenedor y verificar","Ejecute `docker compose up -d` desde `\u002Fopt\u002Fheadscale`. Headscale genera su clave noise y luego se pone a escuchar en el puerto 8080. Compruebe el endpoint de salud: `curl -s http:\u002F\u002F127.0.0.1:8080\u002Fhealth` debe devolver `{\"status\":\"pass\"}`. La imagen se basa en una base distroless, sin shell, pero la CLI headscale se invoca directamente: `docker exec headscale headscale version` confirma la versión en ejecución y `docker logs --follow headscale` muestra los registros.",{"title":80,"body":81},"Crear un usuario y generar una clave de autenticación","Headscale organiza los dispositivos en «usuarios» (antes llamados namespaces). Cree uno y anote su identificador numérico: la opción `--user` de `preauthkeys create` espera ese ID, no el nombre.\n\n```bash\ndocker exec headscale headscale users create myteam\ndocker exec headscale headscale users list\ndocker exec headscale headscale preauthkeys create --user 1 --reusable --expiration 24h\n```\n\nSin `--reusable`, la clave solo sirve una vez, y sin `--expiration` caduca al cabo de una hora. Copie la clave que se muestra: la usará para registrar cada dispositivo.",{"title":83,"body":84},"Registrar un dispositivo","En cualquier dispositivo que tenga el cliente oficial de Tailscale, apúntelo a su instancia de Headscale: `tailscale up --login-server https:\u002F\u002Fvpn.su-dominio.com --authkey \u003Csu-clave-preauth>`. El dispositivo aparece en la lista de nodos de Headscale en unos segundos: `docker exec headscale headscale nodes list`. Sin clave, el cliente abre una página que muestra un identificador de autenticación; apruébelo en el servidor con `docker exec headscale headscale auth register --user myteam --auth-id \u003CAUTH_ID>`. Una vez registrados, los dispositivos se comunican por su IP de malla (`100.64.x.y`) o por su nombre de host de magic DNS.",{"title":86,"body":87},"Definir las políticas de control de acceso","Mientras no se cargue ninguna política, Headscale deja pasar todo el tráfico entre los nodos: aceptable para un equipo pequeño de confianza, no cuando conviven portátiles de desarrolladores, proveedores externos y servidores de producción. Cree `\u002Fopt\u002Fheadscale\u002Fconfig\u002Fpolicy.hujson` y declárelo en `config.yaml` con `policy.path: \u002Fetc\u002Fheadscale\u002Fpolicy.hujson`. Headscale usa el mismo formato HuJSON que Tailscale: defina grupos de usuarios, etiquete los dispositivos como servidores o estaciones de trabajo y escriba reglas que precisen qué grupos pueden alcanzar qué puertos. El proyecto recomienda los Grants antes que las ACL, que Tailscale considera heredadas. Valide el archivo con `headscale policy check --file \u003Carchivo>` y luego recargue: la política solo se relee al recargar (`docker kill --signal=HUP headscale`, o `systemctl reload headscale` en una instalación nativa). Versione este archivo en un repositorio Git privado para conservar el historial de accesos.",{"title":89,"body":90},"Conectarse por primera vez","Headscale no tiene interfaz web ni cuenta: es el servidor de control de su red privada, y se pilota desde la línea de comandos. Por SSH: `docker exec -it headscale headscale users create monuser`, después la clave con `preauthkeys create --user \u003CID> --reusable --expiration 24h`, y conecte sus máquinas con `tailscale up --login-server https:\u002F\u002F\u003Csu-dominio> --authkey \u003Cclave>`. Las aplicaciones gráficas también pueden apuntar a un servidor personalizado: en macOS, Opción + clic en el icono de Tailscale, menú Debug y luego `Custom Login Server`; en iOS, `Use custom coordination server` en el menú de inicio de sesión; en Android, `Use an alternate server`; en Windows, `tailscale login --login-server` en PowerShell.",{"type":39,"title":92,"body":93},"Sin Docker: el paquete .deb oficial","El proyecto publica paquetes `.deb` para Debian y Ubuntu, y los recomienda en esas distribuciones: crean el usuario de sistema `headscale`, incluyen una configuración por defecto e instalan la unidad systemd. Es la vía más sencilla si Headscale está solo en su VPS o si prefiere un servicio nativo a un contenedor. Los comandos de gestión son los mismos que arriba, sin el prefijo `docker exec headscale`.",{"type":67,"title":95,"steps":96},"Instalar Headscale con el paquete .deb",[97,100,103,106],{"title":98,"body":99},"Descargar e instalar el paquete","Descargue el paquete de la versión deseada desde la página de releases de GitHub, para su arquitectura (`amd64` o `arm64`), e instálelo con `apt`, que resuelve las dependencias:\n\n```bash\nHEADSCALE_VERSION=\"0.29.7\"\nHEADSCALE_ARCH=\"amd64\"\nwget --output-document=headscale.deb \\\n  \"https:\u002F\u002Fgithub.com\u002Fjuanfont\u002Fheadscale\u002Freleases\u002Fdownload\u002Fv${HEADSCALE_VERSION}\u002Fheadscale_${HEADSCALE_VERSION}_linux_${HEADSCALE_ARCH}.deb\"\nsudo apt install .\u002Fheadscale.deb\n```\n\nCompruebe después: `headscale version` debe mostrar `0.29.7`.",{"title":101,"body":102},"Adaptar la configuración","El paquete deja la configuración en `\u002Fetc\u002Fheadscale\u002Fconfig.yaml` y un ejemplo actualizado en `\u002Fusr\u002Fshare\u002Fdoc\u002Fheadscale\u002Fexamples\u002Fconfig-example.yaml`. Modifique las mismas claves que para Docker (`server_url`, `database`, `dns.base_domain`), pero mantenga `listen_addr: 127.0.0.1:8080`: el servicio se ejecuta en el host y solo el reverse proxy debe alcanzarlo. Los datos residen en `\u002Fvar\u002Flib\u002Fheadscale`.",{"title":104,"body":105},"Reiniciar y verificar el servicio","Reinicie el servicio para que relea la configuración y compruebe su estado y sus registros:\n\n```bash\nsudo systemctl restart headscale\nsudo systemctl status headscale\nsudo journalctl -u headscale -f\n```\n\nLa salida debe mostrar `Active: active (running)`. En el primer arranque, los errores más frecuentes son una `server_url` sin el esquema `https:\u002F\u002F` y un dominio MagicDNS idéntico al del servidor.",{"title":107,"body":108},"Usar la CLI sin ser root","La CLI habla con el servicio a través del socket Unix `\u002Fvar\u002Frun\u002Fheadscale\u002Fheadscale.sock`, al que por defecto solo acceden el usuario `headscale` y root. Use `sudo`, ejecute los comandos como usuario `headscale` o añada su cuenta al grupo `headscale`. Compruebe el acceso con `headscale users list`.",{"type":39,"title":110,"body":111},"Servir Headscale en HTTPS detrás de Nginx","Los clientes Tailscale hablan con Headscale con su propio protocolo, transportado por una conexión WebSocket abierta con POST, cuya cabecera `Upgrade` vale `tailscale-control-protocol`. Por eso el reverse proxy debe transmitir las cabeceras `Upgrade` y `Connection` tal cual y no almacenar las respuestas en búfer. La configuración siguiente sigue el ejemplo de la documentación del proyecto; obtenga antes el certificado con certbot (`certbot certonly --nginx -d vpn.su-dominio.com`).\n\n```nginx\nmap $http_upgrade $connection_upgrade {\n  default keep-alive;\n  ''      close;\n}\n\nserver {\n  listen 80;\n  server_name vpn.su-dominio.com;\n  location = \u002Fgenerate_204 { return 204; }\n  location \u002F { return 301 https:\u002F\u002F$server_name$request_uri; }\n}\n\nserver {\n  listen 443 ssl;\n  http2 on;\n  server_name vpn.su-dominio.com;\n  ssl_certificate     \u002Fetc\u002Fletsencrypt\u002Flive\u002Fvpn.su-dominio.com\u002Ffullchain.pem;\n  ssl_certificate_key \u002Fetc\u002Fletsencrypt\u002Flive\u002Fvpn.su-dominio.com\u002Fprivkey.pem;\n\n  location \u002F {\n    proxy_http_version 1.1;\n    proxy_set_header Upgrade $http_upgrade;\n    proxy_set_header Connection $connection_upgrade;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n    proxy_buffering off;\n    proxy_pass http:\u002F\u002F127.0.0.1:8080;\n  }\n}\n```\n\nDeje vacíos `tls_cert_path` y `tls_key_path` en `config.yaml`: Nginx termina TLS, así que el aviso `listening without TLS` al arrancar es lo esperado. Para que los registros de Headscale muestren la IP real de los clientes, declare el proxy como origen de confianza. En una instalación nativa basta con el bucle local; en Docker, añada también la red del puente Docker (`docker network inspect`), porque el contenedor ve llegar el proxy desde su pasarela:\n\n```yaml\ntrusted_proxies:\n  - 127.0.0.1\u002F32\n  - ::1\u002F128\n```\n\nCaddy también funciona, con un simple `reverse_proxy 127.0.0.1:8080`. En cambio, el proxy de Cloudflare y Cloudflare Tunnel no son compatibles, porque no gestionan los WebSocket en POST: el registro DNS del servidor debe quedarse en modo solo DNS.",{"type":113,"title":114,"body":115},"tip","Combinar Headscale con Authelia para un acceso de red protegido con MFA","Headscale gestiona el control de acceso a nivel de red (qué IP pueden comunicarse con qué pares), pero no aplica autenticación a nivel de aplicación. Combínelo con \u003Ca href=\"\u002Fes\u002Fblog\u002Falojar-authelia-en-un-vps\">Authelia en el mismo VPS\u003C\u002Fa>: haga pasar sus servicios internos (accesibles únicamente a través de la malla) por la capa forward-auth de Authelia. Los usuarios deben validar un MFA para acceder a los servicios, incluso una vez dentro de la malla: defensa en profundidad para las cargas sensibles.",{"type":39,"title":117,"body":118},"Comprobar que los nodos se ven","Un nodo que aparece en `headscale nodes list` solo demuestra que ha llegado al servidor de coordinación. Antes de hacer pasar tráfico real por la malla, compruebe el camino de extremo a extremo desde los propios clientes.",{"type":67,"title":120,"steps":121},"Controlar la malla desde un cliente",[122,125,128],{"title":123,"body":124},"Leer el estado de la red","En un nodo registrado, ejecute `tailscale status`. El comando lista los pares con su IP de malla, su nombre y el tipo de enlace: `direct` significa que el túnel WireGuard está establecido sin intermediario, `relay` que pasa por un relé DERP, funcional pero con una latencia mayor.",{"title":126,"body":127},"Probar la conectividad","Tome la IP de un par en `tailscale status` y luego `ping 100.64.0.2`, o mejor `tailscale ping \u003Cnombre-del-nodo>`, que indica si la respuesta llega en directo o por un relé. Si el par aparece pero no responde, `tailscale netcheck` mide la latencia hacia cada región DERP y señala un UDP saliente filtrado.",{"title":129,"body":130},"Probar la resolución MagicDNS","Con `dns.magic_dns: true`, cada nodo responde a su nombre corto y a su nombre completo: `ping nombre-del-nodo` o `ping nombre-del-nodo.mesh.su-dominio.com`. No hace falta ningún registro DNS público para estos nombres internos. Si la resolución falla, `tailscale dns status` muestra la configuración DNS que el cliente ha recibido del servidor.",{"type":39,"title":132,"body":133},"Caso de uso: SSH entre VPS sin exponer el puerto 22","Una vez registrados sus VPS de desarrollo y de producción en la misma malla, SSH ya no necesita escuchar en la interfaz pública: la conexión usa la dirección de malla, dentro del túnel WireGuard. Mantenga abierto un acceso de consola en su proveedor antes de tocar el cortafuegos, por si una regla le deja fuera.",{"type":67,"title":135,"steps":136},"Restringir SSH a la red mallada",[137,140,143],{"title":138,"body":139},"Localizar la interfaz y la dirección de malla","En cada VPS, el cliente Tailscale crea la interfaz `tailscale0`. `tailscale ip -4` muestra la dirección de malla de la máquina; anote la del servidor de producción, por ejemplo `100.64.0.3`.",{"title":141,"body":142},"Permitir SSH solo por tailscale0","En el VPS de producción, permita SSH en la interfaz de malla antes de denegarlo en el resto: UFW aplica la primera regla que coincide.\n\n```bash\nufw allow in on tailscale0 to any port 22 proto tcp\nufw deny 22\u002Ftcp\nufw enable\nufw status verbose\n```\n\nEl puerto 22 ya no es accesible desde Internet, pero sigue abierto para todos los nodos de la malla que su política autorice.",{"title":144,"body":145},"Conectarse a través de la malla","Desde el VPS de desarrollo o su equipo registrado, conéctese por la IP o el nombre MagicDNS: `ssh usuario@100.64.0.3` o `ssh usuario@vps-prod.mesh.su-dominio.com`. Todo transita dentro del túnel cifrado; después, restrinja en la política de Headscale qué grupos pueden alcanzar el puerto 22 de este servidor.",{"type":39,"title":147,"body":148},"Migrar un equipo que ya usa Tailscale","El cambio no requiere ninguna reinstalación: el cliente oficial acepta la opción `--login-server`, así que basta con desconectarlo de la red antigua y volver a conectarlo a su servidor. Cada máquina se corta unos segundos durante la operación. Como su servidor asigna él mismo las direcciones `100.x` y los nombres MagicDNS, prevea actualizar los scripts, las reglas de cortafuegos y los archivos de configuración que citan los antiguos.",{"type":67,"title":150,"steps":151},"Pasar los clientes a Headscale",[152,155,158,161],{"title":153,"body":154},"Recuperar la política de acceso","Copie el archivo de política de su tailnet desde el editor Access controls de la consola de Tailscale y parta de él: el formato HuJSON es el mismo. Revíselo con `headscale policy check` antes del cambio: algunas funciones, como los IP sets, no son compatibles, y solo existe un subconjunto de los autogroups.",{"title":156,"body":157},"Desconectar y volver a conectar cada cliente","En Linux o desde la línea de comandos, encadene la desconexión y la reconexión con una clave de preautenticación:\n\n```bash\ntailscale logout\ntailscale up --login-server https:\u002F\u002Fvpn.su-dominio.com --authkey \u003CPREAUTHKEY>\n```\n\nEn macOS, iOS, Android y Windows, cierre la sesión de la cuenta en la aplicación y añada después el servidor personalizado como se ha descrito más arriba.",{"title":159,"body":160},"Empezar por las máquinas de prueba","Pase primero un equipo y un servidor de prueba, compruebe `tailscale status` y la resolución de nombres, luego las máquinas de desarrollo y, en último lugar, la producción. Mientras queden máquinas al otro lado, las dos redes no se ven: planifique el cambio de un servicio y de sus clientes en la misma ventana.",{"title":162,"body":163},"Cerrar o rebajar la cuenta de Tailscale","Una vez migrados y verificados todos los nodos, cierre el tailnet o vuelva al plan Personal si mantiene un uso personal. Genere una clave de preautenticación nueva para los próximos registros en lugar de conservar indefinidamente la de la migración.",{"type":39,"title":165,"body":166},"Headscale frente a Tailscale Cloud","Tailscale Cloud sigue siendo la vía más sencilla para los equipos pequeños: ningún servidor que mantener, actualizaciones automáticas y facturación integrada, y el plan Personal sigue siendo gratuito hasta 6 usuarios. Más allá, el plan Standard figura a 8 $ por usuario y mes en la tabla de precios vigente desde el 8 de abril de 2026: 40 $ al mes para cinco personas, 80 $ para diez. Headscale cuesta el precio del VPS, sea cual sea la plantilla (en ServOrbit, el VPS Solo (2 vCPU \u002F 4 GB) a 99 DH\u002Fmes basta para decenas de nodos), más el tiempo de explotación: actualizaciones, copias de seguridad, supervisión.\n\nHeadscale cobra, por tanto, todo su sentido por encima de 6 usuarios, cuando la residencia de los datos obliga a mantener la topología de su red fuera de servidores de terceros, o cuando quiere una auditabilidad completa de sus logs de coordinación. Los clientes son idénticos: pasar de Tailscale Cloud a Headscale se reduce a volver a ejecutar `tailscale up --login-server` en cada dispositivo.",{"type":168,"title":169,"headers":170,"rows":175},"comparison","Tailscale Personal, Tailscale Standard y Headscale",[171,172,173,174],"Criterio","Tailscale Personal","Tailscale Standard","Headscale en un VPS",[176,181,186,188,192,196,200,204],[177,178,179,180],"Precio","Gratuito","8 $ por usuario y mes","El coste del VPS",[182,183,184,185],"Usuarios","Hasta 6","Sin tope","Sin límite de software",[187,184,184,185],"Dispositivos de los usuarios",[189,190,190,191],"Servidor de coordinación","Nube de Tailscale","Su VPS, bajo su control",[193,194,194,195],"Cliente","Cliente oficial de Tailscale","Cliente oficial de Tailscale (`--login-server`)",[197,198,198,199],"MagicDNS, ACL, Grants","Sí","Sí, en su propio dominio",[201,202,202,203],"Funnel y Serve","Ofrecidos por Tailscale","No compatibles",[205,206,206,207],"Mantenimiento","Ninguno (servicio gestionado)","Actualizaciones, copias de seguridad, supervisión",{"type":39,"title":209,"body":210},"Lo que Headscale no sustituye","Headscale implementa el servidor de coordinación, no toda la plataforma comercial. Su propia documentación enumera lo que falta: Tailscale Funnel (publicar un servicio local en Internet), Tailscale Serve (compartirlo en el tailnet mediante un proxy local) y los registros de flujos de red no son compatibles; los grupos OIDC no pueden usarse en las ACL. Tampoco hay consola web oficial: todo pasa por la CLI o la API. Si su uso se limita a la conectividad en malla, a MagicDNS, a las políticas de acceso, a las subredes y a los exit nodes, Headscale cubre la necesidad; si usa activamente Funnel o Serve, sopese esas funciones frente al ahorro antes de migrar, o eche un vistazo a \u003Ca href=\"\u002Fes\u002Fblog\u002Fdesplegar-netbird-vpn-mesh-wireguard-en-vps\">NetBird\u003C\u002Fa>, que también auto-aloja su interfaz de administración.",{"type":43,"title":212,"items":213},"Copias de seguridad y actualizaciones",[214,215,216,217],"Haga una copia antes de cada actualización: Headscale aplica sus migraciones de base de datos al arrancar la nueva versión. Detenga el servicio, copie la configuración y los datos y vuelva a arrancarlo: `cd \u002Fopt\u002Fheadscale && docker compose stop`, `cp -aR \u002Fopt\u002Fheadscale \u002Fopt\u002Fheadscale.backup-$(date +%Y%m%d%H%M%S)`, `docker compose up -d`.","La carpeta de datos contiene `db.sqlite` y `noise_private.key`: perder esa clave cambia la identidad del servidor y obliga a todos los nodos a registrarse de nuevo. Cópiela también fuera del VPS, por ejemplo en un almacenamiento de objetos.","Suba de versión en versión: el proyecto exige pasar por cada versión menor estable (por ejemplo `0.27`, luego `0.28`, luego `0.29`), siempre en su último parche, sin saltarse ninguna.","Lea la nota de versión en GitHub antes de cada actualización: señala los cambios de configuración incompatibles. Después compare su `config.yaml` con el archivo de ejemplo de la nueva versión.",{"type":43,"title":219,"items":220},"Resolución de problemas: los errores más frecuentes",[221,222,223,224,225],"El cliente no consigue registrarse: compruebe que `https:\u002F\u002Fvpn.su-dominio.com\u002Fhealth` responde desde fuera, que `server_url` coincide exactamente con el dominio del certificado y que el proxy transmite bien las cabeceras `Upgrade` y `Connection`.","Conexiones en `relay` en lugar de `direct`: un NAT estricto o un cortafuegos bloquea el UDP entre los dos nodos. Ejecute `tailscale netcheck` en ambos lados para ver qué se filtra; el tráfico pasa igualmente, por los relés DERP.","Nodo listado como `offline`: el cliente llegó al servidor pero no mantiene la sesión. Revise `systemctl status tailscaled` y `journalctl -u tailscaled` en el nodo; un cortafuegos local que corta las conexiones salientes es la causa más habitual.","Headscale se niega a arrancar tras una actualización: se ha renombrado o retirado una clave de configuración. El registro la nombra; consulte el archivo de ejemplo de la versión instalada.","MagicDNS no resuelve: compruebe que `dns.magic_dns` está en `true` y que `dns.base_domain` difiere del dominio de `server_url`, y vuelva a conectar el cliente para que recupere la nueva configuración DNS.","Despliegue Headscale en su VPS con un clic","Auto-aloje su servidor de control Tailscale con usuarios ilimitados y sin dependencia de la nube. ServOrbit aprovisiona una instancia de Headscale lista para usar: configuración generada, HTTPS listo y la primera clave de autenticación mostrada en la salida del job.","Desplegar Headscale","\u002Fvps-cloud?template=headscale",[231,249,268],{"id":232,"slug":233,"slugs":234,"title":238,"excerpt":239,"readTime":240,"views":18,"isPinned":19,"noindex":19,"publishedAt":241,"updatedAt":21,"category":242,"categories":243,"featuredImage":30,"bgImage":31,"posterImage":245,"relatedSolution":246},141,"wireguard-en-un-vps-vpn-rapido-y-privado",{"fr":235,"en":236,"ar":237,"es":233},"installer-wireguard-vps","wireguard-on-a-vps-a-fast-lean-and-private-vpn","wireguard-على-خادم-vps-شبكة-vpn-سريعة-ومبسطة-وخاصة","WireGuard en VPS: VPN rápido, ligero y privado","Despliegue WireGuard en un VPS ServOrbit: túneles rápidos, configuración legible, códigos QR para clientes y acceso remoto privado.",7,"2026-02-04T00:00:00+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[244],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Finstaller-wireguard-vps-poster.svg",{"categorySlug":247,"appSlug":248},"securite","wireguard-server",{"id":250,"slug":251,"slugs":252,"title":256,"excerpt":257,"readTime":258,"views":259,"isPinned":19,"noindex":19,"publishedAt":260,"updatedAt":261,"category":262,"categories":263,"featuredImage":30,"bgImage":31,"posterImage":265,"relatedSolution":266},162,"alojar-authelia-en-un-vps",{"fr":253,"en":254,"ar":255,"es":251},"self-host-authelia-vps","self-host-authelia-on-a-vps-mfa-and-sso-for-your-whole-stack","استضافة-authelia-على-vps-مصادقة-ثنائية-ودخول-موحد-لمنظومتك","Alojar Authelia en un VPS: MFA y SSO para todo tu stack","Despliega Authelia en VPS con Docker Compose: TOTP, WebAuthn\u002Fpasskey, OIDC, migración LLDAP, monitoreo Prometheus y comparativa con Authentik.",10,4,"2026-07-04T00:00:00+00:00","2026-09-24T12:27:51+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[264],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Fself-host-authelia-vps-poster.svg",{"categorySlug":27,"appSlug":267},"authelia",{"id":269,"slug":270,"slugs":271,"title":275,"excerpt":276,"readTime":23,"views":277,"isPinned":19,"noindex":19,"publishedAt":278,"updatedAt":279,"category":280,"categories":281,"featuredImage":30,"bgImage":31,"posterImage":283,"relatedSolution":284},140,"openvpn-en-un-vps-acceso-remoto-privado",{"fr":272,"en":273,"ar":274,"es":270},"installer-openvpn-serveur-vps","openvpn-on-a-vps-private-controlled-remote-access","openvpn-على-خادم-vps-وصول-عن-بعد-خاص-ومضبوط","OpenVPN en VPS: instalación, seguridad y resolución","Instale OpenVPN Server en su VPS: requisitos previos, Easy-RSA, server.conf, perfiles .ovpn, fail2ban, ufw y solución de errores comunes.",0,"2026-02-05T00:00:00+00:00","2026-09-30T11:20:33+00:00",{"id":23,"name":24,"slug":25,"color":26,"icon":27},[282],{"id":23,"name":24,"slug":25,"color":26,"icon":27},"\u002Fblog\u002Fcovers\u002Finstaller-openvpn-serveur-vps-poster.svg",{"categorySlug":247,"appSlug":285},"openvpn-server",true,1794270549493]