SSD Nodes Learn 🎉 VPS ab $5.50/Monat
Anleitungen Matt ConnorVon Matt Connor

Tailscale Serve oder Funnel: Was ist der Unterschied?

Serve stellt HTTPS nur im Tailnet bereit, Funnel öffnet denselben Port öffentlich. Erfahren Sie, welche Policy Funnel blockiert und wann Sie welchen Befehl nutzen.

tailscale serve vs funnel: Wer die URL erreichen kann

Der Unterschied zwischen tailscale serve und tailscale funnel betrifft ausschließlich die Zielgruppe. serve stellt einen HTTPS-Front-End für einen lokalen Port bereit und veröffentlicht ihn nur in Ihrem Tailnet. funnel veröffentlicht denselben lokalen Port über die von Tailscale betriebenen Relay-Server im gesamten öffentlichen Internet. Beide Befehle verwenden dieselben Flags und dieselben Ziele. Ein einziges Wort entscheidet darüber, ob ein Dashboard privat bleibt oder weltweit erreichbar ist.

Beide stellen Ihnen ein Zertifikat bereit, dem Browser bereits vertrauen, und verwenden dafür einen Namen mit der Endung ts.net. Bei keinem der beiden Befehle muss ein eingehender Port in der Firewall Ihres VPS geöffnet werden. Ihr tailscaled-Daemon hält bereits eine ausgehende Verbindung zum Tailnet, sodass der Datenverkehr darüber eintrifft. Einen Server in das Tailnet aufzunehmen, ist eine Aufgabe für sich. Einen VPS als Tailscale-Exit-Node zu betreiben oder einen Subnet-Router für ein privates Netzwerk anzukündigen deckt diesen Bereich ab. Einen Dienst zu veröffentlichen, der bereits im Tailnet liegt, ist die Aufgabe dieses Abschnitts.

Was vor der Ausführung eines der beiden Befehle erforderlich ist

  • Tailscale 1.38.3 oder neuer auf dem VPS, beim tailnet angemeldet. Prüfen Sie dies mit tailscale version und tailscale status.
  • MagicDNS ist aktiviert. MagicDNS ist das integrierte DNS (Domain Name System) von Tailscale. Es weist dem Rechner einen Namen wie blog-vps.your-tailnet.ts.net zu, statt nur eine 100.x-Adresse zu verwenden.
  • HTTPS-Zertifikate sind für das tailnet auf der DNS-Seite der Administrationskonsole aktiviert. Andernfalls gibt es kein Zertifikat, das Sie vor Ihren Port schalten können.
  • Nur für funnel: das Knotenattribut funnel in der tailnet-Richtliniendatei. An dieser Stelle scheitern die meisten ersten Versuche. Der Abschnitt weiter unten behandelt dieses Thema.

Jeder Befehl beginnt hier mit sudo, weil die CLI über einen Socket mit tailscaled kommuniziert, in den nur root schreiben darf. Erteilen Sie einem Benutzer die Berechtigung, darauf zu verzichten:

sudo tailscale set --operator=$USER

Mit tailscale serve im Tailnet veröffentlichen

Verweisen Sie serve auf einen lokalen Port. Den Rest übernimmt tailscale serve.

sudo tailscale serve 3000
Available within your tailnet:
https://amelie-workstation.pango-lin.ts.net

 |-- / proxy http://127.0.0.1:3000

Press Ctrl+C to exit.

Das einfache 3000 ist eine Kurzform für http://127.0.0.1:3000. Tailscale lauscht auf Port 443 der Tailnet-Adresse des Computers, beendet TLS (Transport Layer Security) mit dem Zertifikat ts.net und leitet unverschlüsseltes HTTP an Ihren lokalen Port weiter. Ihre Anwendung muss nicht wissen, dass ein Zertifikat vorhanden ist. Das ist der wichtigste Grund, diese Funktion vor einem Administrationsbereich einzusetzen, den Sie sonst nur über unverschlüsseltes HTTP bereitstellen würden.

Beachten Sie nun die letzte Zeile: Press Ctrl+C to exit. Der Befehl läuft im Vordergrund, und die Zuordnung bleibt innerhalb dieses Prozesses bestehen. Wenn Sie das Terminal schließen, funktioniert die URL nicht mehr, weil nichts auf die Festplatte geschrieben wurde. Mit --bg wird die Zuordnung in der Serve-Konfiguration des Knotens gespeichert. Sie bleibt sowohl nach dem Schließen des Terminals als auch nach einem Reboot erhalten.

sudo tailscale serve --bg 3000

Serve akzeptiert mehr als nur eine Portnummer. --set-path bindet einen Dienst unter einem Unterpfad ein, sodass mehrere Anwendungen denselben Hostnamen verwenden können:

sudo tailscale serve --bg --set-path=/grafana 3000
sudo tailscale serve --bg --set-path=/metrics 9090

Als Ziel können Sie auch ein Verzeichnis mit statischen Dateien oder ein Backend angeben, das bereits TLS mit einem Zertifikat verwendet, dessen Prüfung Sie deaktivieren möchten:

sudo tailscale serve --bg /srv/reports
sudo tailscale serve --bg https+insecure://localhost:8443

Die Funktion ist nicht auf HTTP beschränkt. --tcp=<port> leitet einen unveränderten TCP-Datenstrom (Transmission Control Protocol) weiter. --tls-terminated-tcp=<port> beendet TLS auf Ihrem Knoten und leitet den entschlüsselten Datenstrom weiter. Dadurch steht vor einem Dienst, der überhaupt kein HTTP unterstützt, ein vertrauenswürdiges Zertifikat zur Verfügung:

sudo tailscale serve --bg --tls-terminated-tcp=443 tcp://127.0.0.1:9899

Warum meldet Funnel, dass das Node-Attribut nicht gesetzt ist?

Funnel ist standardmäßig für ein gesamtes Tailnet deaktiviert. Beim ersten Aufruf wird diese Meldung ausgegeben, und der Vorgang wird beendet:

Funnel not available; "funnel" node attribute not set. See https://tailscale.com/kb/1223/tailscale-funnel/.

Der Befehl war korrekt. Die Tailnet-Richtlinie hat diesem Node nicht die Berechtigung zum Veröffentlichen erteilt. Daher beendet der Client den Vorgang, bevor er überhaupt einen Relay kontaktiert. Bearbeiten Sie die Tailnet-Richtliniendatei in der Administrationskonsole unter Access Controls und fügen Sie das Attribut hinzu:

"nodeAttrs": [
  {
    "target": ["autogroup:member"],
    "attr":   ["funnel"],
  },
],

autogroup:member erteilt es allen Mitgliedern des Tailnets. Wenn nur eine Maschine veröffentlichen darf, versehen Sie diese Maschine mit einem Tag und verwenden Sie stattdessen das Tag als Ziel, zum Beispiel tag:public. Speichern Sie die Richtlinie und führen Sie den Funnel-Befehl erneut aus.

Wenn Ihr Konto Tailnet-Administrator ist, bieten aktuelle Clients eine Abkürzung: Die CLI gibt unter login.tailscale.com eine Zustimmungs-URL aus. Wenn Sie diese URL aufrufen, werden HTTPS-Zertifikate aktiviert und das Attribut automatisch hinzugefügt. Wenn Sie kein Administrator sind, hilft Ihnen diese URL nicht. Eine Person mit Zugriff auf die Richtlinie muss die Änderung vornehmen.

Im Internet mit Tailscale Funnel veröffentlichen

Sobald das Attribut gesetzt ist, entspricht der Befehl dem bereits bekannten Befehl, verwendet aber ein anderes Verb.

sudo tailscale funnel --bg 3000
Available on the internet:
https://amelie-workstation.pango-lin.ts.net

 |-- / proxy http://127.0.0.1:3000

Press Ctrl+C to exit.

Lesen Sie diese erste Zeile jedes Mal. Available within your tailnet und Available on the internet sind der einzige sichtbare Unterschied zwischen einem privaten und einem öffentlichen Dienst. Die Befehle, die sie erzeugen, unterscheiden sich durch ein einziges Wort.

Stand August 2026 lauscht Funnel auf Port 443, 8443 oder 10000 und auf keinem anderen Port. Der Standard ist 443. --https=8443 oder --https=10000 sind die Alternativen. Jeder andere Port wird abgewiesen, weil Funnel-Relays nur auf diesen Ports Verbindungen akzeptieren. Deshalb enthält eine Funnel-URL immer nur den Hostnamen oder den Hostnamen mit angehängtem :8443.

Wie sehe ich, was derzeit veröffentlicht ist?

Raten führt dazu, dass ein Dashboard einen Monat lang öffentlich bleibt. Fragen Sie stattdessen den Node.

tailscale serve status
tailscale funnel status
tailscale serve status --json

Beide Statusbefehle lesen dieselbe Konfiguration. Daher zeigt jeder von ihnen das vollständige Bild. Verwenden Sie die Form --json in einem Script oder einem geplanten Check, weil die normale Ausgabe für Menschen formatiert ist. Wenn nichts konfiguriert ist, erhalten Sie eine Zeile:

No serve config

Wenn diese Ausgabe nach einer nachweislich erfolgreichen Einrichtung erscheint, wurde das Mapping im Vordergrund erstellt und der Prozess ist beendet. Erstellen Sie es mit --bg erneut.

Um ein Mapping zu entfernen, wiederholen Sie den Befehl, mit dem es erstellt wurde, und setzen Sie off an das Ende. Um alle Serve- und Funnel-Mappings auf dem Node zu löschen, verwenden Sie reset.

sudo tailscale funnel --https=443 3000 off
sudo tailscale serve reset

Führen Sie danach erneut tailscale serve status aus und prüfen Sie, was übrig bleibt, statt anzunehmen, dass der Befehl das Gewünschte ausgeführt hat.

Was Sie erhalten und was Sie aufgeben

Die Vorteile sind real. Deshalb wählen viele diese Lösung statt eines Reverse Proxy.

  • Ein von Browsern vertrauenswürdiges Zertifikat, das automatisch erneuert wird. Sie müssen keinen ACME-Client (automatic certificate management environment) installieren und keinen Erneuerungsjob einrichten.
  • Kein eingehender Port in der Firewall des VPS. tailscaled baut ausgehend die Verbindung auf. Eine standardmäßig alles ablehnende ufw-Firewall auf Ihrem VPS kann daher genauso restriktiv bleiben wie zuvor.
  • Kein DNS-Eintrag, den Sie kaufen, setzen oder dessen Aktivierung Sie abwarten müssen.
  • Keine Portweiterleitung. Das ist bei einem Rechner hinter NAT (network address translation) entscheidend, anders als bei einem VPS mit öffentlicher IP-Adresse.

Die Nachteile sind genauso real. Funnel bringt sie alle mit sich.

  • Der Name gehört nicht Ihnen. Öffentliche Besucher sehen host.your-tailnet.ts.net. Funnel unterstützt keine benutzerdefinierten Domains. Sie können daher app.example.com nicht davor setzen.
  • Der Pfad gehört nicht Ihnen. Der Datenverkehr erreicht zuerst ein Tailscale-Relay. Das Relay proxyt den Datenstrom über das Tailnet zu Ihrem Node. Tailscale weist darauf hin, dass für Funnel-Datenverkehr Bandbreitenbegrenzungen gelten, die nicht veröffentlicht und nicht konfiguriert werden können. Messen Sie daher den eigenen Durchsatz, bevor Sie sich auf einen bestimmten Wert verlassen.
  • Die Steuerungsmöglichkeiten fehlen. Ein Reverse Proxy, den Sie selbst betreiben, bietet Zugriffsprotokolle, Ratenbegrenzungen, Obergrenzen für die Anforderungsgröße und eine Stelle für die Authentifizierung. Funnel bietet Ihnen eine URL. Alles andere muss in Ihrer Anwendung umgesetzt werden.
  • Die Portliste ist wie oben beschrieben festgelegt.

Beide Funktionen stützen sich außerdem auf Infrastruktur, die Tailscale betreibt: die Ausstellung von Zertifikaten für den Namen ts.net und die Funnel-Relays selbst. Wenn Sie einen selbst gehosteten Headscale-Control-Server in Betracht ziehen, sollten Sie nicht davon ausgehen, dass diese Funktionen mit Ihnen wechseln. Prüfen Sie die Release Notes für die Headscale-Version, die Sie ausführen möchten.

Welche Variante sollte ich verwenden?

Die Regel ist kurz.

Verwenden Sie serve für alles Interne: Administrationsoberflächen, Dashboards, eine Metrikoberfläche, die nicht indexiert werden soll, oder eine Staging-Kopie einer Website. Die Mitgliedschaft im Tailnet ist die Zugriffskontrolle, und sie ist zuverlässig. Ein Gerät, das sich nicht im Tailnet befindet, kann den Namen nicht einmal auflösen.

Verwenden Sie funnel für einen Demo-Link, einen Webhook-Empfänger, an den ein Dritter per POST senden muss, oder einen OAuth-Callback während der Entwicklung. Damit erhalten Sie am schnellsten eine öffentliche HTTPS-URL, und ein off-Befehl beendet die Freigabe. Öffentlich bedeutet allerdings öffentlich: Der Hostname ist kein Geheimnis, und ein Funnel vor einer Anwendung ohne Login ist ein offener Dienst. Alles dahinter muss seine Anfragen selbst authentifizieren, mit derselben Sorgfalt, die ein offener Ollama-API-Endpunkt erfordert.

Verwenden Sie für alles, was Sie als produktiv bezeichnen würden, einen echten Reverse Proxy. Ihre Domain, Ihr Zertifikat, Ihre Logs, Ihre Rate-Limits und niemand sonst im Request-Pfad. nginx, Caddy und Traefik als Reverse Proxy im Vergleich hilft bei der Auswahl.

Fehlerbilder und die angezeigten Meldungen

Funnel startet nicht. Funnel not available; "funnel" node attribute not set. ist ein Richtlinienproblem, kein Problem mit dem Befehl. Fügen Sie das Attribut funnel zur Tailnet-Richtliniendatei hinzu, speichern Sie die Datei und wiederholen Sie den Vorgang.

Der Zugriff hat funktioniert, und jetzt zeigt tailscale serve status No serve config an. Das Mapping wurde im Vordergrund erstellt, und der Prozess wurde beendet. Führen Sie denselben Befehl erneut mit --bg aus.

Der Name wird aufgelöst, aber niemand antwortet. Serve leitet Anfragen an das angegebene Ziel weiter. Wenn dort nichts lauscht, gibt es kein Ziel für die Weiterleitung. Prüfen Sie dies mit ss -ltnp | grep 3000 auf demselben Computer, auf dem tailscaled ausgeführt wird. Häufig veröffentlicht ein Container seinen Port auf einer Docker-Bridge-Adresse statt auf 127.0.0.1. Dadurch sieht der Host an der erwarteten Stelle keinen lauschenden Dienst. So funktioniert die Netzwerkanbindung in Docker Compose zeigt, an welcher Stelle ein veröffentlichter Port tatsächlich verfügbar ist.

Zertifikatsfehler beim Namen ts.net. HTTPS-Zertifikate sind für das Tailnet wahrscheinlich nicht aktiviert. Aktivieren Sie sie in der Administratorkonsole. Führen Sie anschließend den Zertifikatsschritt separat aus, damit sich seine Fehlermeldungen nicht mit der Ausgabe von Serve vermischen:

sudo tailscale cert your-host.your-tailnet.ts.net

Funnel wird über mobile Daten geladen, verhält sich aber auf Ihrem Laptop anders. Ihr Laptop ist mit dem Tailnet verbunden. Daher löst MagicDNS den Namen in die Adresse 100.x auf, und Sie erreichen den Dienst direkt, ohne ein Relay zu verwenden. Das ist korrekt und bedeutet, dass Ihr Laptop die öffentliche Erreichbarkeit überhaupt nicht testen kann. Verwenden Sie curl auf einem Computer, der nicht mit dem Tailnet verbunden ist.

FAQ

Was ist der Unterschied zwischen tailscale serve und tailscale funnel?

Wer kann das Ergebnis erreichen? tailscale serve veröffentlicht einen lokalen Port unter einer HTTPS-URL, die nur Geräte in Ihrem tailnet erreichen können. tailscale funnel veröffentlicht denselben Port unter einer URL, die jeder im Internet erreichen kann. Der Datenverkehr wird dabei über Relay-Server geleitet, die Tailscale betreibt. Die Flags und Ziele sind bei beiden Befehlen identisch. Die erste Ausgabezeile zeigt, welche Variante aktiviert wurde: Available within your tailnet oder Available on the internet.

Warum meldet tailscale funnel, dass das Node-Attribut nicht gesetzt ist?

Weil funnel für ein tailnet deaktiviert ist, bis es jemand aktiviert. Die Meldung lautet Funnel not available; "funnel" node attribute not set. und stammt von Ihrem eigenen Client, bevor ein Relay kontaktiert wird. Fügen Sie unter Access Controls in der tailnet-Richtliniendatei einen Eintrag nodeAttrs hinzu, der das Attribut funnel für autogroup:member gewährt. Alternativ können Sie ein Tag verwenden, wenn nur eine Maschine veröffentlichen soll. Ein tailnet-Administrator kann stattdessen der vom CLI ausgegebenen Zustimmungs-URL folgen.

Welche Ports kann Tailscale Funnel verwenden?

Nur 443, 8443 und 10000. Standardmäßig wird 443 verwendet. Einen anderen Port wählen Sie mit --https=8443 oder --https=10000. Dies ist eine Einschränkung der Funnel-Relays und nicht Ihres Servers. Eine Änderung an der Firewall oder Konfiguration auf dem VPS hebt diese Einschränkung daher nicht auf. Für tailscale serve gilt diese Einschränkung nicht, weil der Datenverkehr das tailnet nie verlässt.

Bleibt eine Serve- oder Funnel-URL nach einem Reboot bestehen?

Nur wenn Sie --bg verwendet haben. Ohne diese Option läuft der Befehl im Vordergrund, gibt Press Ctrl+C to exit. aus und entfernt das Mapping zusammen mit dem Prozess. Mit --bg wird das Mapping in die Serve-Konfiguration des Nodes geschrieben und nach einem Reboot mit tailscaled wiederhergestellt. Prüfen Sie dies mit tailscale serve status. Wenn nichts gesetzt ist, gibt der Befehl No serve config aus.

Ist es sicher, einen Funnel dauerhaft laufen zu lassen?

Im Hinblick auf den Transport ist dies sicher: Die Verbindung verwendet HTTPS, und an Ihrer Firewall ist kein Port geöffnet. Im üblichen Sinn ist es jedoch nicht sicher, weil die URL öffentlich ist und damit auch die dahinterliegende Anwendung öffentlich erreichbar ist. Verwenden Sie einen Funnel nur vor einer Anwendung, die ihre Anfragen selbst authentifiziert. Beenden Sie ihn nach dem Ende der Demo oder des Webhook-Tests mit dem Befehl, der ihn erstellt hat, und off am Ende.

Quellen für das oben beschriebene Befehlsverhalten sind die Dokumentation und die CLI-Referenz zu Tailscale Serve und Funnel unter tailscale.com/docs.