Cum am dat acces la serverul de acasă de oriunde în lume, fără să deschid niciun port
Am montat un Intel NUC ca server și am instalat serviciile self-hosted pe el, totul mergea perfect - dar doar atâta timp cât eram acasă, în rețeaua locală.
Soluția clasică pentru această problemă este să deschizi porturi în router și să expui serviciile direct pe internet. Am refuzat această variantă pentru că un port deschis înseamnă că oricine de pe glob poate bate la ușa serverului. Poate nu intră, dar încearcă - și nu vreau să risc astfel.
Soluția pe care am ales-o se numește Tailscale.
Ce este Tailscale?
Tailscale este un VPN de tip mesh, construit pe baza protocolului WireGuard. Spre deosebire de un VPN tradițional, care trimite tot traficul printr-un server central, Tailscale conectează dispozitivele direct între ele, peer-to-peer. Serverele Tailscale servesc doar ca „ghid de întâlnire" - ajută dispozitivele să se găsească și să facă schimb de chei criptografice, dar nu văd niciodată traficul propriu-zis.
Rezultatul practic: serverul de acasă și telefonul meu se comportă ca și cum ar fi în aceeași rețea locală, indiferent unde se află fizic. Serverul nu este expus pe internet. Nu există niciun port deschis în router. Traficul dintre ele este criptat end-to-end cu WireGuard.
Planul gratuit include până la 100 de dispozitive pentru un singur utilizator, MagicDNS și certificate HTTPS automate - mai mult decât suficient pentru un server mic.
Instalarea pe server
Instalarea lui Tailscale se face cu o singură comandă:
curl -fsSL https://tailscale.com/install.sh | sh
Scriptul adaugă depozitul oficial APT al Tailscale și instalează pachetul. După instalare, pornești Tailscale:
sudo tailscale up
Comanda generează un link de autentificare pe care îl deschizi în browser pe orice alt dispozitiv. Te loghezi în contul Tailscale și serverul apare automat în rețeaua ta.
Verifici că totul e în regulă cu comenzile:
tailscale status
tailscale ip
Vei vedea adresa IP din rețeaua Tailscale - ceva de genul 100.x.x.x - și hostname-ul cu care apare serverul în panoul de administrare.
MagicDNS - fără adrese IP de memorat
Odată conectat, serverul primește o adresă IP din rețeaua Tailscale din intervalul 100.x.x.x. Adresa aceasta este permanentă și nu se schimbă niciodată, indiferent de ISP sau locație.
MagicDNS este activat implicit în panoul de administrare. Dacă nu e, îl activezi din secțiunea DNS. Din acel moment, serverul este accesibil prin nume_server.tailxxxx.ts.net - un nume, nu un număr (chiar dacă este mai lung). MagicDNS funcționează automat pentru toate dispozitivele din rețeaua Tailscale.
Tot din panoul de administrare am activat și HTTPS Certificates - această opțiune permite generarea de certificate SSL valide pentru dispozitivele din rețeaua Tailscale, semnate de Let's Encrypt.
HTTPS pentru Vaultwarden cu Caddy
Cel mai important motiv pentru care am vrut HTTPS nu a fost paranoie, ci necesitate practică. Vaultwarden - serverul meu de gestionare a parolelor, compatibil cu clienții Bitwarden - refuză să funcționeze cu extensia de browser fără HTTPS. Extensia pur și simplu nu se conectează la un server HTTP, indiferent ce setezi.
Primul pas este să generezi certificatul SSL pentru domeniul tău Tailscale. Comanda următoare o rulezi pe server:
sudo tailscale cert nume_server.tailxxxx.ts.net
Comanda scrie două fișiere în directorul curent: nume_kserver.tailxxxxx.ts.net.crt (certificatul public) și nume_server.tailxxxx.ts.net.key (cheia privată). Le-am mutat apoi într-un director dedicat pentru Caddy:
sudo mkdir -p /opt/services/caddy/certs
sudo mv nume_server.tailxxxxxx.ts.net.crt /opt/services/caddy/certs/
sudo mv nume_server.tailxxx.ts.net.key /opt/services/caddy/certs/
sudo chown -R thinkroot:thinkroot /opt/services/caddy
Am ales Caddy ca reverse proxy în locul lui Nginx pentru că este considerabil mai simplu de configurat pentru această situație. Fișierul de configurare, Caddyfile, arată așa:
nume_server.tailxxxx.ts.net {
tls /certs/nume_server.tailxxxxx.ts.net.crt /certs/thinkserver.tailxxx.ts.net.key
reverse_proxy vaultwarden:80
}
Un singur bloc, trei linii. Caddy termină SSL-ul și trimite traficul mai departe la containerul Vaultwarden. Containerul Vaultwarden rulează în Docker, în aceeași rețea cu Caddy:
services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
ports:
- "8222:80"
volumes:
- vaultwarden_data:/data
environment:
DOMAIN: "https://nume_server.tailxxxx.ts.net"
SIGNUPS_ALLOWED: "false"
volumes:
vaultwarden_data:
Caddy rulează și el în Docker, în același director, cu volumul de certificate montat:
services:
caddy:
image: caddy:latest
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- ./certs:/certs
networks:
- vaultwarden_default
networks:
vaultwarden_default:
external: true
Rețeaua vaultwarden_default este creată de containerul Vaultwarden - Caddy se alătură aceleiași rețele ca să poată ajunge la el prin numele vaultwarden.
Celelalte servicii
Celelalte servicii de pe NUC nu au nevoie de HTTPS pentru că nu există niciun client care să le impună asta. Le accesez direct prin IP-ul Tailscale al serverului și portul fiecăruia, de pe orice dispozitiv conectat la rețeaua Tailscale. Funcționează la fel de bine din rețeaua de acasă ca și de pe date mobile - singura diferență e că trece prin Tailscale când sunt în afara casei.
Nginx am luat în calcul la un moment dat pentru a pune serviciile sub un singur domeniu, dar am decis că IP:port funcționează perfect pentru uz personal și complexitatea suplimentară nu aduce niciun beneficiu real.
Cum arată în practică
De pe telefon, cu date mobile, deschid Vaultwarden la https://nume_server.tailxxx.ts.net direct în browser. Certificatul e valid, conexiunea e criptată, extensia Bitwarden se conectează fără probleme. FreshRSS și celelalte le accesez prin adresa IP Tailscale a serverului și portul respectiv.
De pe laptopul, același lucru. Tailscale rulează în fundal, serverul apare ca și cum ar fi în rețeaua locală.
Serverul în sine nu are niciun port deschis în router. Routerul nu știe nimic despre Tailscale - tot ce face Tailscale se stabilește dinăuntru spre afară, nu are nevoie de port forwarding. NAT traversal-ul este automat.
Concluzie
Tailscale a rezolvat exact problema pe care o aveam: acces la serverul de acasă de oriunde, fără să expun nimic pe internet. Instalarea a durat câteva minute. Configurarea HTTPS pentru Vaultwarden cu Caddy a mai adăugat poate douăzeci de minute. Comparativ cu alternativele - VPN tradițional cu server dedicat, port forwarding, certificate manuale - diferența de complexitate este enormă.
Dacă ai un server de acasă sau un Raspberry Pi cu servicii self-hosted și vrei să le accesezi din exterior fără să-ți faci griji pentru securitate, Tailscale este probabil cel mai simplu drum spre acel obiectiv.