Un collegamento cifrato tra due computer che si trovano dietro router, NAT e firewall, senza creare account, senza configurare una VPN e senza conoscere l’indirizzo IP dell’altra macchina. È l’idea alla base di Tailcat, il nuovo strumento open source presentato da Tailscale.
Agli utenti Linux il nome porta subito la mente a un comando noto: Netcat, utilità nata nel 1995 e diventata uno degli strumenti più versatili dell’amministrazione Unix. Tailcat, tuttavia, sostituisce la normale connessione TCP o UDP verso un indirizzo e una porta con un tunnel cifrato capace di attraversare reti differenti.
La definizione scelta dagli sviluppatori è significativa: “Tailscale without Tailscale, by Tailscale“. Tailcat utilizza infatti buona parte della tecnologia che consente ai client Tailscale di stabilire connessioni peer-to-peer, ma elimina completamente il tradizionale control plane. Non esistono tailnet, autenticazione web, utenti, amministratori, criteri ACL o assegnazione di indirizzi Tailscale. Le due macchine si riconoscono attraverso chiavi crittografiche e un token condiviso al di fuori del canale.
Il risultato è proprio Tailcat, uno strumento pensato soprattutto per collegamenti temporanei: trasferimento di dati, accesso SSH, sviluppo remoto, ambienti di test, automazioni e comunicazioni con agenti AI.
Cos’è Tailcat e perché ricorda Netcat
Il repository GitHub di Tailcat permette di capire ancora meglio come funziona il software. Tailcat non è soltanto un programma che “usa WireGuard“: assembla invece diversi componenti della base di codice Tailscale costruendo una rete interamente nello spazio utente. Non installa driver, non crea interfacce TUN/TAP, non modifica il routing del sistema operativo e non richiede privilegi di root o amministratore.
Netcat, nella sua forma classica, legge e scrive dati attraverso connessioni di rete. Può mettersi in ascolto su una porta, collegarsi a un servizio remoto, concatenarsi con altri comandi Unix oppure trasferire rapidamente dati tra due sistemi. La sua forza sta proprio nell’assenza di sovrastrutture.
Tailcat applica la stessa logica alla rete Internet odierna, dove raggiungere direttamente un computer remoto è molto meno scontato. Una macchina può trovarsi dietro NAT (Network Address Translation), CGNAT, firewall aziendali o router sui quali non si vuole configurare alcun port forwarding.
L’utilità appena pubblicata affronta e risolve il problema usando il data plane di Tailscale: WireGuard protegge il traffico, magicsock individua il percorso migliore e DERP offre il punto di incontro iniziale, oltre a funzionare come relay quando il collegamento diretto non riesce.
Come installare Tailcat
Al momento il progetto non offre il classico installer grafico né pacchetti binari stabili nelle release GitHub. La modalità indicata ufficialmente dagli sviluppatori passa da Go. Dopo aver installato una versione recente del linguaggio, Tailcat si aggiunge con un solo comando:
go install github.com/tailscale/tailcat/cmd/tailcat@latest
Il comando scarica il codice e le dipendenze, compila il programma e deposita l’eseguibile nella directory binaria configurata da Go, normalmente $GOPATH/bin oppure $HOME/go/bin. Se il comando tailcat non risulta immediatamente disponibile, bisogna quindi verificare che tale directory sia presente nella variabile d’ambiente PATH.
Il repository supporta anche Nix flakes. Chi usa Nix può eseguire Tailcat senza un’installazione tradizionale:
nix run github:tailscale/tailcat
oppure aggiungerlo al proprio profilo:
nix profile install github:tailscale/tailcat
Non serve installare il normale client Tailscale e non serve autenticarsi a Tailscale. Tailcat utilizza componenti software del progetto, ma funziona come applicazione autonoma.
Prima prova pratica: inviare testo tra due computer
Il modo migliore per capire il funzionamento di Tailcat consiste nel provarlo come se fosse Netcat. Sul primo computer basta digitare tailcat
Il programma individua automaticamente il server DERP più adatto, in genere quello con latenza inferiore. DERP, acronimo di Designated Encrypted Relay for Packets, è il relay cifrato usato da Tailscale come punto di incontro iniziale e come percorso alternativo quando i due peer non riescono a collegarsi direttamente. Si ottiene quindi un output simile al seguente:
# Selected bootstrap relay region 302, San Francisco
# Server listening with new address: tcXXXXXXXXX
Il processo rimane in attesa. La stringa che inizia con tc è l’indirizzo temporaneo del server e deve essere comunicata all’altro computer attraverso un canale separato, per esempio una chat o un terminale remoto.
Sul secondo sistema si può quindi digitare:
echo hello | tailcat tcXXXXXXXXX
La parola hello appare sul terminale del primo computer. Non è stato aperto alcun inoltro di porta sul router, non è necessario conoscere l’IP pubblico e non è stata creata una VPN permanente.
Trasferire un file con Tailcat
La stessa caratteristica permette di trasferire file senza introdurre protocolli aggiuntivi. Sul computer che deve ricevere il file si avvia semplicemente:
tailcat > archivio.zip
Il programma restituisce il token da condividere. Sul computer che possiede il file si può quindi utilizzare:
tailcat tcXXXXXXXXX < archivio.zip
I byte letti attraversano il tunnel e finiscono direttamente nel file sul computer remoto. È una modalità volutamente spartana: Tailcat non mostra una barra di avanzamento, non c’è un ripristino automatico, una gestione delle directory o la verifica applicativa dell’integrità. WireGuard protegge il trasporto, ma per copie importanti conviene comunque confrontare successivamente un hash SHA-256 sui due sistemi.
Esporre una porta locale senza configurare il router
Uno scenario più interessante consiste nel raggiungere un’applicazione in ascolto soltanto sul computer remoto. Supponiamo che sul server sia attiva un’interfaccia web sulla porta 8080. Si può avviare:
tailcat --serve=8080
Per più porte la sintassi accetta valori separati da virgola:
tailcat --serve=8080,8443
Dal client ci si collega specificando token e porta:
tailcat tcXXXXXXXXX 8080
Tailcat inoltra la connessione verso localhost:8080 sul server. Il traffico non richiede una porta TCP pubblicamente aperta: il collegamento viaggia nel tunnel gestito dal programma.
Esiste anche il comando tailcat --serve=all che rende raggiungibili attraverso Tailcat tutte le porte locali. È una funzione potente ma decisamente meno prudente: un token finito nelle mani sbagliate potrebbe fornire accesso a servizi che l’amministratore non intendeva esporre. Meglio indicare soltanto le porte realmente necessarie.
SSH attraverso Tailcat senza port forwarding
Un caso d’uso particolarmente convincente riguarda SSH. Se sul computer remoto gira già un server SSH sulla porta 22, è sufficiente usare il comando che segue:
tailcat --serve=22
Il client può collegarsi attraverso il token usando il sottocomando dedicato:
tailcat ssh tcXXXXXXXXX
In questa configurazione Tailcat trasporta la sessione, mentre l’autenticazione continua a dipendere dal normale server SSH e dalle sue chiavi o credenziali. È probabilmente la scelta più sensata per una macchina reale.
Su Linux e macOS Tailcat include anche un server SSH interno che non richiede autenticazione aggiuntiva:
tailcat --serve=no-auth-ssh
Dal client:
tailcat ssh tcXXXXXXXXX
oppure si può eseguire direttamente un comando:
tailcat ssh tcXXXXXXXXX ls -la
La modalità no-auth-ssh assume che il possesso del token, e quindi la capacità di completare il collegamento WireGuard, rappresenti già l’autorizzazione necessaria. È pratica per ambienti temporanei, macchine virtuali “usa e getta” e sandbox, ma richiede cautela su macchine contenenti dati importanti.
Perché Tailscale cita esplicitamente gli agenti AI
Uno dei casi d’uso messi maggiormente in evidenza riguarda l’utilizzo di agenti AI.
Un agente che opera in una sandbox remota può avere bisogno di inviare un file a una workstation, interrogare temporaneamente un server di test o raggiungere un ambiente di sviluppo. Costringerlo a completare un login web, inserirlo stabilmente in una rete aziendale o consegnargli credenziali persistenti può risultare sproporzionato rispetto all’operazione richiesta.
Con Tailcat l’accesso può durare quanto il processo server: si genera un token effimero, lo si fornisce all’agente, si completa il lavoro e si chiude la sessione. Da tenere presente, comunque, che un token consegnato a un agente può rappresentare un rischio: bisogna limitarne durata, servizi raggiungibili e diffusione.
Tailcat non sostituisce Tailscale
Una rete Tailscale normale offre identità, amministrazione centralizzata, permessi avanzati, gestione dei dispositivi, audit, revoca degli accessi e configurazione persistente. Tailcat elimina deliberatamente queste funzioni per ridurre al minimo gli elementi necessari a creare una connessione.
Per un amministratore sarebbe quindi un errore adottarlo come scorciatoia al posto di una tailnet aziendale. Se decine di utenti devono raggiungere stabilmente decine di servizi, sapere chi può accedere a cosa e revocare centralmente i permessi non è un dettaglio: è esattamente il tipo di problema che il control plane di Tailscale risolve.
Un progetto ancora sperimentale: CLI, API e token possono cambiare
Il repository è pubblico con licenza BSD a tre clausole, ma Tailscale mette in evidenza una limitazione importante: non esiste ancora alcuna garanzia di stabilità. L’API Go, i flag della CLI (interfaccia a riga di comando), il formato dell’output e persino il protocollo utilizzato possono cambiare.
La storia del progetto, peraltro, precede di molto il debutto pubblico. Il primo prototipo nacque a settembre 2023 con il nome derpcat. Inizialmente viveva all’interno di un fork del repository Tailscale e smise più volte di funzionare mentre le componenti interne cambiavano.
Gli sviluppatori hanno poi riportato in vita il progetto trasformandolo in un normale modulo Go che utilizza il codice pubblico di Tailscale come dipendenza.
Tailcat non nasce insomma per reinventare le VPN né per sostituire la gestione centralizzata degli accessi. Prende invece la parte tecnicamente più sofisticata di Tailscale – WireGuard, discovery, NAT traversal, DERP e uno stack TCP/IP userspace – e la comprime in uno strumento che può essere usato con la semplicità di nc.
Per sviluppatori e amministratori che hanno spesso bisogno di collegare due macchine “solo per qualche minuto“, la combinazione è notevole: un comando sul server, un token da passare all’altra estremità e nessuna porta da aprire sul router!