Cómo instalar Headscale, tu propio servidor de Tailscale

Alternativa SelfHosting de Tailscale. Guía completa con acceso a LAN. Todo bajo el protocolo WireGuard.

Cómo instalar Headscale, tu propio servidor de Tailscale
Regístrate en HDS+
Es gratuito. Ten acceso a todo el contenido.
🔓
Dificultad del tutorial: Medio

En el tutorial de hoy se detallarán los pasos para poder realizar una instalación de cero del servicio de Headscale. Para los amantes del SelfHosting, y que quieren tener todo en su propio servidor, se trata de un servicio imprescindible.

Headscale es una herramienta SelfHosted de Tailscale que permite desplegar un servidor de control de dispositivos bajo protocolo WireGuard.”  

Tailscale / Headscale ofrece numerosas ventajas respecto a utilizar WireGuard directamente. Las más destacadas son:

WireGuard vs Tailscale

Diferencias WireGuard Tailscale
Control completo mediante una UI
Gestión de usuarios y SSO
Acceso a toda la red de dispositivos al hacer Login
Aplicación multiplataforma

Antes de embarcarnos en esta aventura, os aconsejo que dejéis creado un Proxy Inverso para este servicio. En HDS+ ya os explicamos como hacerlo sin problemas.

Cómo instalar y configurar Nginx Proxy Manager en tu NAS o servidor unRAID
Guía detallada sobre cómo instalar tu Proxy Inverso en un NAS - unRAID con certificado Let’s Encrypt.

Instalación mediante Docker-Compose

  1. Synology: Deberemos de crear las carpetas correspondientes. Para ello nos vamos a 'File Station ➝ docker' y creamos una carpeta "headscale" y dentro de ella dos más: "config""data".
  2. Nos bajaremos el archivo de configuración y lo pegaremos dentro de la carpeta "config".

Antes de seguir, tendremos que editar el archivo y cambiaremos las líneas 14 y 273, sustituyendo https://tailscale.pepito.com por nuestro Proxy Inverso.

⚠️
¡IMPORTANTE! Tener en cuenta los puertos por si los tenéis en uso, se tendrán que especificar otros.

Ahora si, abrimos Portainer o Container Manager y ejecutamos el siguiente Stack:

version: '3.5'
services:
  headscale:
    image:  headscale/headscale:stable
    volumes:
      - /volume1/docker/headscale/config:/etc/headscale/
      - /volume1/docker/headscale/data:/var/lib/headscale
    ports:
      - 27896:8080
      - 27895:9090 #si queremos metricas,se puede quitar 
    command: serve
    restart: unless-stopped

  headscale-admin:
    image: ghcr.io/gurucomputing/headscale-ui:latest
    container_name: headscale-admin
    restart: unless-stopped
    environment:
      - HTTP_PORT=9080
      - HTTPS_PORT=8443
    ports:
      - 9080:9080
      - 8443:8443

Hasta aquí todo perfecto, pero si intentamos entrar en el servidor de Headscale y no hemos creado el Proxy Inverso siempre nos estará dando fallo, eso es porque requiere de uno.


Proxy Inverso: Headscale

El proceso de creación en Nginx Proxy Manager es el de siempre, salvo que tendremos que especificar un valor extra dentro de la pestaña Advanced.

location /web/{
  proxy_pass https://ipdevuestronas:8443/web/;
}

Tendremos que sustituir ipdenuestronas por nuestra IP local y aplicamos cambios.


Proceso de configuración

Bien, ya lo tenemos todo correctamente instalado. Ahora para seguir, deberemos de iniciar sesión mediante: https://tailscale.pepito.com/web (sustituir por vuestro dominio)

Entraremos en la interfaz y nos mostrará el siguiente error. Es completamente normal.

Seguidamente deberemos registrar la conexión vía API entre la UI y el server Headscale. Para ello deberemos de conectarnos a nuestro NAS vía SSH y ejecutar el siguiente comando:

sudo docker exec headscale-headscale-1 headscale apikeys create

Este comando nos devolverá una Key. La copiamos y volvemos a nuestra página de Headscale, y nos vamos a Settings:

💡
Por si tenemos problemas y no tenemos el check verde, reiniciar los dos contenedores.

Especificaremos la URL utilizada además de la Key obtenida en el paso anterior.

Finalmente le daremos a Test Server Settings y si todo ha ido bien deberemos ver un check de color verde como en la imagen inferior.

Hasta aquí ya tenemos la parte de Server y entorno gráfico vinculada correctamente.

Creación del usuario y dispositivo

Ahora vamos a pasar a crear el usuario y vincular los dispositivos. En este punto tengo que remarcar que para que funcione correctamente tenemos que enrutar nuestra conexión a la LAN, para de esta forma poder conectarnos a nuestros servicios locales una vez estemos conectados a la VPN como por ejemplo AdGuard Home entre otros.

Nos dirigimos a User View y clicamos en New User. En el nombre especificaremos el que nosotros queramos.

Descargar la App

El siguiente paso será descargarnos Tailscale en nuestro dispositivo, en este ejemplo se usará un iPhone (vigilar con la versión 1.76 que parece ser tiene un bug y no deja añadir).

Una vez instalada nos iremos a Ajustes y buscamos Tailscale.

Una vez dentro, veremos lo mostrado en la segunda imagen inferior. Dentro del recuadro rojo especificaremos la URL creada en nuestro Proyecto Inverso.

En el caso de Android el método sería el siguiente: clicar 3 veces sobre los tres puntos para que salga la ventana de Server:

💡
Por si tenemos dudas de cómo hacerlo, también se incluye un asistente por si lo necesitamos. Tendremos que sustituir por nuestro dominio del Proxy Inverso:
  1. Para instalar la App en dispositivo Apple: https://tailscale.pepito.com/apple
  2. Para instalar la App en dispositivo Android: https://tailscale.pepito.com/android
  3. Para instalar la App en Windows: https://tailscale.pepito.com/windows

Bien, una vez especificada nuestra URL en los ajustes de la App, volvemos a la pantalla principal de la App de Tailscale y damos a Login, directamente irá a nuestro proxy y se conectará, mostrando la primera vez la pantalla para registrar el dispositivo:

Pues bien, con este código iremos a la web a Device ViewNew Device.

En Select User, seleccionamos nuestro usuario y en Device Key debemos poner la devuelta en el paso anterior mkey:xxxxxxxxxxxx.

Con esto ya tendremos registrado nuestro dispositivo correctamente. Reiniciamos la App y veremos que ya estamos conectados.

Enrutar el tráfico de LAN

Llegados a este punto, si abrimos un navegador e intentamos entrar en algún servicio local veremos que no podemos acceder y eso es porque no hemos enrutado el tráfico hacia la LAN. Por ahora, en la app de iOS no es posible realizar esta opción por lo que tendremos que hacer un bypass o puente para que nos funcione. Dicho esto, ¡vamos al lio!

Primero tendremos que crear las carpetas correspondientes. Para ello nos vamos a 'File Station ➝ docker' y creamos una carpeta "tailscaleclient" y dentro de ella dos más: "data" y "tun".

Seguidamente creamos un nuevo stack:

👉
¡IMPORTANTE! Se deben de cambiar ciertas variables del siguiente Stack, las cuales explico a continuación.
services:
  tailscale:
    container_name: tailscale
    image: tailscale/tailscale:stable
    hostname: headtailscale
    volumes:
      - /volume1/docker/tailscaleclient/data:/var/lib/tailscale
      - /volume1/docker/tailscaleclient/tun:/dev/net/tun
    network_mode: host
    cap_add:
      - NET_ADMIN
      - NET_RAW
    environment:
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_EXTRA_ARGS=--login-server=https://tailscale.pepito.com --advertise-exit-node --advertise-routes=192.168.0.0/24 --accept-dns=true
      - TS_NO_LOGS_NO_SUPPORT=true
      - TS_AUTHKEY=xxxxxxxxxxxx  # generate  key del usuario en la web  
    restart: unless-stopped
  1. TS_EXTRA_ARGS ➜ Se debe cambiar el dominio por el nuestro y cambiar el rango local/24 por el nuestro. En el ejemplo:192.168.0.0/24
  2. TS_AUTHKEY ➜ Nos vamos de nuevo a la web de Headscale, y crearemos otro usuario que será de un sólo uso, ya que no se requerirá de nuevo nunca más. Para ello nos dirigimos a User View y clicamos en New User. En el nombre especificaremos el que nosotros queramos. Clicamos en Preauth y le ponemos un Expiry de 1 hora.
  3. Pulsamos en Create y nos generará la clave para pegar dentro de la variable TS_AUTHKEY.

❗ Quizás te preguntes el porqué de crear otro usuario. El motivo es sencillo. En este nuevo usuario hemos generado y activado una Key la cual expirará pasada 1h, así nos aseguramos que nadie puede conectarse con esa Key pasada esa hora.

Si lo hacemos con nuestro usuario principal, tendremos problemas de conexión pasado ese tiempo. Pero sí, también se podría generar la Key en nuestro usuario principal y que nunca expirara, pero ya tendríamos una Key habilitada de manera permanente. Todo se resume en blindar la seguridad del servicio lo máximo posible.

Una vez hecho esto, desplegamos el Stack. Tras unos segundos veremos en la web de Haidscale que nos ha creado otro dispositivo con el rango de nuestra Red en estado pending. Clicamos en pending para aprobarlos.

Después reiniciamos la App de Tailscale de nuestro iPhone/Android, al volver a conectarnos ya veremos las dos conexiones, y si intentamos entrar en nuestros servicios como AdGuard, ya podremos hacerlo.

¡Lo hemos conseguido! Ya tenemos nuestro propio servidor SelfHosted de tailscale funcionando correctamente. Ahora veremos un par de consideraciones finales.


Consideraciones finales

  1. Headscale server está en fase Beta todavía. Es funcional y seguro al 100% pero hay que tenerlo en cuenta.
  2. Aunque este proceso funcione, si preferís usar WireGuard directamente, podéis hacerlo. En HDS+ explicamos cómo instalarlo en el siguiente enlace.
  3. La web UI de Headscale quedará expuesta. Realmente si alguien consigue descubrirla y entrar desde fuera no podrán hacer nada porque la API se vincula solamente la primera vez, por lo que si intentas abrir la misma página en otro navegador no funcionará, aun así, recomiendo una vez hecho este proceso, apagar el contenedor de UI o bien poner Authelia para la conexión.
Invítame a un café



Más artículos

Cómo instalar Outline e integrarlo con Authelia: La mejor alternativa a Notion

Cómo instalar Outline e integrarlo con Authelia: La mejor alternativa a Notion

Instala la mejor solución SelfHosted a Notion con este sencillo tutorial. Intégralo además con Authelia mediante OIDC para beneficiarte del 2FA y de una mayor seguridad.

Por Iván Cánovas, Joan
Ghosler: Envío de emails y Newsletter con Ghost desde cualquier servidor SMTP

Ghosler: Envío de emails y Newsletter con Ghost desde cualquier servidor SMTP

Por defecto Ghost obliga a pagar Mailgun cuyas tarifas son excesivas. Con esta herramienta podrás utilizar otro proveedor de correo electrónico.

Por Joan
Cómo instalar Plausible CE: Estadísticas detalladas de tu sitio Web

Cómo instalar Plausible CE: Estadísticas detalladas de tu sitio Web

Plausible lanza su nueva versión enfocada al SelfHosting. Tutorial completo con envío de emails y Maxmind integrado.

Por Joan