Tailscale serve vs funnel: wat is het verschil?
Ontdek wanneer u Tailscale serve gebruikt voor uw tailnet en wanneer Funnel voor het openbare internet. Leer over de ACL-beleidsregels die Funnel blokkeren voor uw netwerk.
tailscale serve versus funnel: wie kan de URL bereiken
Het verschil tussen tailscale serve en tailscale funnel is uitsluitend de doelgroep. serve plaatst een HTTPS-frontend (hypertext transfer protocol secure) voor een lokale poort en publiceert deze alleen naar uw tailnet. funnel publiceert diezelfde lokale poort naar het volledige openbare internet via relay-servers die door Tailscale worden beheerd. Beide commando's gebruiken dezelfde flags en dezelfde doelen. Eén woord bepaalt het verschil tussen een privédashboard en een dashboard dat voor de hele wereld toegankelijk is.
Beide voorzien u van een certificaat dat browsers al vertrouwen, met een naam die eindigt op ts.net, en bij geen van beide hoeft u een inkomende poort op uw VPS-firewall te openen. Uw tailscaled-daemon onderhoudt al een verbinding met het tailnet, waardoor verkeer via die weg binnenkomt. Een server toevoegen aan het tailnet is één taak, en een VPS als Tailscale exit node draaien of een subnet router adverteren voor een privénetwerk dekt dat onderwerp. Het publiceren van een service die zich al op het tailnet bevindt, is waar dit over gaat.
Vereisten voordat een commando werkt
- Tailscale 1.38.3 of nieuwer op de VPS, ingelogd op uw tailnet. Controleer dit met
tailscale versionentailscale status. - MagicDNS ingeschakeld. MagicDNS is het ingebouwde DNS (domain name system) van Tailscale; dit geeft de machine een naam zoals
blog-vps.your-tailnet.ts.netin plaats van alleen een100.x-adres. - HTTPS-certificaten ingeschakeld voor het tailnet, op de DNS-pagina van de admin console. Zonder dit is er geen certificaat beschikbaar om voor uw poort te plaatsen.
- Alleen voor
funnel: hetfunnel-node-attribuut in het tailnet-policybestand. Hier lopen de meeste eerste pogingen vast; dit wordt hieronder behandeld.
Elk commando hier begint met sudo, omdat de CLI communiceert met tailscaled via een socket waar alleen root naar mag schrijven. Geef één gebruiker het recht om dit over te slaan:
sudo tailscale set --operator=$USERPubliceren naar uw tailnet met tailscale serve
Wijs serve naar een lokale poort en de rest gebeurt automatisch.
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.De kale opdracht 3000 is een verkorte notatie voor http://127.0.0.1:3000. Tailscale luistert op poort 443 van het tailnet-adres van de machine, beëindigt TLS (transport layer security) met het ts.net-certificaat en stuurt platte HTTP door naar uw lokale poort. Uw applicatie hoeft niet te weten dat er een certificaat bestaat; dit is de voornaamste reden om dit te gebruiken voor een beheerpaneel dat u anders op onbeveiligde HTTP zou laten draaien.
Lees nu de laatste regel: Press Ctrl+C to exit. Het commando draait op de voorgrond en de koppeling bestaat alleen binnen dat proces. Sluit de terminal en de URL werkt niet meer, omdat er niets naar de schijf is geschreven. Voeg --bg toe en de koppeling wordt opgeslagen in de serve-configuratie van de node, die zowel de terminal als een herstart overleeft.
sudo tailscale serve --bg 3000Serve accepteert meer dan alleen een poortnummer. --set-path koppelt een service aan een subpad, zodat meerdere applicaties één hostnaam kunnen delen:
sudo tailscale serve --bg --set-path=/grafana 3000
sudo tailscale serve --bg --set-path=/metrics 9090Een doel kan ook een map met statische bestanden zijn, of een backend die al TLS spreekt met een certificaat waarvan u niet wilt dat het wordt gecontroleerd:
sudo tailscale serve --bg /srv/reports
sudo tailscale serve --bg https+insecure://localhost:8443Het is ook niet beperkt tot HTTP. --tcp=<port> stuurt een ruwe TCP (transmission control protocol)-stroom door, en --tls-terminated-tcp=<port> beëindigt TLS op uw node en geeft de platte tekst door. Hiermee plaatst u een vertrouwd certificaat voor een service die helemaal geen HTTP spreekt:
sudo tailscale serve --bg --tls-terminated-tcp=443 tcp://127.0.0.1:9899Waarom geeft funnel aan dat het node-attribuut niet is ingesteld?
Funnel staat standaard uitgeschakeld voor een volledig tailnet. Bij de eerste uitvoering wordt deze melding getoond en stopt het proces:
Funnel not available; "funnel" node attribute not set. See https://tailscale.com/kb/1223/tailscale-funnel/.Het commando was correct. Het tailnet-beleid heeft deze node geen toestemming gegeven om te publiceren, waardoor de client weigert voordat er contact wordt gemaakt met een relay. Bewerk het tailnet-beleidsbestand in de admin-console onder Access Controls en voeg het attribuut toe:
"nodeAttrs": [
{
"target": ["autogroup:member"],
"attr": ["funnel"],
},
],autogroup:member verleent dit aan elk lid van het tailnet. Als slechts één machine mag publiceren, tag die machine dan en richt het beleid op die tag, bijvoorbeeld tag:public. Sla het beleid op en voer het funnel-commando opnieuw uit.
Als uw account een tailnet-beheerder is, bieden recente clients een kortere weg: de CLI toont een toestemmings-URL op login.tailscale.com. Door deze te volgen worden HTTPS-certificaten ingeschakeld en wordt het attribuut automatisch voor u toegevoegd. Als u geen beheerder bent, helpt die URL u niet. Iemand met toegang tot het beleid moet de wijziging doorvoeren.
Publiceren naar het internet met Tailscale Funnel
Zodra het attribuut is ingesteld, gebruikt u het commando dat u al kent, maar dan met een ander werkwoord.
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.Lees die eerste regel elke keer opnieuw. Available within your tailnet en Available on the internet zijn het enige zichtbare verschil tussen een private service en een publieke service, en de commando's die deze genereren verschillen slechts één woord.
Sinds augustus 2026 luistert Funnel alleen op poort 443, 8443 of 10000, en op geen enkele andere poort. De standaard is 443, en --https=8443 of --https=10000 zijn de alternatieven. Elke andere poort wordt geweigerd, omdat de Funnel-relays alleen verbindingen op deze poorten accepteren. Daarom is een Funnel-URL altijd de kale hostnaam, of de hostnaam met :8443 erachter geplakt.
Hoe zie ik wat er op dit moment is gepubliceerd?
Gokken is de reden dat een dashboard soms een maand lang openbaar blijft staan. Vraag het in plaats daarvan aan de node.
tailscale serve status
tailscale funnel status
tailscale serve status --jsonBeide statuscommando's lezen dezelfde configuratie, dus beide geven een volledig beeld. Gebruik de --json-vorm in een script of een geplande controle, omdat de standaarduitvoer is geschreven voor mensen. Wanneer er niets is geconfigureerd, krijgt u één regel:
No serve configAls u dit ziet na een configuratie waarvan u weet dat deze werkte, betekent dit dat de mapping op de voorgrond is aangemaakt en het proces is beëindigd. Maak deze opnieuw aan met --bg.
Om één mapping te verwijderen, herhaalt u het commando waarmee deze is aangemaakt en voegt u off toe aan het einde. Gebruik reset om alle serve- en funnel-mappings op de node te wissen.
sudo tailscale funnel --https=443 3000 off
sudo tailscale serve resetVoer na beide acties opnieuw tailscale serve status uit en lees wat er overblijft, in plaats van aan te nemen dat het resultaat overeenkomt met uw bedoeling.
Wat u krijgt en wat u inlevert
De voordelen zijn reëel en vormen de reden waarom mensen hiervoor kiezen in plaats van voor een reverse proxy.
- Een certificaat dat browsers vertrouwen, automatisch voor u vernieuwd. Geen ACME (automatic certificate management environment) client om te installeren en geen vernieuwingstaak om te vergeten.
- Geen inkomende poort op de VPS-firewall.
tailscaledmaakt verbinding naar buiten, dus een standaard-deny ufw-firewall op uw VPS kan exact zo strikt blijven als deze was. - Geen DNS-record om te kopen, naar te verwijzen of op te wachten.
- Geen port forwarding, wat het hele verhaal is op een machine achter NAT (network address translation) in plaats van een VPS met een publiek IP-adres.
De kosten zijn net zo reëel en funnel brengt deze allemaal met zich mee.
- De naam is niet van u. Publieke bezoekers zien
host.your-tailnet.ts.net. Funnel biedt geen ondersteuning voor aangepaste domeinen, dus u kunt er geenapp.example.comvoor plaatsen. - Het pad is niet van u. Verkeer bereikt eerst een Tailscale-relay en de relay proxiet de stream naar uw node via het tailnet. Tailscale stelt dat funnel-verkeer onderhevig is aan bandbreedtelimieten die niet zijn gepubliceerd en niet kunnen worden geconfigureerd, dus meet uw eigen doorvoer voordat u afhankelijk bent van een getal.
- De besturingselementen ontbreken. Een reverse proxy die u zelf beheert, geeft u toegang tot logs, rate limits, limieten voor verzoekgrootte en een plek om authenticatie te plaatsen. Funnel geeft u een URL. Al het overige moet binnen uw applicatie worden geregeld.
- De poortlijst is vast, zoals hierboven vermeld.
Beide functies leunen ook op infrastructuur die door Tailscale wordt beheerd: certificaatuitgifte voor de ts.net-naam en de funnel-relays zelf. Als u een zelfgehoste Headscale-controlserver overweegt, ga er dan niet vanuit dat beide functies beschikbaar blijven. Controleer de release notes voor de versie van Headscale die u van plan bent te draaien.
Welke moet ik gebruiken?
De regel is kort.
Gebruik serve voor alles wat intern is: beheerinterfaces, dashboards, een metrics-UI die u niet geïndexeerd wilt hebben, of een staging-kopie van een site. Het lidmaatschap van het tailnet fungeert als toegangscontrole, en dit is een degelijke methode. Een apparaat dat niet op het tailnet zit, kan de naam niet eens omzetten.
Gebruik funnel voor een demokoppeling, een webhook-ontvanger waar een derde partij een POST-verzoek naar moet sturen, of een OAuth-callback tijdens de ontwikkeling. Het is de snelste route naar een publieke HTTPS-URL, en met één off-commando beëindigt u deze weer. Publiek betekent echter ook echt publiek: de hostnaam is geen geheim, en een funnel voor een applicatie zonder inlogscherm is een open dienst. Alles wat zich daarachter bevindt, moet de eigen verzoeken verifiëren, met dezelfde zorgvuldigheid als een blootgesteld Ollama API-eindpunt vereist.
Gebruik een echte reverse proxy voor alles wat u als productieomgeving beschouwt. Uw eigen domein, uw eigen certificaat, uw eigen logs, uw eigen rate limits, en niemand anders in het verzoekpad. Nginx, Caddy en Traefik vergelijken als reverse proxy helpt u bij het maken van een keuze.
Foutmodi en de bijbehorende meldingen
Funnel weigert te starten. Funnel not available; "funnel" node attribute not set. is een beleidsprobleem, geen commando-probleem. Voeg het funnel-attribuut toe aan het tailnet-beleidsbestand, sla dit op en probeer het opnieuw.
Het werkte, maar nu zegt tailscale serve status dat No serve config. De mapping werd op de voorgrond aangemaakt en dat proces is beëindigd. Voer hetzelfde commando opnieuw uit met --bg.
De naam wordt omgezet, maar er komt geen antwoord. Serve proxyt naar het doel dat u heeft opgegeven; als daar niets luistert, is er niets om naar te proxyen. Bevestig dit met ss -ltnp | grep 3000 op dezelfde machine waarop tailscaled draait. De meest voorkomende oorzaak is een container die zijn poort publiceert op een Docker-bridge-adres in plaats van op 127.0.0.1, waardoor de host geen listener ziet op de plek waar u die verwachtte. Hoe Docker Compose-netwerken werken laat zien waar een gepubliceerde poort daadwerkelijk terechtkomt.
Certificaatfouten op de ts.net-naam. HTTPS-certificaten zijn hoogstwaarschijnlijk niet ingeschakeld voor het tailnet. Schakel deze in via de admin-console en voer vervolgens de certificaatstap afzonderlijk uit, zodat de foutmeldingen niet verstrengeld raken met de output van serve:
sudo tailscale cert your-host.your-tailnet.ts.netDe funnel laadt wel via mobiele data, maar gedraagt zich anders dan op uw laptop. Uw laptop bevindt zich in het tailnet, waardoor MagicDNS de naam omzet naar het 100.x-adres en u de service rechtstreeks bereikt, zonder tussenkomst van een relay. Dit is het juiste gedrag en betekent dat uw laptop de publieke bereikbaarheid niet kan testen. Gebruik curl vanaf een machine die zich niet in het tailnet bevindt.
FAQ
Wat is het verschil tussen tailscale serve en tailscale funnel?
Wie het resultaat kan bereiken. tailscale serve publiceert een lokale poort op een HTTPS-URL die alleen apparaten in uw tailnet kunnen bereiken. tailscale funnel publiceert dezelfde poort op een URL die iedereen op het internet kan bereiken, gerouteerd via relay-servers die door Tailscale worden beheerd. De flags en de doelen worden gedeeld tussen beide. De eerste uitvoerregel vertelt u welke u heeft gekregen: Available within your tailnet of Available on the internet.
Waarom meldt tailscale funnel dat het node-attribuut niet is ingesteld?
Omdat funnel is uitgeschakeld voor een tailnet totdat iemand het inschakelt. De melding is Funnel not available; "funnel" node attribute not set. en deze is afkomstig van uw eigen client, nog voordat er contact is gelegd met een relay. Voeg een nodeAttrs-item toe dat het funnel-attribuut toekent aan autogroup:member, of aan een tag als slechts één machine mag publiceren, in het tailnet-policybestand onder Access Controls. Een tailnet-beheerder kan in plaats daarvan de toestemmings-URL volgen die de CLI afdrukt.
Welke poorten kan Tailscale Funnel gebruiken?
Alleen 443, 8443 en 10000. De standaard is 443, en u kiest een andere met --https=8443 of --https=10000. Dit is een beperking van de funnel-relays, niet van uw server, dus geen enkele firewallwijziging of configuratiewijziging op de VPS heft dit op. tailscale serve heeft een dergelijke beperking niet, omdat het verkeer nooit uw tailnet verlaat.
Blijft een serve- of funnel-URL behouden na een herstart?
Alleen als u --bg heeft gebruikt. Zonder deze flag draait het commando op de voorgrond, drukt Press Ctrl+C to exit. af, en verdwijnt de mapping zodra het proces stopt. Met --bg wordt de mapping weggeschreven in de serve-configuratie van de node en komt deze na een herstart terug met tailscaled. Controleer dit met tailscale serve status, dat No serve config afdrukt wanneer er niets is ingesteld.
Is het veilig om een funnel aan te laten staan?
Het is veilig in de zin van transport: de verbinding is HTTPS en er staat geen poort open op uw firewall. Het is niet veilig in de zin die mensen doorgaans bedoelen, omdat de URL publiek is en de applicatie erachter dus ook publiek toegankelijk is. Laat een funnel alleen actief voor een service die zijn eigen verzoeken authenticeert, en haal deze weg wanneer de demo of de webhook-test is voltooid, door het commando te gebruiken waarmee deze is aangemaakt met off aan het einde.
Bronnen voor het bovenstaande gedrag van de commando's: de Tailscale Serve en Funnel-documentatie en CLI-referentie op tailscale.com/docs.