Tailscale Serve o Funnel: quale usare e quando
Serve mantiene l'URL accessibile solo alla tailnet; Funnel lo espone su Internet. Scopri la policy che blocca Funnel e come scegliere il comando corretto.
tailscale serve e funnel: chi può raggiungere l'URL
La differenza tra tailscale serve e tailscale funnel riguarda il pubblico di destinazione, e nient'altro. serve aggiunge un front-end HTTPS (hypertext transfer protocol secure) a una porta locale e lo pubblica soltanto sulla tailnet. funnel pubblica la stessa porta locale sull'intera Internet pubblica, tramite i server relay gestiti da Tailscale. I due comandi accettano gli stessi flag e gli stessi target. Una sola parola distingue un dashboard privato da uno raggiungibile da chiunque.
Entrambi forniscono un certificato già considerato attendibile dai browser, per un nome che termina in ts.net, e nessuno dei due richiede l'apertura di una porta in ingresso nel firewall del VPS. Il daemon tailscaled mantiene già una connessione in uscita verso la tailnet, quindi il traffico arriva tramite quella connessione. Aggiungere un server alla tailnet è un'attività distinta, descritta da usare un VPS come exit node Tailscale o pubblicizzare un subnet router per una rete privata. Pubblicare un servizio che si trova già sulla tailnet è l'attività descritta in questa sezione.
Cosa serve prima che uno dei due comandi funzioni
- Tailscale 1.38.3 o versione successiva sul VPS, con accesso effettuato al proprio tailnet. Verificare con
tailscale versionetailscale status. - MagicDNS abilitato. MagicDNS è il DNS (domain name system) integrato in Tailscale e assegna alla macchina un nome come
blog-vps.your-tailnet.ts.net, invece del solo indirizzo100.x. - Certificati HTTPS abilitati per il tailnet nella pagina DNS della console di amministrazione. Senza questa impostazione non è disponibile alcun certificato da anteporre alla propria porta.
- Solo per
funnel, l'attributo del nodofunnelnel file delle policy del tailnet. È questo il punto in cui si interrompe la maggior parte dei primi tentativi; viene illustrato più avanti.
Ogni comando riportato qui inizia con sudo, perché la CLI comunica con tailscaled tramite un socket su cui può scrivere soltanto root. Per consentire a un utente di omettere questo prefisso:
sudo tailscale set --operator=$USERPubblica sul tuo tailnet con tailscale serve
Punta serve a una porta locale e il resto viene gestito automaticamente.
sudo tailscale serve 3000Available within your tailnet:
https://amelie-workstation.pango-lin.ts.net
|-- / proxy http://127.0.0.1:3000
Press Ctrl+C to exit.Il comando 3000 senza argomenti è una forma abbreviata di http://127.0.0.1:3000. Tailscale resta in ascolto sulla porta 443 dell'indirizzo tailnet della macchina, termina TLS (transport layer security) usando il certificato ts.net e inoltra HTTP non cifrato alla porta locale. L'applicazione non deve sapere che esiste un certificato. Questo è il motivo principale per usare questa configurazione davanti a un pannello di amministrazione che altrimenti sarebbe esposto tramite HTTP non cifrato.
Ora osserva l'ultima riga: Press Ctrl+C to exit.. Il comando viene eseguito in primo piano e la mappatura resta all'interno di quel processo. Se chiudi il terminale, l'URL smette di funzionare perché non viene scritto nulla su disco. Aggiungi --bg per salvare la mappatura nella configurazione serve del nodo. La configurazione resta disponibile anche dopo la chiusura del terminale e il riavvio.
sudo tailscale serve --bg 3000Serve supporta più di un semplice numero di porta. --set-path monta un servizio sotto un sottopercorso, così più applicazioni possono condividere lo stesso hostname:
sudo tailscale serve --bg --set-path=/grafana 3000
sudo tailscale serve --bg --set-path=/metrics 9090La destinazione può essere anche una directory con file statici oppure un backend che usa già TLS con un certificato che non vuoi sottoporre a verifica:
sudo tailscale serve --bg /srv/reports
sudo tailscale serve --bg https+insecure://localhost:8443Non è limitato a HTTP. --tcp=<port> inoltra un flusso TCP (transmission control protocol) non modificato, mentre --tls-terminated-tcp=<port> termina TLS sul nodo e inoltra il traffico in chiaro. In questo modo puoi usare un certificato attendibile davanti a un servizio che non supporta affatto HTTP:
sudo tailscale serve --bg --tls-terminated-tcp=443 tcp://127.0.0.1:9899Perché Funnel segnala che l'attributo del nodo non è impostato?
Funnel è disabilitato per impostazione predefinita per un intero tailnet. La prima esecuzione stampa questo messaggio e si interrompe:
Funnel not available; "funnel" node attribute not set. See https://tailscale.com/kb/1223/tailscale-funnel/.Il comando è corretto. La policy del tailnet non ha concesso a questo nodo l'autorizzazione alla pubblicazione, quindi il client rifiuta l'operazione prima ancora di contattare un relay. Modifica il file della policy del tailnet nella console di amministrazione, in Access Controls, e aggiungi l'attributo:
"nodeAttrs": [
{
"target": ["autogroup:member"],
"attr": ["funnel"],
},
],autogroup:member lo concede a tutti i membri del tailnet. Se solo una macchina deve poter pubblicare, assegna un tag a quella macchina e usa invece il tag come destinazione, ad esempio tag:public. Salva la policy, quindi esegui di nuovo il comando Funnel.
Se il tuo account è un amministratore del tailnet, le versioni recenti del client offrono una scorciatoia: la CLI stampa un URL di consenso su login.tailscale.com. Aprendo l'URL abiliti i certificati HTTPS e aggiungi automaticamente l'attributo. Se non sei un amministratore, l'URL non sarà utile. La modifica deve essere effettuata da una persona con accesso alla policy.
Pubblicare su Internet con Tailscale Funnel
Dopo aver impostato l'attributo, il comando è quello che già conosci, ma con un verbo diverso.
sudo tailscale funnel --bg 3000Available on the internet:
https://amelie-workstation.pango-lin.ts.net
|-- / proxy http://127.0.0.1:3000
Press Ctrl+C to exit.Leggi sempre quella prima riga. Available within your tailnet e Available on the internet sono l'unica differenza visibile tra un servizio privato e uno pubblico, e i comandi che li producono differiscono per una sola parola.
Ad agosto 2026, Funnel è in ascolto sulla porta 443, 8443 o 10000, e su nessun'altra porta. Il valore predefinito è 443; --https=8443 o --https=10000 sono le alternative. Qualsiasi altra porta viene rifiutata, perché i relay di Funnel accettano connessioni solo su queste porte. Per questo un URL Funnel contiene sempre il nome host nudo oppure il nome host seguito da :8443.
Come vedere cosa è pubblicato in questo momento?
Le supposizioni sono il motivo per cui un dashboard rimane pubblico per un mese. Interroga invece il nodo.
tailscale serve status
tailscale funnel status
tailscale serve status --jsonEntrambi i comandi di stato leggono la stessa configurazione, quindi uno dei due mostra il quadro completo. Usa la forma --json all’interno di uno script o di un controllo pianificato, perché l’output normale è pensato per le persone. Quando non è configurato nulla, viene visualizzata una riga:
No serve configSe compare dopo una configurazione che sai essere riuscita, significa che il mapping è stato creato in primo piano e che il processo non è più attivo. Ricrealo con --bg.
Per rimuovere un mapping, ripeti il comando che lo ha creato e aggiungi off alla fine. Per eliminare tutti i mapping serve e funnel presenti sul nodo, usa reset.
sudo tailscale funnel --https=443 3000 off
sudo tailscale serve resetEsegui di nuovo tailscale serve status dopo ciascuna delle due operazioni e verifica ciò che rimane, invece di presumere che l’operazione abbia prodotto il risultato previsto.
Cosa si ottiene e a cosa si rinuncia
I vantaggi sono concreti e spiegano perché alcuni scelgono questa soluzione invece di un reverse proxy.
- Un certificato considerato attendibile dai browser, rinnovato automaticamente. Non occorre installare un client ACME (automatic certificate management environment) né ricordarsi di configurare un job di rinnovo.
- Nessuna porta in ingresso nel firewall del VPS.
tailscaledavvia connessioni in uscita, quindi un firewall ufw del VPS con criterio default-deny può rimanere configurato con lo stesso livello di restrizione. - Nessun record DNS da acquistare, configurare o attendere.
- Nessun port forwarding, che è l'aspetto principale su una macchina dietro NAT (network address translation), invece di un VPS con un indirizzo IP pubblico.
I costi sono altrettanto concreti e Funnel li comporta tutti.
- Il nome non è di tua proprietà. I visitatori pubblici vedono
host.your-tailnet.ts.net. Funnel non supporta domini personalizzati, quindi non puoi anteporreapp.example.com. - Il percorso non è sotto il tuo controllo. Il traffico raggiunge prima un relay Tailscale, che inoltra il flusso al tuo nodo tramite la tailnet. Tailscale dichiara che il traffico Funnel è soggetto a limiti di larghezza di banda non pubblicati e non configurabili. Misura quindi il throughput effettivo prima di fare affidamento su un valore.
- Mancano i controlli. Un reverse proxy gestito da te offre access log, rate limiting, limiti sulla dimensione delle richieste e un punto in cui configurare l'autenticazione. Funnel fornisce un URL. Tutto il resto deve essere gestito dall'applicazione.
- L'elenco delle porte è fisso, come indicato sopra.
Entrambe le funzionalità dipendono inoltre dall'infrastruttura gestita da Tailscale: dall'emissione del certificato per il nome ts.net e dai relay Funnel. Se stai valutando un control server Headscale self-hosted, non dare per scontato che queste funzionalità siano disponibili anche con esso. Controlla le note di rilascio relative alla versione di Headscale che intendi eseguire.
Quale devo usare?
La regola è semplice.
Usa serve per tutto ciò che è interno: interfacce di amministrazione, dashboard, interfacce per le metriche che non vuoi indicizzare e copie di staging di un sito. L'appartenenza alla tailnet costituisce il controllo degli accessi ed è un controllo efficace. Un dispositivo che non appartiene alla tailnet non può nemmeno risolvere il nome.
Usa funnel per un link dimostrativo, un endpoint che riceve webhook a cui un sistema di terze parti deve inviare richieste POST oppure un callback OAuth durante lo sviluppo. È il modo più rapido per ottenere un URL HTTPS pubblico e un solo comando off lo disattiva. Pubblico significa pubblico, però: il nome host non è un segreto e un funnel davanti a un'applicazione senza login espone un servizio aperto. Ciò che si trova dietro deve autenticare autonomamente le richieste, con la stessa attenzione necessaria per un endpoint API Ollama esposto.
Per tutto ciò che considereresti produzione, usa un reverse proxy reale. Il tuo dominio, il tuo certificato, i tuoi log, i tuoi limiti di frequenza e nessun altro componente nel percorso della richiesta. Confronto tra nginx, Caddy e Traefik come reverse proxy illustra come scegliere.
Modalità di errore e messaggi visualizzati
Funnel non si avvia. Funnel not available; "funnel" node attribute not set. indica un problema di policy, non di comando. Aggiungi l'attributo funnel al file della policy tailnet, salvalo e riprova.
Prima funzionava, ora tailscale serve status restituisce No serve config. Il mapping è stato creato in primo piano e il processo è terminato. Esegui di nuovo lo stesso comando con --bg.
Il nome viene risolto, ma non risponde nulla. Serve esegue il proxy verso la destinazione specificata. Se su quella destinazione non è in ascolto nulla, non c'è alcun servizio verso cui inoltrare le richieste. Verifica con ss -ltnp | grep 3000 sulla stessa macchina che esegue tailscaled. La causa frequente è che un container pubblichi la porta sull'indirizzo di un bridge Docker invece che su 127.0.0.1. Di conseguenza, sull'host non c'è alcun listener nel punto previsto. Come funziona il networking di Docker Compose spiega dove viene effettivamente pubblicata una porta.
Errori del certificato sul nome ts.net. Probabilmente i certificati HTTPS non sono abilitati per la tailnet. Abilitali nella console di amministrazione, quindi esegui separatamente il passaggio relativo al certificato, in modo che i relativi errori non si mescolino all'output di serve:
sudo tailscale cert your-host.your-tailnet.ts.netFunnel funziona sulla rete dati mobile, ma si comporta diversamente sul laptop. Il laptop è connesso alla tailnet, quindi MagicDNS risolve il nome nell'indirizzo 100.x e raggiungi direttamente il servizio, senza passare da un relay. È il comportamento previsto e significa che il laptop non può verificare in alcun modo la raggiungibilità pubblica. Usa curl da una macchina che non è connessa alla tailnet.
FAQ
Qual è la differenza tra tailscale serve e tailscale funnel?
Chi può raggiungere il risultato. tailscale serve pubblica una porta locale su un URL HTTPS raggiungibile solo dai dispositivi presenti nel tuo tailnet. tailscale funnel pubblica la stessa porta su un URL raggiungibile da chiunque su Internet, instradato tramite i relay server gestiti da Tailscale. I flag e le destinazioni sono condivisi tra i due comandi. La prima riga dell'output indica quale dei due hai ottenuto: Available within your tailnet oppure Available on the internet.
Perché tailscale funnel segnala che l'attributo del nodo non è impostato?
Perché funnel è disabilitato per un tailnet finché qualcuno non lo abilita. Il messaggio è Funnel not available; "funnel" node attribute not set. e proviene dal client locale, prima che venga contattato qualsiasi relay. Aggiungi una voce nodeAttrs che conceda l'attributo funnel a autogroup:member, oppure a un tag se solo una macchina deve pubblicare, nel file delle policy del tailnet, alla voce Access Controls. In alternativa, un amministratore del tailnet può seguire l'URL di consenso stampato dalla CLI.
Quali porte può usare Tailscale Funnel?
Solo 443, 8443 e 10000. Il valore predefinito è 443; puoi scegliere un'altra porta con --https=8443 o --https=10000. Questo è un limite dei relay di funnel, non del server, quindi nessuna modifica al firewall o alla configurazione del VPS può rimuoverlo. tailscale serve non ha questa limitazione, perché il traffico non esce mai dal tuo tailnet.
Un URL di serve o funnel resta disponibile dopo un riavvio?
Solo se hai usato --bg. Senza questa opzione, il comando viene eseguito in primo piano, stampa Press Ctrl+C to exit. e la mappatura scompare insieme al processo. Con --bg la mappatura viene scritta nella configurazione serve del nodo e viene ripristinata con tailscaled dopo un riavvio. Verifica con tailscale serve status: quando non è impostato nulla, stampa No serve config.
È sicuro lasciare funnel in esecuzione?
È sicuro dal punto di vista del trasporto: la connessione usa HTTPS e nessuna porta viene aperta sul firewall. Non è sicuro nel senso normalmente attribuito al termine, perché l'URL è pubblico e quindi è pubblica anche l'applicazione raggiunta tramite quell'URL. Lascia funnel attivo solo davanti a un servizio che autentica autonomamente le richieste e disattivalo al termine della demo o del test del webhook, usando il comando che lo ha creato con off alla fine.
Fonti per il comportamento dei comandi descritto sopra: la documentazione e il riferimento CLI di Tailscale Serve e Funnel disponibili su tailscale.com/docs.