Commit Graph
4922 Commits
Author SHA1 Message Date
Kristoffer Dalby 67ad240d3a db, types: add a nodes column for the ephemeral flag
The migration fills it from the key each node references.
2026-10-28 14:42:23 +00:00
Kristoffer Dalby c403bba5dd db: remove unused RenameNode 2026-10-28 14:42:22 +00:00
Kristoffer Dalby eee5f18401 state: bump duplicate node names loaded from the database 2026-10-28 14:42:22 +00:00
Kristoffer Dalby af41728ecf state: cut a label so its -N suffix fits in 63 bytes 2026-10-28 14:42:22 +00:00
Kristoffer Dalby 267ab2f4db state: treat extra DNS record names as taken node names 2026-10-28 14:42:22 +00:00
Kristoffer Dalby f271fc482d state: save the name NodeStore picks for a new node
The row is committed before the name UPDATE, so a failed UPDATE still
returns the node and registration arms ephemeral cleanup.
2026-10-28 14:42:22 +00:00
Kristoffer Dalby 81ce6cb486 db, api/v1: revoke rather than delete an ephemeral pre-auth key in use
The v1 list now hides revoked keys, so keys revoked through v2 also drop
out of `headscale preauthkeys list`.
2026-10-28 14:42:22 +00:00
Kristoffer Dalby 71d7e9030e hscontrol: arm the ephemeral GC at pre-auth key registration 2026-10-28 14:42:21 +00:00
Kristoffer Dalby 63986bdb1a hscontrol: skip garbage collecting a node that is no longer ephemeral 2026-10-28 14:42:21 +00:00
Kristoffer Dalby 39341d6c4a db: wrap the sequential IP allocator so freed addresses are reused 2026-10-28 14:42:21 +00:00
Kristoffer Dalby 9199cc8a06 state: test that a persist racing a delete cannot resurrect the node
DeleteNode's early persistMu unlock is safe only while node persists
stay UPDATE-only; say so where the lock is declared.
2026-10-28 14:42:21 +00:00
Kristoffer Dalby 5705538f2e noise: stop serving metrics inside the tunnel
Any machine key reached it, bypassing metrics_listen_addr. No client
asks for it.
2026-10-28 14:42:21 +00:00
Kristoffer Dalby 8660eb476f hscontrol: bound client-chosen text in request logs
Clip at the sinks: handler errors, the request line, SSH local_user.
2026-10-28 14:42:06 +00:00
Kristoffer Dalby f320fe10e8 mapper: show an expired peer online, without endpoints or DERP
A connected expired node shows online to its peers. Neither its map
entry nor endpoint, DERP or disco patches carry the paths to reach it.
2026-10-28 14:42:05 +00:00
Kristoffer Dalby 3a9a1a6a4c mapper: trim the Hostinfo sent to peers and to the node itself
As on Tailscale SaaS, the node's own entry keeps Hostname, RequestTags,
RoutableIPs and Services; peers get Hostname, OS, Services without
peerapi-dns-proxy, SSH host keys and AppConnector, and resend on those.
2026-10-28 14:42:05 +00:00
Kristoffer Dalby 9a496270c4 mapper: keep an expired node authorised in its own entry
Tailscale SaaS sends an expired node MachineAuthorized and no Expired
flag; its past KeyExpiry already moves the client to NeedsLogin.
2026-10-28 14:42:04 +00:00
Kristoffer Dalby 389e8d9c9c .github: regenerate integration test workflow 2026-10-28 14:42:04 +00:00
Kristoffer Dalby 15732cc071 state: apply requested tags on a key login that owns them
A requested tag the key's user owns directly, or the key's tags own one
hop away, replaces the key's tags instead of refusing the login.
2026-10-28 14:42:03 +00:00
Kristoffer Dalby 2a96a02d7b state: auto-approve routes after an admin tag change
The new tags may approve announced routes. Approval runs once the policy
manager knows the new owner, as after a registration.
2026-10-28 14:42:03 +00:00
Kristoffer Dalby e481fe49d3 state: drop auto-approved routes when they are withdrawn
Only routes auto-approval alone granted go; approvals from before the
upgrade stay, as do routes an admin set.
2026-10-28 14:42:02 +00:00
Kristoffer Dalby 070fe4c9bd db, types: add a column for auto-approved routes
It starts empty: the current policy cannot tell which earlier approvals
were automatic, so all of them stay as an admin's.
2026-10-28 14:42:02 +00:00
Kristoffer Dalby 3c0f6e8120 state: auto-approve on registration only when the node key rotates
Registration runs the approval itself, once the policy manager knows the
node's owner, for a new node key or a change to the announced routes.
2026-10-28 14:42:01 +00:00
Kristoffer Dalby 822c8779a5 auth: store a client's earlier expiry and expire a tagged node at logout
A client may bring its expiry forward, which turns expiry on for a node
without one, but still cannot push it back. Logout expires tagged nodes
too.
2026-10-28 14:42:00 +00:00
Kristoffer Dalby 309cfbb342 auth, state: answer an expired node's same-key login with NodeKeyExpired
The client then rotates its node key and logs in again, so no key is
judged under the expired one. The machine stays authorised.
2026-10-28 14:41:47 +00:00
Kristoffer Dalby 7625a5ec90 state: forget a node's SSH check approvals when it is expired 2026-10-28 14:41:46 +00:00
Kristoffer Dalby e43ee22b01 state: honour SSH check approvals only while the source keeps its owner 2026-10-28 14:41:02 +00:00
Kristoffer Dalby bf1ff1665b state: let a pre-auth key that is no longer valid only wake its node
A login that keeps its node key leaves a live node's expiry alone, even
with a valid key, and a wake-up is not refused for the tags it requests.
2026-10-28 14:40:49 +00:00
Kristoffer Dalby c1e4c56848 state: serialise registrations presenting an unused single-use key 2026-10-28 14:40:32 +00:00
Kristoffer Dalby a0893b43ff state: auto-approve routes in the NodeStore writer, not on reload
Registration approval runs on the node the writer replaces. A policy
reload approves nothing, and a map request only when its announced
routes change, so neither re-grants a route an admin revoked.
2026-10-28 14:39:41 +00:00
Kristoffer Dalby 69c69d35e2 state: undo a failed re-registration without reverting newer writes 2026-10-28 14:39:40 +00:00
Kristoffer Dalby cff67806cb state: write node rows from the NodeStore under persistMu 2026-10-28 14:39:25 +00:00
Kristoffer Dalby 3cf284917d state: apply map requests only under the node key that authorised them 2026-10-28 14:38:12 +00:00
Kristoffer Dalby b36f9d443f policy: offer exit routes only to viewers whose rules reach the internet
Every destination overlaps /0, so any rule offered a peer's exit routes.
They now need a rule to the internet, the test exit-node visibility
uses; via steering defers them to a regular grant only on that test.
2026-10-28 14:38:11 +00:00
Kristoffer Dalby a188777784 mapper: send a router all of its own routes
Its AllowedIPs held only the primaries the policy let it reach. It now
holds every approved route, and PrimaryRoutes the ones it serves.
2026-10-28 14:38:10 +00:00
Kristoffer Dalby 013ec0b59f policy: reduce merged destination prefixes to the node's own addresses
Adjacent node addresses merge into one prefix, and each node's filter
kept all of it. A prefix made only of node addresses now shrinks to the
node's own; a prefix the policy wrote, or one the node routes, stays.
2026-10-28 14:38:10 +00:00
Kristoffer Dalby 306a3d0f25 api, policy/v2: refuse route prefixes with host bits
Routes are matched as written, so such a prefix never equals the one a
client announces. The approval APIs answer 400 and autoApprovers refuses
it at load and write, with Tailscale's text.
2026-10-28 14:38:09 +00:00
Kristoffer Dalby d648cf6b95 policy, state: log only the routes auto-approval adds 2026-10-28 14:38:08 +00:00
Kristoffer Dalby 7123adc5a9 poll: hold the map session's node as a view 2026-10-28 14:38:07 +00:00
Kristoffer Dalby de7e77cf3d policy/matcher, types: compare a node's routes to matchers as ranges 2026-10-28 14:38:06 +00:00
Kristoffer Dalby 6420fb4600 policy/matcher: binary-search ranges in overlap checks 2026-10-28 14:38:05 +00:00
Kristoffer Dalby 772db35e8f policy: look up approved routes in a set when auto-approving
Avoid scanning the growing approval list for every announcement.
Use the sorted current routes when identifying additions.
2026-10-28 14:38:04 +00:00
Kristoffer Dalby 619b731c18 types, state: reduce a node's routes against the matchers once
Reuse matcher membership and approved subnets across the route list.
Preserve route order and HA co-router visibility.
2026-10-28 14:38:03 +00:00
Kristoffer Dalby 2c76879d0e types: derive subnet and exit routes in one pass
Emit each approved route once, in announcement order.
Skip derivation when no routes are approved.
2026-10-28 14:37:47 +00:00
Kristoffer Dalby 235e6b62c7 state: skip route comparison for writes that leave routes alone
Reuse immutable route inputs when classifying NodeStore writes.
Only derive routes when an announcement or approval changes.
2026-10-28 14:37:37 +00:00
Kristoffer Dalby 04cbb8549d state, policy/v2: stop treating announced-only routes as policy changes
Policy evaluation reads only announced-and-approved routes.
Keep publishing Hostinfo updates without rebuilding peer adjacency.
2026-10-28 14:37:30 +00:00
Kristoffer Dalby 6b99ca0ad1 policy/v2, state: elect primaries by oldest control session
A router that reconnects joins as a standby; one that kept its session
takes its routes back once available again, as on Tailscale. Both the
global and the via election use it, in place of anti-flap stickiness.
2026-10-28 14:37:29 +00:00
Kristoffer Dalby afac928e2e types: add when a node's run of control sessions began 2026-10-28 14:37:28 +00:00
Kristoffer Dalby 97d4310caa state: keep a prefix mapped when no router is available
Peers keep the routes of an offline or expired router, as on Tailscale.
The previous primary keeps the prefix, else the lowest-ID approver;
never one the prober declared unreachable.
2026-10-28 14:37:27 +00:00
Kristoffer Dalby 111ed512fb policy/v2, state: elect via primaries among online, healthy routers
Availability tests expiry itself, not only the online flag.
A health change on a via target now triggers a peer recompute.
2026-10-28 14:37:26 +00:00
Kristoffer Dalby 67b88fe3b2 state: withhold HA probe results only for routers tied to a deferred one 2026-10-28 14:37:25 +00:00