LLearning Tailscale

Tailscale

Updated

Tailscale puts all your devices on one private network that works from anywhere, with no ports opened and no VPN server to run.

At a glance#

Tailscale has two halves. A coordination server that Tailscale runs tells each of your devices who the others are and which keys to trust. Your devices then send traffic straight to each other over WireGuard, encrypted end to end.

A coordinator hands out keys; your devices then talk directlycontrol plane: keys and policydata plane: your traffic, encrypted end to endsign inkeys, device list, policydirectdirectrelayed, still encryptedIdentity providerGoogle, GitHub, Microsoft,Apple, Okta, any OIDCCoordination server (control plane)holds public keys, device list, policynever sees your traffic or private keysYour laptopon cafe Wi-Fi, behind NATTailscale client + keysCloud serverfor example n8n on a VPSTailscale client + keysHome machinebehind a strict routerTailscale client + keysDERP relayused only if direct failsforwards encrypted packets
how Tailscale fits together · control plane, 3 devices, 1 relay

The dashed lines carry only keys and rules. The solid lines carry your traffic, and they never pass through Tailscale's servers unless a direct path is impossible, in which case a DERP relay forwards the packets it cannot read.

The problem it solves#

You want to reach a machine that is not on your local network: your n8n box, a home PC, a GPU server running an agent. The usual ways either expose that machine to the whole internet or route everything through one server you have to run.

A hub VPN detours every packet; a mesh goes straightBefore: classic hub VPNAfter: Tailscale meshVPN serveropen port, one choke pointLaptopServerHome PCLaptop to Home PC goes via the serverslow if it is far away, down if it is downServerLaptopHome PCLaptop to Home PC goes straight thereno open ports, no server in the middle
hub VPN vs mesh · the same 3 devices
ApproachWhat you exposePath your traffic takesSetup and upkeepWho can get in
Port forwarding on your routerA public port on your home IP, open to anyone who scans itStraight in, if your ISP allows it (many mobile and CGNAT ISPs do not)Router rules, dynamic DNS, TLS certs, patchingAnyone who finds the port and gets past the login
Classic VPN server (OpenVPN, a WireGuard hub)One public VPN portEvery packet goes through the VPN server, even between two devices in the same cityRun and patch the server, hand out configs and keys by handAnyone holding a valid config file
TailscaleNothing: devices only make outbound connectionsDevice to device, directly where possibleInstall the app, sign inOnly devices signed in to your tailnet, and only where your policy allows

The last column is the real shift. Old VPNs trust whoever is "inside". Tailscale ties every device to a signed-in identity and checks a policy for every connection, which is what people mean by zero trust networking.

How a connection is made#

Tailscale is WireGuard plus the hard parts WireGuard leaves to you: handing out keys, finding each device, and getting through routers. The coordination server does the first two; your devices do the third themselves.

Every connection starts through a relay, then upgrades to directDevice Ayour laptopControlcoordinationDERPnearest relayDevice Byour server1 Sign inbrowser login; node public key registered2 Get the network mappeer keys, 100.x addresses, policy3 Learn your public addressSTUN on UDP 3478 to nearby DERP servers4 Talk at once, via the relayfirst packets go A to DERP to B, encrypted5 Swap addressesdisco CallMeMaybe messages, through DERP6 Punch holesboth send at once so each NAT lets replies in7 Go directWireGuard over UDP, straight from A to BIf step 6 fails: a peer relay in your tailnet is tried next, and DERP keeps carrying the traffic if that fails too.
first connection between two devices · 7 steps, from the Tailscale docs

Tailscale says more than nine in ten connections end up direct (NAT traversal improvements, October 2025). Because step 4 happens before the direct path is found, you never wait for hole punching: the first packets already flow through the relay.

The three keys on every device

KeyMade whenWhat it doesLeaves the device?
Machine keyThe app is installedProves to the coordination server which physical machine this isOnly the public half
Node keyEach sign-inThe WireGuard key other devices use to encrypt traffic to you; it expires (default 180 days) and is revoked the moment you remove the deviceOnly the public half
Disco keyWith the node keyEncrypts the small discovery messages (ping, pong, "call me maybe") devices use to find a pathOnly the public half

Private keys never leave your device, so the coordination server could not decrypt your traffic even if it wanted to. It is "a shared drop box for public keys", in Tailscale's own words (How Tailscale works).

Inside the tunnel. Traffic uses WireGuard: Curve25519 key exchange, ChaCha20-Poly1305 encryption, a fresh session key every 2 minutes. Tailscale ships its own tuned userspace WireGuard (wireguard-go), which in its tests outran the Linux kernel module: 13.0 Gb/s against 11.8 Gb/s on one bare-metal box (more throughput, April 2023).

If the coordination server goes down, connections you already have keep working on the keys and rules each device cached. New devices, new keys and policy changes wait until it is back (control and data planes).

Direct or relayed#

A connection is direct unless both ends sit behind "hard" routers. Then traffic goes through a relay, which is slower but still encrypted end to end.

Tailscale tries the fastest path first, and falls back only when it must1st choiceDirectWireGuard over UDP 41641device to device, no middlemanfastest, lowest latencystatus shows: direct ip:port2nd choicePeer relayone of your own devicesforwards UDP on a port you picknear direct speedstatus shows: peer-relaylast resort, always worksDERP relayrun by Tailscale, HTTPS port 44328 locations in 18 countriesslower, capped throughputstatus shows: relay "lhr"Arrows: what happens when the path before it is blocked. Every path is end-to-end encrypted; relays only forward.Tailscale keeps probing while relayed, and switches to direct the moment a hole punch succeeds.
connection paths in order of preference · from the Tailscale connection types and DERP docs

Why direct sometimes fails. Most home routers use "easy" NAT: your device keeps the same public port whoever it talks to, so the other side can aim at it. A "hard" (symmetric) NAT picks a new port for every destination, so the other side has nothing to aim at. Cloud NAT gateways (AWS, for example) and some corporate and mobile networks behave this way. One hard side can often still be punched; two cannot.

Your sideOther sideResult
No NAT (public IP)AnythingDirect
Easy NATEasy NATDirect
Easy NATHard NATUsually relayed
Hard NATHard NATRelayed
UDP blocked by a firewallAnythingRelayed through DERP on port 443

Source: device connectivity and connection types. Tailscale's blog puts the odds of punching through two hard NATs at about 0.01% in 20 seconds (How NAT traversal works).

DERP (Designated Encrypted Relay for Packets) has two jobs: it carries the setup messages that let devices find each other, and it relays traffic when nothing else works. It runs over HTTPS on port 443, so it gets through almost any firewall. It forwards packets by public key and cannot decrypt them. Each device picks the nearest region as its "home DERP" (DERP servers).

Peer relays let one of your own machines with a reachable UDP port do the relaying instead, so you skip Tailscale's shared relays. They went generally available on all plans, the free one included, on February 18, 2026 (Peer Relays GA). In Tailscale's example a path through the Los Angeles DERP took about 40 ms against 3 to 5 ms through a peer relay. Turn one on with tailscale set --relay-server-port=40000 on a box with that UDP port open, then allow it in your policy with the tailscale.com/cap/relay capability. Client and relay both need version 1.86 or later.

How to tell which path you are on

tailscale status          # each peer shows: direct 1.2.3.4:41641, relay "lhr", or peer-relay
tailscale ping my-server  # shows "via DERP(lhr)" first, then "via 1.2.3.4:41641" once direct
tailscale netcheck        # UDP: true/false; MappingVariesByDestIP: true means you are behind a hard NAT

To get more direct connections: turn on UPnP or NAT-PMP on your router, open UDP 41641 inbound on servers, give cloud servers a public IP instead of a NAT gateway, or add a peer relay.

Tailnets, addresses and MagicDNS#

Your tailnet is your private network: every device you sign in, with a fixed address and a name. Each device gets an address in the 100.x range that never changes, wherever the device goes.

ThingWhat it looks likeNotes
TailnetEverything signed in under your account or organizationOne per sign-up; Enterprise can run several
Tailnet DNS nametail1a2b3c.ts.net, or a "fun name" like cat-crocodile.ts.netPick a fun name under DNS settings, Rename tailnet (tailnet name)
IPv4 address100.101.102.x, from 100.64.0.0/10That range is reserved for carrier-grade NAT, so it rarely clashes with home (192.168.x) or office (10.x) networks
IPv6 addressfd7a:115c:a1e0::...Private IPv6 range; works even if your ISP has no IPv6
MagicDNS namen8n-box or n8n-box.tail1a2b3c.ts.netThe device's name, so ssh n8n-box just works; on by default since October 2022
Quad100100.100.100.100A resolver that lives on each device and answers MagicDNS lookups locally; it never crosses the network
HTTPS certificatehttps://n8n-box.tail1a2b3c.ts.nettailscale cert gets a real Let's Encrypt cert; the private key stays on the device

Addresses change only if you remove and re-add the device, reset it, or an admin changes it by hand (IP addresses).

Split DNS sends lookups for one domain to a chosen server: for example, corp.internal to your office DNS server, everything else to normal DNS (DNS). Turn MagicDNS off on one device with tailscale set --accept-dns=false.

One privacy catch with HTTPS certs. Every certificate is logged in public Certificate Transparency logs, so the machine name and tailnet name become public. Do not turn on HTTPS if a machine name gives something away (HTTPS certificates). Certificates last 90 days; Serve and Caddy renew them for you.

Who can reach what: ACLs, grants and tags#

A brand-new tailnet lets every device reach every other device. The moment you add a second person or a server you do not fully trust, you replace that with a policy file, and from then on anything the policy does not allow is blocked.

The policy lives in the admin console under Access controls, written in HuJSON (JSON that allows comments and trailing commas). The coordination server turns it into firewall rules and pushes each device only the rules and keys it needs; each device then drops disallowed packets itself. A device you are not allowed to reach is not even in your device list.

Grants or ACLs? Grants are the newer syntax and what Tailscale recommends for every new tailnet. Old acls rules still work and can sit in the same file while you migrate, but new features only come to grants (grants vs ACLs).

Building blockWhat it isExample
UserA person, by their sign-in emailmusaib@example.com
GroupA named list of usersgroup:admins
TagAn identity for a machine, not a person; a tagged server keeps working if the person who added it leavestag:server, tag:ci
tagOwnersWho may put a tag on a device; a tag must be listed here before use"tag:server": ["group:admins"]
AutogroupBuilt-in sets Tailscale keeps up to dateautogroup:member (everyone in the tailnet), autogroup:self (your own devices), autogroup:internet (via an exit node)
HostA friendly name for an IP or subnet"home-lan": "192.168.1.0/24"
GrantWho (src) may reach what (dst) on which ports (ip), optionally through a router (via)see below
SSH ruleWho may SSH as which user, and whether to re-check their loginsee below
TestA check that runs on every save; a failing test blocks the change"accept": ["tag:server:22"]

A worked policy for a setup like yours: you are the admin, a server runs n8n, a box runs AI agents, GitHub Actions deploys, and one machine is an exit node.

{
  // People
  "groups": { "group:admins": ["you@example.com"] },

  // Who may tag machines
  "tagOwners": {
    "tag:server": ["group:admins"],
    "tag:agent":  ["group:admins"],
    "tag:ci":     ["group:admins"],
    "tag:exit":   ["group:admins"],
  },

  "grants": [
    // Everyone reaches their own devices
    { "src": ["autogroup:member"], "dst": ["autogroup:self"], "ip": ["*"] },
    // Admins reach every tagged machine on any port
    { "src": ["group:admins"], "dst": ["tag:server", "tag:agent"], "ip": ["*"] },
    // AI agents may call n8n (port 5678) and nothing else on the server
    { "src": ["tag:agent"], "dst": ["tag:server"], "ip": ["tcp:5678"] },
    // CI may only SSH in to deploy
    { "src": ["tag:ci"], "dst": ["tag:server"], "ip": ["tcp:22"] },
    // Members may browse the internet through the exit node
    { "src": ["autogroup:member"], "dst": ["autogroup:internet"], "via": ["tag:exit"], "ip": ["*"] },
  ],

  // Tailscale SSH: admins log in to tagged boxes, re-confirming sign-in every 12 hours
  "ssh": [
    { "action": "check", "src": ["group:admins"], "dst": ["tag:server", "tag:agent"], "users": ["autogroup:nonroot", "root"] },
    { "action": "accept", "src": ["tag:ci"], "dst": ["tag:server"], "users": ["deploy"] },
  ],

  // Saved only if these hold
  "tests": [
    { "src": "tag:agent", "accept": ["tag:server:5678"], "deny": ["tag:server:22"] },
  ],
}

What this policy allows, at a glance:

FromOwn devicestag:servertag:agentInternet via exit node
You (group:admins)All portsAll ports, SSH with re-checkAll ports, SSH with re-checkYes
tag:agent (AI agent box)NoPort 5678 onlyNoNo
tag:ci (GitHub runner)NoSSH as deploy onlyNoNo
Anyone else you addAll portsNoNoYes

Good habits. Tag every server rather than leaving it under your personal account; tagged devices also have key expiry off by default. Write a test for each rule you care about. If you change the policy from the console and from Terraform or GitOps, the file wins, so pick one place.

Routing traffic: exit nodes, subnet routers, app connectors#

Normally only traffic to other tailnet devices goes through Tailscale. Three features let one device carry traffic further: all of your internet browsing, a whole LAN, or just a few domains.

Three ways a tailnet device carries traffic beyond the tailnetYour laptopanywhere, onthe tailnetExit nodecarries all your internet traffic--advertise-exit-nodeSubnet routeropens a whole LAN to you--advertise-routes=CIDRApp connectorroutes chosen domains onlytag + domains in the consoleThe internetsites see the exit node's IPe.g. your home IP abroadHome or office LANprinter, NAS, camerasno Tailscale installed on themA SaaS appsees one fixed source IPfits IP allowlistsinside the tailnet: WireGuard, policy-checkedordinary traffic beyond the router
exit node, subnet router, app connector · from the Tailscale routing docs
FeatureUse it whenSet up on the router deviceThen
Exit nodeYou want a home IP while travelling, or safe browsing on cafe Wi-FiTurn on IP forwarding (Linux), then sudo tailscale set --advertise-exit-nodeApprove it in the console (Machines, Edit route settings); on the client tailscale set --exit-node=home-pc; stop with tailscale set --exit-node=
Mullvad exit nodesYou want exits in many countries without running serversNothing: buy the add-on ($5 a month per 5 devices, beta)tailscale exit-node list, then pick one
Subnet routerYou need devices that cannot run Tailscale: a printer, NAS, camera, an office LAN, a cloud VPCIP forwarding, then sudo tailscale set --advertise-routes=192.168.1.0/24Approve the routes; Linux clients run sudo tailscale set --accept-routes
App connectorA SaaS tool only accepts logins from allowlisted IPsA Linux box with a public IP and forwarding, given a tagList the domains for that tag in the console; traffic to those domains leaves from that box's IP
Tailscale ServicesYou want a stable name like svc:n8n that can move between hosts or run on severalDefine the service in the console; on each tagged host tailscale serve --service=svc:n8n --https=443 127.0.0.1:5678Grant access with "dst": ["svc:n8n"]

IP forwarding on Linux, needed for exit nodes and subnet routers:

echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf

Three things trip people up. If you write your own policy, exit traffic is blocked until you add a grant to autogroup:internet (the worked policy above has one). Exit nodes on macOS, Windows and Android are slower because they route in userspace; a Linux box makes the best exit node. And a subnet router hides your real address behind its own by default (SNAT), which is usually what you want. MagicRoute, in beta since October 19, 2026, picks automatically between several redundant routers, exit nodes or connectors.

Tailscale SSH#

Tailscale SSH lets you log in to a server with no SSH keys at all: your Tailscale sign-in is the key, and the policy file decides who may log in as which user.

Ordinary SSHTailscale SSH
How you prove who you areA private key file on your laptop, its public half in ~/.ssh/authorized_keys on every serverYour Tailscale identity (Google, GitHub, etc.); nothing to copy around
Port 22 exposedUsually to the whole internetOnly inside the tailnet; the Tailscale daemon answers it
Removing someoneHunt down their key on every serverRemove them from the tailnet or the policy; it applies everywhere at once
Extra login checkNone by defaultcheck mode makes you re-confirm your sign-in (and MFA) every 12 hours by default
Session recordingSeparate toolingWas built in; now moving to the paid Tailscale PAM extension (old recorder support ends August 2027)

Turn it on

# on the server (Linux, or macOS with the open-source tailscaled)
sudo tailscale set --ssh

# from your laptop: plain ssh, by MagicDNS name
ssh root@n8n-box

You also need an ssh rule in the policy file (see the worked policy above) and a grant that lets you reach port 22. accept lets you straight in; check sends you to your identity provider first, from 1 minute up to 168 hours between checks. Synology and QNAP cannot be Tailscale SSH servers (Tailscale SSH).

Plans. The SSH docs say all plans; the pricing page lists "Basic Tailscale SSH, up to 5 hosts" on Standard and "Advanced Tailscale SSH" (such as custom check periods) on Premium. Free Personal tailnets can use it.

Why it matters for agents. A coding agent on a remote box (Claude Code, Codex, Hermes) is reached the same way: ssh agent-box, then run it inside tmux so it keeps going when you close the laptop. The setups section below walks through it.

Serve and Funnel#

Serve puts a local app on a private HTTPS address only your tailnet can open; Funnel puts the same address on the public internet. Both give you a real certificate with no reverse proxy, no open router port and no domain to buy.

Serve shares an app with your tailnet; Funnel opens it to the internettailscale serve 5678https://n8n-box.tail1a2b3c.ts.netYour tailnet devicesphone, laptop, agent boxsigned in, policy allowsAnyone on the interneta webhook caller, a client,no Tailscale, no sign-inFunnel relaypublic DNS, ports 443/8443/10000passes TLS through unreadn8n-box (your server)app listens on localhost:5678Tailscale holds the HTTPS certand decrypts here, on your boxno port opened on the routerno reverse proxy to runtailscale funnel 5678Both give the same https://name.ts.net address. Serve answers only tailnet devices; Funnel answers anyone who has the URL.
Serve vs Funnel · one app on port 5678
ServeFunnel
Who can open itTailnet devices your policy allowsAnyone with the URL
Addresshttps://<device>.<tailnet>.ts.netThe same, resolvable on public DNS (can take up to 10 minutes)
PortsAny443, 8443 or 10000 only
ProtocolsHTTPS, HTTP, raw TCP, TLS-terminated TCPTLS only
Status and plansAll plansBeta, all plans, client 1.38.3 or later, bandwidth capped (limits not published)
NeedsMagicDNS and HTTPS certificates onThe same, plus the funnel attribute in the policy (the first run walks you through it)
Good forPrivate dashboards, n8n editor, Jupyter, a model server for your agentsWebhooks from Stripe, GitHub or WhatsApp, a demo for a client, a short-lived share

Commands

tailscale serve 5678                 # private HTTPS -> localhost:5678 (stays in the foreground)
tailscale serve --bg 5678            # same, kept running across reboots
tailscale serve --bg --set-path=/api 8000   # mount another app under /api
tailscale serve status               # what is being served
tailscale serve --https=443 off      # stop it

tailscale funnel --bg 5678           # public HTTPS -> localhost:5678
tailscale funnel status
tailscale funnel --https=443 off

A port is either served or funnelled: whichever command ran last wins (Funnel, serve CLI). Funnel traffic is still encrypted to your device: Tailscale's relay passes the TLS stream through without decrypting it. But the app itself is now public, so it needs its own login.

Taildrop, sharing and the other features#

Beyond connecting devices, Tailscale has a toolbox of smaller features. The ones worth knowing, with how to use each:

FeatureWhat it doesHow you use itStatus
TaildropSend files between your own devices, like AirDrop across any OStailscale file cp report.pdf my-phone: (note the colon); receive with sudo tailscale file get .Alpha; your own devices only
Device sharingLet someone outside your tailnet reach one machineMachines, Share, by email or link; they cannot connect back to you unless you share tooAll plans; link sharing beta
Ephemeral nodesDevices that delete themselves 30 to 60 minutes after going offlineAn ephemeral auth key, or tailscaled --state=mem:All plans; ideal for CI and containers
Auth keysJoin a server without a browser loginKeys page, Generate auth key (one-off or reusable, ephemeral, pre-approved, tagged; 1 to 90 days); sudo tailscale up --auth-key=tskey-...All plans
OAuth clientsLong-lived credentials for automation and the API, scoped and tag-boundTrust credentials page; the secret works as an auth key with --advertise-tagsAll plans
Workload identity federationCI jobs and cloud workloads join using their own short-lived OIDC token, so no secret is storedtailscale up --client-id=... --audience=... --advertise-tags=tag:ciGA February 2026, all plans
tsnetA Go library that makes your program its own tailnet devicesrv := new(tsnet.Server); srv.Hostname = "mybot"; ln, _ := srv.Listen("tcp", ":80")Open source
Kubernetes operatorExpose cluster services to the tailnet, reach tailnet services from pods, proxy the API serverHelm chart tailscale/tailscale-operatorAll plans
Docker imageRun Tailscale as a sidecar containertailscale/tailscale with TS_AUTHKEY, TS_STATE_DIR (keep it on a volume or every restart is a new device), TS_SERVE_CONFIGAll plans
Userspace networkingRun Tailscale where you cannot create a network device: Heroku, Cloud Run, locked-down containerstailscaled --tun=userspace-networking --socks5-server=localhost:1055, then point apps at that proxyAll plans
ApertureAn AI gateway: agents and apps call model APIs using their tailnet identity instead of shared API keys, with quotas and audit logsSold separately; GA August 2026Paid extension
LogsConfiguration audit logs (who changed what, 90 days) on every plan; network flow logs (who talked to whom, metadata only) on PremiumLogs page, or stream to a SIEMVaries by plan

Aperture is the newest piece and the most relevant to AI work: it puts one gateway between your agents and providers like Anthropic or OpenAI, so no agent box ever holds a raw API key (Aperture GA).

Sign-in and trust: who gets in#

Tailscale has no passwords of its own. You sign in with an identity provider you already use, and every device inherits that identity. Four controls then decide whether a device is trusted, each stricter than the last.

LayerWhat it checksDefaultWhere to set it
Identity providerWho you are: Google, Microsoft or Entra ID, GitHub, Apple, Okta, OneLogin, any OIDC provider, or a passkeyRequired; there is no email and password sign-upChosen when the tailnet is created; MFA is set at the provider, not in Tailscale
User approvalA new person must be approved before joiningOn for tailnets created since May 22, 2025Settings, User management
Device approvalEach new device waits for an admin to approve itOffSettings, Device management
Key expiryEvery device must sign in again after a set time180 days (1 to 180 allowed); tagged devices never expireSettings, Key expiry; per device on the Machines page
Tailnet LockNew devices must be signed by keys you hold, so even Tailscale's servers cannot add oneOfftailscale lock init on trusted devices

Key expiry in practice. When a device's key expires it drops off the tailnet until someone signs in on it again with sudo tailscale up --force-reauth. For servers, either tag them (tagged devices skip expiry) or click Disable key expiry on that machine. An admin can also give an expired device 30 extra minutes from the console while you fix it.

Tailnet Lock, step by step#

Normally you trust Tailscale's coordination server to hand out only real public keys. Tailnet Lock removes that trust: each device's key must carry a signature from one of your trusted lock keys, checked by every client. A compromised control plane could no longer slip in a rogue device.

# 1. On each device you want as a signer, print its lock key
tailscale lock status

# 2. On one of them, turn the lock on with up to 20 signer keys
tailscale lock init tlpub:KEY1 tlpub:KEY2
#    It prints 10 disablement secrets. Store them offline.

# 3. When a new device joins, sign it from a signer device
tailscale lock sign nodekey:NEWNODE tlpub:SIGNERKEY

The catches: it needs client v1.46.1 or later; Android devices cannot be signers; you cannot use it together with device approval; and if you lose every signer and all 10 disablement secrets, nobody can add devices, Tailscale included. For one person with a handful of machines, device approval plus key expiry is usually enough; Tailnet Lock suits people who must not depend on Tailscale's servers at all (Tailnet Lock docs).

Plans and pricing#

For you alone, Tailscale is free: the Personal plan covers up to 6 users and unlimited personal devices, as long as the use is non-commercial. Wenkraft work counts as commercial, so a business tailnet belongs on Standard at $8 a seat a month. These are the "Pricing v4" plans Tailscale launched on April 8, 2026.

PlanPriceUsersDevicesNotable extras
Personal$0, non-commercial onlyUp to 6Unlimited user devices; 50 tagged resources (servers, connectors), then $1 a month each3 ACL groups, 1,000 ephemeral minutes a month
Standard (was Starter)$8 per seat per monthUnlimitedUnlimited user devicesSCIM, device posture, MDM config, advanced user roles, 10 ACL groups
Premium$18 per seat per monthUnlimitedUnlimited user devicesJust-in-time access, advanced Tailscale SSH, network flow logs, log streaming, 300 ACL groups
EnterpriseCustomCustomCustomInvoicing, custom contract, custom tailnet subdomains, a solutions engineer
Free for up to 6 people; 10 people on Standard pay $80 a monthMonthly bill by number of seats, Pricing v4 list prices, no annual discount published$0$90$180$270$360US$ per month15101520seats (people on the plan)10 seatsPersonal: $0 per seat per month, up to 6 seats shownPersonal: $0, up to 6 users, non-commercialStandard: $8 per seat per month, up to 20 seats shown$80Standard, $8 a seatPremium: $18 per seat per month, up to 20 seats shown$180Premium, $18 a seat
tailscale.com/pricing, read Nov 15, 2026 · list prices per seat per month

How billing works. You pay per seat, not per active user, and empty seats still cost money. A seat fills the first time a person logs in to the admin console or signs in a device. Seats added mid-month are prorated.

Add-ons. Mullvad exit nodes (route your traffic out through Mullvad VPN's servers) cost $5 a month for every 5 devices. Aperture, Tailscale's AI gateway, and the PAM, CI/CD, workload and IoT extensions are sold separately through sales.

Features on every plan, the free one included. MagicDNS, Tailscale SSH, Funnel, Serve, Taildrop, exit nodes, subnet routers, Peer Relays (2 free relays) and Tailscale Services all work on Personal.

What changed. The old plans (Pricing v3, April 2023) gave 3 free users and 100 devices, and Starter cost $6 per active user. Personal Plus is gone; its 6-user limit is now the free limit. Older blog posts and comparison sites still quote the v3 numbers.

Headscale: running the control plane yourself#

The Tailscale apps on your devices are open source, but the coordination server is not. Headscale is an independent, open-source (BSD-3) rewrite of that server. You run it on your own box, point the official Tailscale apps at it, and nothing about your network touches Tailscale's company servers. It is not made by Tailscale, though a Tailscale engineer helps maintain it.

Tailscale (hosted)Headscale (self-hosted)
CostFree for personal use; paid per seat for teamsFree; you pay for the server it runs on
Who runs itTailscaleYou: updates, backups, uptime, TLS
TailnetsMany, with an admin consoleOne per server; managed by CLI, or a third-party web UI such as Headplane
ClientsOfficial appsThe same official apps (v1.80.0 or later), pointed at your server with --login-server
MagicDNS, Taildrop, tags, subnet routers, exit nodesYesYes
ACLs and grantsYesYes; grants since 0.29.0
Tailscale SSH, including check modeYesYes
RelaysGlobal DERP fleet plus peer relaysEmbedded DERP server you run, plus peer relays; can also borrow Tailscale's public DERP map
Sign-inBig identity providers, passkeysOIDC (bring your own), or pre-auth keys
Funnel, Serve with HTTPS certs, flow logs, app connectors, ApertureYesNo
Tailnet LockYesNot listed as supported
SupportDocs, plus vendor support on paid plansCommunity only

The current release is 0.29.x (0.29.7 per the docs in early November 2026). The project says it is not tested behind reverse proxies or in containers, so it runs best as a plain binary with its own TLS.

# On the Headscale server
headscale users create musaib
headscale preauthkeys create --user musaib --expiration 24h

# On each device, use the normal Tailscale app
sudo tailscale up --login-server https://hs.example.com --auth-key <KEY>

Should you use it? Only if self-hosting is the point: privacy, an air-gapped network, or curiosity. For a solo setup, the free hosted Personal plan does more (Funnel, HTTPS Serve, a console) with no server to maintain.

Alternatives compared#

Two questions separate the options: who runs the pieces, and whether devices talk directly (a mesh) or everything goes through a hub or tunnel.

Tailscale is the easiest mesh; the others trade ease for control or shapeClaude-estimated positions, judged from each product's own docsDirect meshHub or tunnelRun for you (sign up and go)You run every partTailscaleZeroTierNetBird (cloud or self-host)HeadscalePlain WireGuardCloudflare TunnelTwingateOpenVPN
Claude-estimated map of the options · who runs it vs how traffic flows
OptionModelProtocolFree tierPaid fromSelf-hostBest at
TailscaleManaged meshWireGuard6 users, non-commercial$8 per seat a monthControl plane via Headscale onlyLeast setup, best NAT traversal, most features
ZeroTierManaged mesh, layer 2Own protocol (Salsa20, Poly1305)10 devices, non-commercial$18 a month (Essential)Yes, own controllerVirtual LAN: broadcast, games, odd protocols
NetBirdMesh, cloud or self-hostedWireGuard5 users, 100 machines€6 per user a monthYes, fully (server AGPL)Tailscale-like, but you can own everything
Cloudflare TunnelOutbound tunnel to Cloudflare's edgeQUIC or HTTP/2Free; Zero Trust free to 50 users$7 per user a monthNoPutting a web app on a public domain behind Cloudflare
TwingateZero-trust connectorsTLS5 usersPer userConnectors onlyTeam access to private resources, no mesh
WireGuardPoint-to-point, manualWireGuardFreeFreeYes, you do everythingFastest, smallest, if you enjoy key management
OpenVPNClassic hub VPNTLS (OpenSSL)Community Edition free; Access Server 2 connections$7 per connection a month, billed yearlyYesLegacy setups and appliances that speak only OpenVPN

How to choose. Want it working in five minutes across laptops, servers and phones: Tailscale. Must own every server: NetBird self-hosted or Headscale. Need a public website without opening ports: Cloudflare Tunnel, or Tailscale Funnel for something small. Need a true virtual LAN with broadcast traffic: ZeroTier. Two fixed machines and no third party at all: plain WireGuard.

Tailscale and Cloudflare Tunnel are not really rivals. A common pattern is Tailscale for private access to your own machines, and Cloudflare Tunnel for the one service the public needs to reach.

Setups for you#

Five concrete setups that match how you work: self-hosted n8n, home machines, AI and coding agents on remote boxes, Claude Code on a server, and CI. They all live in one free Personal tailnet.

One tailnet joins your laptop, n8n, home machine, agent box and CIExample layout; names such as agent-box are placeholders for your owndeploys over the tailnetYour laptop and phonewhere you work fromtailscale upGitHub Actionsephemeral node per runjoins via workload identityn8n (self-hosted)editor private; only webhooks publichttps://n8n.your-tailnet.ts.netHome machinefiles, GPU; subnet router for the LANssh you@home-pcAgent box (VPS)Claude Code in tmux, tag:agenttailscale ssh you@agent-box
example tailnet for your setup · 1 laptop, 3 servers, CI

1. Claude Code on a server, from anywhere#

The goal: a long-running Claude Code session on a VPS that you can check from your laptop or phone, with port 22 closed to the internet.

  1. On the server, install and join with SSH on and a tag: curl -fsSL https://tailscale.com/install.sh | sh, then sudo tailscale up --ssh --advertise-tags=tag:agent.

  2. In your policy file, let your own devices SSH in and give the tag nothing else (see the policy below).

  3. Close port 22 in the VPS firewall. Tailscale SSH does not need it.

  4. From your laptop: tailscale ssh you@agent-box, then tmux new -As claude and run claude inside.

  5. Detach with Ctrl-b d. Later, from any device, tailscale ssh you@agent-box and tmux attach -t claude puts you back in the same session. On a phone, any SSH app works once the Tailscale app is on.

2. AI and coding agents on remote boxes, safely#

An agent with shell access is the device you should trust least. Tag every agent box, let people reach it, and do not let it reach anything back:

{
  "tagOwners": { "tag:agent": ["autogroup:admin"], "tag:ci": ["autogroup:admin"] },
  "grants": [
    { "src": ["autogroup:member"], "dst": ["tag:agent"], "ip": ["*"] },
    { "src": ["tag:ci"], "dst": ["tag:agent"], "ip": ["tcp:22"] }
  ],
  "ssh": [
    { "action": "accept", "src": ["autogroup:member"], "dst": ["tag:agent"], "users": ["autogroup:nonroot", "root"] }
  ]
}

Because no grant lists tag:agent as a source, a compromised or confused agent cannot open your home machine or n8n, even though they share the tailnet. The agent can still use the internet for model APIs and package installs. If you want agents to call model APIs without holding raw API keys, that is what Aperture is for.

3. Your self-hosted n8n#

Your n8n runs on Heroku. Heroku dynos cannot create a network device and restart daily with a fresh disk, so Tailscale there only works in userspace mode, with an ephemeral or OAuth key and no saved state. That is enough for n8n to call private things through Tailscale's proxy: start tailscaled --tun=userspace-networking --outbound-http-proxy-listen=localhost:1055 in the dyno, and point n8n's HTTP Request node, or HTTP_PROXY, at http://localhost:1055.

The cleaner setup is a small VPS with n8n and the Tailscale container side by side:

  1. Run tailscale/tailscale as a sidecar with TS_AUTHKEY, TS_HOSTNAME=n8n and TS_STATE_DIR on a volume, sharing the network with the n8n container.

  2. Serve the editor privately: tailscale serve --bg 5678. The editor is now at https://n8n.<your-tailnet>.ts.net for your devices only, with a valid HTTPS certificate.

  3. Expose only the webhook path publicly: tailscale funnel --bg --set-path=/webhook http://localhost:5678/webhook. Test it once from a phone on mobile data.

  4. Set n8n's WEBHOOK_URL to the public Funnel address so the webhook URLs it shows are correct.

The editor login page is then never on the public internet, which removes the main way self-hosted n8n instances get attacked.

4. Home machines#

  1. Install Tailscale on the home PC or a small always-on box such as a Raspberry Pi.

  2. To reach the whole home network (printer, NAS, router page): sudo tailscale up --advertise-routes=192.168.1.0/24, then approve the route on the Machines page.

  3. To browse through your home connection when travelling: add --advertise-exit-node, approve it, and pick it from the Tailscale menu on your laptop.

  4. Turn off key expiry for that machine so it never drops off while you are away.

5. CI that reaches your servers#

GitHub Actions can join the tailnet for one run and vanish afterwards, with no stored secret, using workload identity federation:

permissions:
  id-token: write
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: tailscale/github-action@v4
        with:
          oauth-client-id: ${{ secrets.TS_CLIENT_ID }}
          audience: ${{ secrets.TS_AUDIENCE }}
          tags: tag:ci
      - run: ssh deploy@agent-box ./deploy.sh

Create the federated identity under Trust credentials in the admin console first, scoped to tag:ci and to your repository. The runner appears as an ephemeral device and is removed soon after the job ends; the grant above lets it reach only port 22 on agent boxes.

Setting it up, step by step#

From nothing to a working tailnet takes about ten minutes. Do the steps in this order.

StepWhereWhat to do
1. Create the tailnetlogin.tailscale.comSign in with Google, GitHub, Microsoft or Apple. The account you pick owns the tailnet, so use the one you will keep.
2. Add your laptopMac App Store, Windows installer, or the Linux scriptInstall, sign in with the same account. It gets a 100.x address and a name.
3. Add your phoneApp Store or Play StoreSame sign-in. Now the laptop and phone can reach each other.
4. Add a serverSSH into itRun the Linux commands below, using an auth key so no browser is needed.
5. Turn on MagicDNS and HTTPSAdmin console, DNS pageMagicDNS is on by default for new tailnets; enable HTTPS certificates if you plan to use Serve.
6. Write your access policyAdmin console, Access controlsReplace the allow-all default with grants like the ones in Setups for you.
7. Tidy upMachines pageDisable key expiry on servers, tag them, and remove old devices.

Linux server#

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up --auth-key=tskey-auth-XXXX --ssh --advertise-tags=tag:server
tailscale ip -4          # its 100.x address
tailscale status         # every peer and how you reach it

macOS and Windows#

Install the app, click Log in, and use the menu bar or system tray icon. The CLI is available too: on a Mac it lives inside the app, and the app's settings offer to install it on your PATH.

Docker sidecar#

services:
  tailscale:
    image: tailscale/tailscale:latest
    hostname: myapp
    environment:
      - TS_AUTHKEY=tskey-auth-XXXX
      - TS_STATE_DIR=/var/lib/tailscale
      - TS_EXTRA_ARGS=--advertise-tags=tag:server
    volumes:
      - ts-state:/var/lib/tailscale
  app:
    image: your/app
    network_mode: service:tailscale
volumes:
  ts-state:

network_mode: service:tailscale puts the app on the sidecar's network, so the app is reachable at myapp on your tailnet. Without the state volume, every restart registers a new device.

Platforms with no network device (Heroku, Cloud Run, some containers)#

tailscaled --tun=userspace-networking \
  --socks5-server=localhost:1055 \
  --outbound-http-proxy-listen=localhost:1055 &
tailscale up --auth-key=tskey-auth-XXXX --hostname=myapp
ALL_PROXY=socks5://localhost:1055/ curl http://home-pc:8080

Apps only reach the tailnet if they send their traffic through that proxy.

Removing it#

sudo tailscale logout signs the device out and expires its key; delete it on the Machines page to remove it from the list. sudo tailscale down only disconnects it until the next up.

Security model and limits#

What Tailscale protects, what it trusts, and where it stops.

QuestionAnswer
Can Tailscale read my traffic?No. Traffic is encrypted end to end with WireGuard between your devices. DERP relays forward packets they cannot decrypt.
What does Tailscale's server know?Your devices, their public keys, names, IP addresses and endpoints, your policy file, and when devices connect. Flow logs, if you turn them on, record who talked to whom, never content.
Where are private keys?Only on each device. They never leave it.
What if Tailscale's control server were compromised?It could in principle hand your devices a rogue public key. Tailnet Lock is the defence: devices then refuse keys you did not sign.
What if my identity provider account is taken over?The attacker can add devices as you. Use strong MFA at the provider, and consider device approval.
What if a device is stolen?Remove it from the Machines page; it loses access at once. Key expiry limits how long a forgotten device stays trusted.
Is the code open?The client daemon, CLI, DERP and the Linux and Android apps are open source (BSD-3). The macOS and Windows GUIs and the control server are closed.
Is it audited?Tailscale publishes its security bulletins and holds SOC 2 Type II; see its security page.

Firewall needs. Everything is outbound: TCP 443 to the control plane and DERP, UDP 41641 for direct WireGuard (any UDP port works), and UDP 3478 for STUN. No inbound ports are needed. The admin console moved to console.tailscale.com in July 2026, so allow-lists that name login.tailscale.com need both.

Limits worth knowing#

  • Speed. Direct connections run near line speed; userspace mode and DERP relays are slower. A relayed link is fine for SSH and dashboards and poor for large transfers.

  • One tailnet per device. A device belongs to one tailnet at a time. Fast user switching swaps between accounts, but not both at once.

  • Plan limits. Personal allows 6 users and is for non-commercial use; a business tailnet should be on Standard or above.

  • No layer 2. Tailscale routes IP packets. Broadcast and multicast discovery (some games, mDNS, Wake-on-LAN) do not cross it; ZeroTier does layer 2.

  • Overlapping subnets. Two subnet routers advertising the same 192.168.1.0/24 conflict. 4via6 routing exists for that case.

  • Funnel is not a CDN. It suits small sites and webhooks, not heavy public traffic; ports are limited to 443, 8443 and 10000.

  • Agents still need their own limits. Tailscale decides which machines an agent box can reach. It does not stop the agent doing harm on the box itself.

Troubleshooting#

Start every problem with these three commands; most answers are in their output.

tailscale status            # is the peer online, and is the link direct or relayed?
tailscale ping <peer>       # does it answer, and through which path?
tailscale netcheck          # what does your network allow (UDP, NAT type, nearest DERP)?
SymptomLikely causeFix
Peer shows offlineTailscale stopped there, or its key expiredOn that device: sudo tailscale up. If expired: sudo tailscale up --force-reauth, then disable key expiry for servers
Can ping, but the app will not connectAccess policy blocks that port, or the app listens only on 127.0.0.1Check grants in Access controls (the policy's tests help); make the app listen on 0.0.0.0 or the 100.x address
Slow transfersLink is relayed through DERPtailscale ping shows "via DERP". Open outbound UDP, or add a peer relay on a box with a good network
Name like home-pc does not resolveMagicDNS off, or the OS is ignoring Tailscale's DNSTurn on MagicDNS; use the full home-pc.<tailnet>.ts.net; on Linux check resolvectl status
SSH asks for a password or is refusedYou are using normal SSH, not Tailscale SSH, or no SSH rule matchesRun tailscale up --ssh on the server and add an ssh rule to the policy
"Machine needs approval"Device approval is onApprove it on the Machines page
Subnet or exit node does nothingRoute not approved, or IP forwarding offApprove the route on the Machines page; enable net.ipv4.ip_forward; on clients, select the exit node or accept routes with --accept-routes (Linux)
Docker container is a new device after every restartNo persistent statePut TS_STATE_DIR on a volume
Corporate network blocks itOnly HTTPS allowed outTailscale falls back to DERP over TCP 443, so it should still work, just slower
Funnel URL does not loadFunnel not allowed in the policy, or HTTPS not enabledEnable HTTPS in the DNS page; add the funnel node attribute; check tailscale funnel status
Another VPN is runningTwo VPNs fighting over routes and DNSTurn one off, or use split tunnelling in the other

If you are still stuck, tailscale bugreport prints an ID you can give to Tailscale support, without sharing your logs publicly.

Cheat sheet#

TaskCommand
Join the tailnet (browser sign-in)sudo tailscale up
Join with a key, as a tagged server with SSHsudo tailscale up --auth-key=tskey-... --advertise-tags=tag:server --ssh
Disconnect / reconnectsudo tailscale down / sudo tailscale up
Sign outsudo tailscale logout
My addressestailscale ip
All peers and how I reach themtailscale status
Test a pathtailscale ping home-pc
Check my networktailscale netcheck
SSH intailscale ssh you@agent-box
Share a local port with my tailnettailscale serve --bg 3000
Share a local port with the internettailscale funnel --bg 3000
See what is servedtailscale serve status
Stop servingtailscale serve reset
Send a filetailscale file cp notes.pdf my-phone:
Receive filessudo tailscale file get ~/Downloads
Offer this machine as an exit nodesudo tailscale set --advertise-exit-node
Use an exit nodesudo tailscale set --exit-node=home-pc
Stop using itsudo tailscale set --exit-node=
Route a home LANsudo tailscale set --advertise-routes=192.168.1.0/24
Accept routes (Linux client)sudo tailscale set --accept-routes
Change a setting without re-joiningsudo tailscale set --<flag>
Renew an expired keysudo tailscale up --force-reauth
Tailnet Lock statustailscale lock status
Update the clientsudo tailscale update
Versiontailscale version

tailscale set changes one setting and keeps the rest. tailscale up with flags resets any flag you leave out, which is the most common way people accidentally turn off SSH or routes.

FAQ#

Is Tailscale a VPN? Yes, but not the kind that hides your location by default. It connects your own devices privately. It only acts like a privacy VPN when you route traffic through an exit node or the Mullvad add-on.

Is the free plan enough for me? For personal, non-commercial use, yes: 6 users, plenty of devices, and nearly every feature in this tab. Paid plans add business use, more users, and controls such as flow logs.

Does it slow my internet down? No. Only traffic to your 100.x devices uses Tailscale unless you pick an exit node. Normal browsing goes out as usual.

Can Tailscale see my files or my traffic? No. Encryption keys stay on your devices. Tailscale sees which devices exist and when they connect, not what they send.

What if Tailscale goes down? Existing connections keep working, because traffic does not pass through its servers. New devices cannot join and policy changes wait until it is back.

Do I still need SSH keys? Not with Tailscale SSH: the tailnet identity is the authentication. Plain SSH over the tailnet still works if you prefer your keys.

Can I use it with Cloudflare Tunnel or another VPN? With Cloudflare Tunnel, yes; they solve different problems. With another full VPN, usually only one can manage routes and DNS at a time.

Does it work behind a strict school, hotel or office network? Usually. If UDP is blocked it falls back to relays over HTTPS port 443, which is slower but works.

Can friends reach one of my machines without joining my tailnet? Yes: share that one device with them by email or link. They see only that device.

Can I put a public website on it? For small sites and webhooks, Funnel works. For anything busy, use a proper host or Cloudflare.

Is it safe to give an AI agent access to my tailnet? Give it a tag and grant it nothing outbound, as in Setups for you. Then it can be reached but cannot reach the rest of your machines.

Can I avoid Tailscale's servers entirely? Yes, with Headscale, at the cost of running it yourself and losing Funnel and a few other features.

Sources#

Checked on November 15, 2026. Tailscale moves fast, so prices and plan limits are the first things to recheck.

How it works: How Tailscale works · How NAT traversal works · NAT traversal improvements · Control and data planes · Encryption · Key management · Node keys · Connection types · DERP servers · Peer relays GA · Throughput · Firewall ports

Addresses and DNS: IP and DNS addresses · MagicDNS · Tailnet name · HTTPS certificates

Access control: Grants syntax · Grants vs ACLs · Policy file · Auth keys · Key expiry · Tailnet Lock · Identity providers

Features: Exit nodes · Subnet routers · App connectors · Mullvad exit nodes · Services GA · Tailscale SSH · Funnel · Serve CLI · Taildrop · Sharing · Ephemeral nodes · Workload identity GA · GitHub Action · Docker parameters · Userspace networking · Logging · Aperture GA

Pricing and company: Pricing · Pricing v4 announcement · Changelog · Open source · Security

Self-hosting and alternatives: Headscale docs · Headscale on GitHub · ZeroTier pricing · NetBird pricing · Twingate pricing · OpenVPN pricing · Cloudflare Zero Trust plans

Where sources disagree#

  • Free trial. The pricing FAQ describes a 14-day trial of the top plan; the page's own summary says a 7-day Premium trial. Treat the length as uncertain until you start one.

  • Old device limits. Some third-party comparison sites still list the pre-April 2026 limits (100 devices and 20 tagged resources on the free plan). The pricing page is the authority.

  • Tagged resources. Third-party sites say every plan allows 50 tagged resources; Tailscale's own pricing table words this differently per plan.

  • Services GA date. The changelog lists January 27, 2026; the blog announces general availability on February 19, 2026.

  • Headscale version. Its docs show 0.29.7; GitHub's latest-release page showed 0.29.6 (October 24) when checked.

  • Plan names in older docs. The Tailnet Lock and SSH session recording pages still use plan names from before Pricing v4 ("Personal and Enterprise"), so their plan notes may be out of date.

  • ZeroTier's free tier. Older reviews say 25 devices; ZeroTier's current page says 10.

  • Headscale and Tailnet Lock. Headscale's feature list does not mention Tailnet Lock, so support is unconfirmed rather than ruled out.