Un tailnet in cui ogni dispositivo raggiunge ogni altro dispositivo è già utile di per sé. Tre aggiunte lo trasformano in una rete vera e propria anziché in un insieme di tunnel, e tutte e tre condividono una caratteristica che trae in inganno molti: il client annuncia una capacità, e il server deve approvarla. Una rotta annunciata ma non approvata semplicemente non esiste, in silenzio, e il sintomo è che si riesce a fare il ping del router ma nulla dietro di esso risponde.
Un router di sottorete — porti un'intera LAN sul tailnet. Una macchina su una rete domestica o d'ufficio annuncia l'intervallo della rete; ogni altro dispositivo raggiunge quindi le stampanti, il NAS e le interfacce di gestione dietro di essa senza dover installare nient'altro lì. Attivi prima l'inoltro nel kernel, altrimenti i pacchetti si fermano al router senza alcun messaggio di errore.
# On the machine that sits inside the LAN:
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-ts.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-ts.conf
sudo sysctl -p /etc/sysctl.d/99-ts.conf
sudo tailscale up --login-server https://vpn.example.com \
--advertise-routes=192.168.1.0/24 --accept-routes
# On the control server — approve it, or it does not exist.
# The subcommand moved between releases; check `hs nodes --help` first.
hs nodes list
hs nodes approve-routes --identifier 3 --routes 192.168.1.0/24
Un nodo di uscita — faccia uscire tutto attraverso il VPS. Lo stesso meccanismo con una rotta più ampia: un dispositivo che si annuncia come nodo di uscita offre di trasportare l'intera connessione internet di un altro dispositivo. Su una rete non fidata di un bar o di un hotel è esattamente ciò che serve, ed è la cosa più vicina a una VPN personale che questa guida offra.
# On the VPS that will do the exiting (forwarding must be on, as above):
sudo tailscale up --login-server https://vpn.example.com --advertise-exit-node
# Approve it on the control server, then on the laptop:
tailscale set --exit-node=100.64.0.1 --exit-node-allow-lan-access
tailscale set --exit-node= # turn it off again
Un nodo di uscita non è una VPN commerciale e non va venduto a se stessi come tale. Il suo indirizzo è solo suo ed è stabile, il che è eccellente contro il Wi-Fi del bar e inutile contro la correlazione a lungo termine tra siti diversi — il compromesso è spiegato nella guida pilastro. Noti anche che può far girare il nodo di uscita su un secondo VPS più economico e tenere il server di controllo completamente libero da traffico inoltrato.
Regole di accesso — le scriva prima che si unisca una seconda persona. La policy predefinita è consenti-tutto, il che è corretto per un tailnet di una sola persona e sbagliato nel momento in cui qualcun altro vi entra. La policy è un piccolo documento HuJSON: gruppi di utenti, tag per le macchine, e un elenco di regole che stabiliscono quali sorgenti possono raggiungere quali destinazioni su quali porte. Punti la configurazione al file, tenga il file sotto controllo di versione, e ricarichi dopo ogni modifica.
{
"groups": {
"group:admin": ["alice"],
"group:contractor":["bob"]
},
"tagOwners": {
"tag:server": ["group:admin"],
"tag:exit": ["group:admin"]
},
"acls": [
// Admins reach everything.
{ "action": "accept", "src": ["group:admin"], "dst": ["*:*"] },
// The contractor reaches one machine, on two ports, and nothing else.
{ "action": "accept", "src": ["group:contractor"],
"dst": ["tag:server:22,443"] }
],
"autoApprovers": {
"routes": { "192.168.1.0/24": ["tag:server"] },
"exitNode": ["tag:exit"]
}
}
Due note su quel file. Il linguaggio della policy è quello di Tailscale, e Headscale ne implementa un sottoinsieme ampio e in crescita, non tutto — controlli la documentazione della sua versione prima di affidarsi a una regola esotica. E il punto in cui la policy risiede si è spostato: le release più vecchie indicavano un percorso nella configurazione di primo livello, quelle più nuove la raggruppano sotto una sezione policy con una modalità che può anche tenere le regole nel database. Entrambe sono documentate; quella che conta è quella che spedisce la sua versione bloccata.
MagicDNS — nomi brevi, e il proprio resolver ovunque. Con MagicDNS attivo, ogni dispositivo risponde a un nome breve all'interno del suffisso scelto al passo 02, quindi ssh nas funziona da qualunque luogo senza un file hosts. La seconda metà è quella interessante: il server di controllo invia anche un elenco di nameserver a ogni client, il che significa che il resolver costruito nella guida al resolver DNS privato può servire il suo telefono sui dati mobili — filtrando, mettendo in cache e senza registrare nulla — pur restando in ascolto su un indirizzo del tailnet che non è raggiungibile da internet in alcun modo.
dns:
magic_dns: true
base_domain: ts.example.com
override_local_dns: true # beat whatever DHCP handed the device
nameservers:
global:
- 100.64.0.5 # your resolver, on the tailnet