Headscale come alternativa a Tailscale

Tailscale è un ottimo modo per collegare tra loro server diversi.
I client sono open source e disponibili per una grande varietà di piattaforme, non da ultima i NAS Synology, compreso il mio vecchio DS214se.
La configurazione è rapida e di nessuna difficoltà, le prestazioni sono inferiori a quelle che pare si possano avere utilizzando un semplice tunnel Wireguard ma sono comunque all’altezza dei compiti svolti dai miei server amatoriali.
Il problema è che il server di autenticazione è l’unico componente proprietario.

Headscale è un’implementazione opensource del server Tailscale.
Al momento in cui scrivo è arrivato alla release 0.12, quindi il progetto non ancora del tutto maturo, ma dalle mie prime prove è già utilizzabile con un buon margine di tranquillità.

Per l’installazione mi sono avvalso di questo tutorial, con qualche aggiunta presa qua e là.
Questa procedura prevede che Docker e Docker Compose siano installati sulla macchina che farà da server, io ho utilizzato una VPS molto economica con Debian Buster ed installarli è facile.
E’ inoltre necessario un web proxy – io ho utilizzato Nginx con certbot che gestisce i certificati SSL e relativi redirect.
Questo è un esempio di configurazione:

# Redirect HTTP to HTTPS
server {
    if ($host = esempio.miodominio.it) {
        return 301 https://$host$request_uri;
    } # managed by Certbot


    listen 80;
    listen [::]:80;
    server_name esempio.miodominio.it;
    return 301 https://$host$request_uri;


}
server {
    listen 443 ssl;
    server_name esempio.miodominio.it;

    client_body_timeout 5m;
    client_header_timeout 5m;

    access_log            /var/log/nginx/esempio.miodominio.it.log;
    error_log            /var/log/nginx/esempio.miodominio.it.error.log info;

    # reverse proxy
    location / {
         proxy_pass http://127.0.0.1:27896;  # headscale listen_addr
         proxy_read_timeout 6m;
         proxy_ignore_client_abort off;
         proxy_request_buffering off;
         proxy_buffering off;
         proxy_no_cache "always";
         proxy_set_header Host $host;
         proxy_set_header X-Real-IP $remote_addr;
         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    ssl_certificate /etc/letsencrypt/live/esempio.miodominio.it/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/esempio.miodominio.it/privkey.pem; # managed by Certbot
}

Per l’installazione dei client sulle varie piattaforme la documentazione reperibile sul sito di Tailscale o con una qualsiasi ricerca è sufficientemente esauriente e di facile esecuzione.

Come prima cosa creaiamo la cartella in cui installeremo Headscale:

sudo mkdir -p /opt/headscale

Spostiamoci nella cartella appena creata e eseguiamo i seguenti comandi:

mkdir -p ./config
touch ./config/db.sqlite
curl https://raw.githubusercontent.com/juanfont/headscale/main/config-example.yaml -o ./config/config.yaml

abbiamo così creata una cartella per le configurazioni, al cui interno abbiamo creato un file .sqlite per l’archivio e scaricato una copia dell’esempio di file di configurazione. Le modifiche a questo ultimo file saranno minime.

Ora creiamo il file docker-compose.yml:

nano docker-compose.yml

version: '3.5'
services:
  headscale:
    image: headscale/headscale:latest
    volumes:
      - ./config:/etc/headscale/
      - ./data:/var/lib/headscale
    ports:
      - 27896:8080
    command: headscale serve
    restart: unless-stopped

La porta esterna è la 27896, ma siete liberi di cambiarla come meglio preferite, impostate correttamente il proxy (cfr. la configurazione di Nginx qui sopra).

Prima di avviare Headscale editiamo il file di configurazione:

nano config/config.yml

inserendo l’URL del nostro server:

server_url: https://esempio.miodominio.it

Adesso possiamo avviare Headscale:

docker-compose up -d

Sui client, una volta installato Tailscale, basterà specificare il server di login al momento dell’avvio perchè tutto funzioni quasi magicamente:

tailscale up --login-server https://esempio.miodominio.it