This episode covers Tailscale Serve for exposing a local service only to the tailnet with automatic TLS from MagicDNS, plus Tailscale Funnel for exposing a service securely to the public internet, complete with the differences and use cases.

So far we've connected devices and secured access. But there's one big question: how do you expose services? You have an app running on port 3000 on a home server, and you want to access it from anywhere — or even share it with the internet.
Episode 15 introduces two features that answer this: Tailscale Serve for exposing a service only inside the tailnet, and Tailscale Funnel for exposing it to the public internet. Both use automatic TLS from MagicDNS, without opening ports on a firewall.
Tailscale Serve turns a node into a reverse proxy that forwards requests to a local service, accessible only from inside the tailnet. No need to open ports on a router or firewall — access is via the MagicDNS hostname with automatic HTTPS.
sudo tailscale serve 3000The sudo tailscale serve 3000 command exposes port 3000 as https://<hostname>.<tailnet-name>.ts.net. The TLS certificate is handled automatically via MagicDNS.
To run serve without blocking your terminal:
sudo tailscale serve --bg 3000
tailscale serve statustailscale serve status shows all services currently being served along with their targets.
Serve can also proxy to a different port or handle multiple paths:
sudo tailscale serve --bg --set-path=/status 8080The --set-path pattern lets a single hostname serve multiple services on different paths — great for sharing many internal apps from one node.
Tailscale Funnel exposes a service to the public internet — anyone with the URL can access it, with no Tailscale account needed. Traffic still comes in through Tailscale's infrastructure and TLS is managed automatically. Funnel is useful for demos, POCs, or services that genuinely need to be public.
sudo tailscale funnel --bg 3000The sudo tailscale funnel --bg 3000 command publishes the service to a public URL https://<hostname>.ts.net. Nodes that can use Funnel are restricted to certain regions.
tailscale funnel status
sudo tailscale funnel offtailscale funnel off stops the public exposure. Always turn Funnel off after a demo is done — don't leave private services publicly exposed longer than necessary.
Serve -> tailnet only, needs Tailscale login
Funnel -> public internet, no account
Serve -> access via internal .ts.net hostname
Funnel -> access via public .ts.net hostnameYou have an API running on port 8080 on a home server and want the team dashboard to reach it:
sudo tailscale serve --bg 8080
tailscale serve statussudo tailscale serve --bg 8080 exposes the API only to the tailnet. The team opens https://<hostname>.ts.net without needing to know the internal IP — and without opening any firewall ports.
serve status and funnel status regularly.Episode 15 gave you two ways to expose services: Serve for the secure tailnet and Funnel for controlled public access — both with automatic TLS and no firewall changes.
Key takeaways:
tailscale serve 3000 and tailscale funnel --bg 3000.serve status and funnel off are must-knows for control.In the next episode, episode 16, we'll cover Kubernetes, Docker, and containers — running Tailscale as a sidecar in Docker, the tailscale up pattern in immutable containers, and the Tailscale Kubernetes Operator for Ingress, Egress, Service load balancers, and workload identity.